mirror of
https://github.com/bloxstraplabs/bloxstrap.git
synced 2025-04-21 10:01:27 -07:00
Fix singleton mutex handling (for real) (#99)
This commit is contained in:
parent
b61f8730ef
commit
d1b75f6874
@ -230,6 +230,28 @@ namespace Bloxstrap
|
|||||||
dialog.Bootstrapper = bootstrapper;
|
dialog.Bootstrapper = bootstrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// handle roblox singleton mutex for multi-instance launching
|
||||||
|
// note we're handling it here in the main thread and NOT in the
|
||||||
|
// bootstrapper as handling mutexes in async contexts suuuuuucks
|
||||||
|
|
||||||
|
Mutex? singletonMutex = null;
|
||||||
|
|
||||||
|
if (Settings.Prop.MultiInstanceLaunching)
|
||||||
|
{
|
||||||
|
Logger.WriteLine("[App::OnStartup] Creating singleton mutex");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Mutex.OpenExisting("ROBLOX_singletonMutex");
|
||||||
|
Logger.WriteLine("[App::OnStartup] Warning - singleton mutex already exists!");
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// this might be a bit problematic since this mutex will be released when the first launched instance is closed...
|
||||||
|
singletonMutex = new Mutex(true, "ROBLOX_singletonMutex");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Task bootstrapperTask = Task.Run(() => bootstrapper.Run()).ContinueWith(t =>
|
Task bootstrapperTask = Task.Run(() => bootstrapper.Run()).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
Logger.WriteLine("[App::OnStartup] Bootstrapper task has finished");
|
Logger.WriteLine("[App::OnStartup] Bootstrapper task has finished");
|
||||||
@ -250,6 +272,28 @@ namespace Bloxstrap
|
|||||||
|
|
||||||
dialog?.ShowBootstrapper();
|
dialog?.ShowBootstrapper();
|
||||||
bootstrapperTask.Wait();
|
bootstrapperTask.Wait();
|
||||||
|
|
||||||
|
if (singletonMutex is not null)
|
||||||
|
{
|
||||||
|
// we've got ownership of the roblox singleton mutex!
|
||||||
|
// if we stop running, everything will screw up once any more roblox instances launched
|
||||||
|
// also this code is blehhhh im sure theres a better way of checking if the process count changed like this
|
||||||
|
|
||||||
|
int runningProcesses = -1;
|
||||||
|
while (runningProcesses != 0)
|
||||||
|
{
|
||||||
|
int runningProcessesNow = Utilities.GetProcessCount("RobloxPlayerBeta", false);
|
||||||
|
|
||||||
|
if (runningProcessesNow != runningProcesses)
|
||||||
|
{
|
||||||
|
Logger.WriteLine($"[App::OnStartup] We have singleton mutex ownership! Running in background until all Roblox processes are closed ({runningProcessesNow} remaining)...");
|
||||||
|
runningProcesses = runningProcessesNow;
|
||||||
|
}
|
||||||
|
|
||||||
|
// hmm... good idea to do this on main thread?
|
||||||
|
Task.Delay(5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Terminate();
|
Terminate();
|
||||||
|
@ -322,23 +322,6 @@ namespace Bloxstrap
|
|||||||
|
|
||||||
// whether we should wait for roblox to exit to handle stuff in the background or clean up after roblox closes
|
// whether we should wait for roblox to exit to handle stuff in the background or clean up after roblox closes
|
||||||
bool shouldWait = false;
|
bool shouldWait = false;
|
||||||
Mutex? singletonMutex = null;
|
|
||||||
|
|
||||||
if (App.Settings.Prop.MultiInstanceLaunching)
|
|
||||||
{
|
|
||||||
App.Logger.WriteLine("[Bootstrapper::StartRoblox] Creating singleton mutex");
|
|
||||||
// this might be a bit problematic since this mutex will be released when the first launched instance is closed...
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Mutex.OpenExisting("ROBLOX_singletonMutex");
|
|
||||||
App.Logger.WriteLine("[Bootstrapper::StartRoblox] Warning - singleton mutex already exists!");
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
singletonMutex = new Mutex(true, "ROBLOX_singletonMutex");
|
|
||||||
shouldWait = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Process gameClient = Process.Start(Path.Combine(_versionFolder, "RobloxPlayerBeta.exe"), _launchCommandLine);
|
Process gameClient = Process.Start(Path.Combine(_versionFolder, "RobloxPlayerBeta.exe"), _launchCommandLine);
|
||||||
List<Process> autocloseProcesses = new();
|
List<Process> autocloseProcesses = new();
|
||||||
@ -427,27 +410,6 @@ namespace Bloxstrap
|
|||||||
App.Logger.WriteLine($"[Bootstrapper::StartRoblox] Autoclosing process '{process.ProcessName}' (PID {process.Id})");
|
App.Logger.WriteLine($"[Bootstrapper::StartRoblox] Autoclosing process '{process.ProcessName}' (PID {process.Id})");
|
||||||
process.Kill();
|
process.Kill();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (singletonMutex is not null)
|
|
||||||
{
|
|
||||||
// we've got ownership of the roblox singleton mutex!
|
|
||||||
// if we stop running, everything will screw up once any more instances launched
|
|
||||||
// also this code is blehhhh im sure theres a better way of checking if the process count changed like this
|
|
||||||
|
|
||||||
int runningProcesses = -1;
|
|
||||||
while (runningProcesses != 0)
|
|
||||||
{
|
|
||||||
int runningProcessesNow = Utilities.GetProcessCount("RobloxPlayerBeta", false);
|
|
||||||
|
|
||||||
if (runningProcessesNow != runningProcesses)
|
|
||||||
{
|
|
||||||
App.Logger.WriteLine($"[Bootstrapper::StartRoblox] We have singleton mutex ownership! Running in background until all Roblox processes are closed ({runningProcessesNow} remaining)...");
|
|
||||||
runningProcesses = runningProcessesNow;
|
|
||||||
}
|
|
||||||
|
|
||||||
await Task.Delay(5000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CancelInstall()
|
public void CancelInstall()
|
||||||
|
@ -52,8 +52,10 @@ namespace Bloxstrap.Helpers
|
|||||||
string json = await App.HttpClient.GetStringAsync(url);
|
string json = await App.HttpClient.GetStringAsync(url);
|
||||||
return JsonSerializer.Deserialize<T>(json);
|
return JsonSerializer.Deserialize<T>(json);
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
App.Logger.WriteLine($"[Utilities::GetJson<{typeof(T).Name}>] Failed to deserialize JSON!");
|
||||||
|
App.Logger.WriteLine($"[Utilities::GetJson<{typeof(T).Name}>] {ex}");
|
||||||
return default;
|
return default;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user