Mac Installer & MGR: delete BOINC Manager's wxSingleInstanceChecker lock file in case wxSingleInstanceChecker failed to delete it (such as due to a crash.)

This commit is contained in:
Charlie Fenton 2014-09-08 03:59:35 -07:00
parent a14253b069
commit 13aa32baa2
2 changed files with 45 additions and 15 deletions

View File

@ -412,6 +412,8 @@ bool CBOINCGUIApp::OnInit() {
wxSystemOptions::SetOption(wxT("msw.staticbox.optimized-paint"), 0);
#endif
#ifdef __WXMAC__
bool launchedFromLogin = false;
// In wxMac-2.8.7, default wxListCtrl::RefreshItem() does not work
// so use traditional generic implementation.
// This has been fixed in wxMac-2.8.8, but the Mac native implementation:
@ -645,6 +647,36 @@ bool CBOINCGUIApp::OnInit() {
}
#endif
#ifdef __WXMAC__
ProcessSerialNumber psn;
ProcessInfoRec pInfo;
OSStatus err;
memset(&pInfo, 0, sizeof(pInfo));
pInfo.processInfoLength = sizeof( ProcessInfoRec );
err = GetProcessInformation(&m_psnCurrentProcess, &pInfo);
if (!err) {
psn = pInfo.processLauncher;
memset(&pInfo, 0, sizeof(pInfo));
pInfo.processInfoLength = sizeof( ProcessInfoRec );
err = GetProcessInformation(&psn, &pInfo);
}
// Don't open main window if we were started automatically at login
if (pInfo.processSignature == 'lgnw') { // Login Window app
launchedFromLogin = true;
// Prevent a situation where wxSingleInstanceChecker lock file
// from last login auto start (with same pid) was not deleted.
// This path must match that in DetectDuplicateInstance()
wxString lockFilePath = wxString(wxFileName::GetHomeDir() +
"/Library/Application Support/BOINC/" +
wxTheApp->GetAppName() +
'-' + wxGetUserId()
);
boinc_delete_file(lockFilePath.utf8_str());
}
#endif
// Detect if BOINC Manager is already running, if so, bring it into the
// foreground and then exit.
if (DetectDuplicateInstance()) {
@ -693,21 +725,7 @@ bool CBOINCGUIApp::OnInit() {
IdleTrackerAttach();
#ifdef __WXMAC__
ProcessSerialNumber psn;
ProcessInfoRec pInfo;
OSStatus err;
memset(&pInfo, 0, sizeof(pInfo));
pInfo.processInfoLength = sizeof( ProcessInfoRec );
err = GetProcessInformation(&m_psnCurrentProcess, &pInfo);
if (!err) {
psn = pInfo.processLauncher;
memset(&pInfo, 0, sizeof(pInfo));
pInfo.processInfoLength = sizeof( ProcessInfoRec );
err = GetProcessInformation(&psn, &pInfo);
}
// Don't open main window if we were started automatically at login
if (pInfo.processSignature == 'lgnw') { // Login Window app
if (launchedFromLogin) {
m_bGUIVisible = false;
// If the system was just started, we usually get a "Connection

View File

@ -1530,6 +1530,18 @@ OSErr UpdateAllVisibleUsers(long brandID)
}
}
}
// Delete the BOINC Manager's wxSingleInstanceChecker lock file, in case
// it was not deleted (such as due to a crash.)
// Lock file name always has "BOINC Manager" even if the application is
// branded, due to SetAppName(wxT("BOINC Manager")) in CBOINCGUIApp::OnInit().
// This path must match that in CBOINCGUIApp::DetectDuplicateInstance()
sprintf(cmd, "sudo -u \"%s\" rm -f \"/Users/%s/Library/Application Support/BOINC/BOINC Manager-%s\"",
pw->pw_name, pw->pw_name, pw->pw_name);
err = system(cmd);
printf("[2] %s returned %d\n", cmd, err);
fflush(stdout);
} // End for (userIndex=0; userIndex< human_user_names.size(); ++userIndex)
ResynchSystem();