mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 921046 - Implement a retry loop when locking the profile on startup, so that if a previous instance is shutting down, we will just start with a slight delay, r=Mossop r=froydnj
This commit is contained in:
parent
60bc4a7e82
commit
1b6a3b28f8
@ -6,6 +6,8 @@
|
||||
mozilla_StartupTimeline_Event(PROCESS_CREATION, "process")
|
||||
mozilla_StartupTimeline_Event(START, "start")
|
||||
mozilla_StartupTimeline_Event(MAIN, "main")
|
||||
mozilla_StartupTimeline_Event(SELECT_PROFILE, "selectProfile")
|
||||
mozilla_StartupTimeline_Event(AFTER_PROFILE_LOCKED, "afterProfileLocked")
|
||||
// Record the beginning and end of startup crash detection to compare with crash stats to know whether
|
||||
// detection should be improved to start or end sooner.
|
||||
mozilla_StartupTimeline_Event(STARTUP_CRASH_DETECTION_BEGIN, "startupCrashDetectionBegin")
|
||||
|
@ -2037,6 +2037,8 @@ static nsresult
|
||||
SelectProfile(nsIProfileLock* *aResult, nsIToolkitProfileService* aProfileSvc, nsINativeAppSupport* aNative,
|
||||
bool* aStartOffline, nsACString* aProfileName)
|
||||
{
|
||||
StartupTimeline::Record(StartupTimeline::SELECT_PROFILE);
|
||||
|
||||
nsresult rv;
|
||||
ArgResult ar;
|
||||
const char* arg;
|
||||
@ -2311,17 +2313,31 @@ SelectProfile(nsIProfileLock* *aResult, nsIToolkitProfileService* aProfileSvc, n
|
||||
else
|
||||
gDoProfileReset = false;
|
||||
}
|
||||
|
||||
// If you close Firefox and very quickly reopen it, the old Firefox may
|
||||
// still be closing down. Rather than immediately showing the
|
||||
// "Firefox is running but is not responding" message, we spend a few
|
||||
// seconds retrying first.
|
||||
|
||||
static const int kLockRetrySeconds = 5;
|
||||
static const int kLockRetrySleepMS = 100;
|
||||
|
||||
nsCOMPtr<nsIProfileUnlocker> unlocker;
|
||||
rv = profile->Lock(getter_AddRefs(unlocker), aResult);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
// Try to grab the profile name.
|
||||
if (aProfileName) {
|
||||
rv = profile->GetName(*aProfileName);
|
||||
if (NS_FAILED(rv))
|
||||
aProfileName->Truncate(0);
|
||||
const TimeStamp start = TimeStamp::Now();
|
||||
do {
|
||||
rv = profile->Lock(getter_AddRefs(unlocker), aResult);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
StartupTimeline::Record(StartupTimeline::AFTER_PROFILE_LOCKED);
|
||||
// Try to grab the profile name.
|
||||
if (aProfileName) {
|
||||
rv = profile->GetName(*aProfileName);
|
||||
if (NS_FAILED(rv))
|
||||
aProfileName->Truncate(0);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
PR_Sleep(kLockRetrySleepMS);
|
||||
} while (TimeStamp::Now() - start < TimeDuration::FromSeconds(kLockRetrySeconds));
|
||||
|
||||
return ProfileLockedDialog(profile, unlocker, aNative, aResult);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user