From 970014a60a12f265ce53f633950043af86cc05ff Mon Sep 17 00:00:00 2001 From: Ryan Leavengood Date: Thu, 14 Dec 2006 05:15:47 +0000 Subject: [PATCH] Improved the shutdown process some more. Systems apps are allowed to ignore the quit request and are simply removed from the list of apps to close if this happens. This is primarily designed for the input_server. I also corrected the MIME type of the debug_server which was causing it to be incorrectly killed at shutdown. I did some other clean-up and removed the code I unintentionally submitted yesterday. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19509 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/registrar/ShutdownProcess.cpp | 42 +++++++++++------------ src/servers/registrar/ShutdownProcess.h | 3 +- src/servers/registrar/TRoster.cpp | 41 +++++++++------------- 3 files changed, 38 insertions(+), 48 deletions(-) diff --git a/src/servers/registrar/ShutdownProcess.cpp b/src/servers/registrar/ShutdownProcess.cpp index 05667514f1..bf3ff20a50 100644 --- a/src/servers/registrar/ShutdownProcess.cpp +++ b/src/servers/registrar/ShutdownProcess.cpp @@ -709,7 +709,7 @@ ShutdownProcess::Init(BMessage *request) // get a list of all applications to shut down and sort them error = fRoster->GetShutdownApps(fUserApps, fSystemApps, fBackgroundApps, - fVitalSystemApps);//, fInputServer); + fVitalSystemApps); if (error != B_OK) { fRoster->RemoveWatcher(this); fRoster->SetShuttingDown(false); @@ -1274,14 +1274,6 @@ ShutdownProcess::_WorkerDoShutdown() // sync sync(); - // notify the input server we are shutting down - /*if (fInputServer.registration_time != 0) { - // The SYSTEM_SHUTTING_DOWN message is defined in InputServerTypes.h - BMessage message(SYSTEM_SHUTTING_DOWN); - SingleMessagingTargetSet target(fInputServer.port, B_PREFERRED_TOKEN); - MessageDeliverer::Default()->DeliverMessage(&message, target); - }*/ - // phase 1: terminate the user apps _SetPhase(USER_APP_TERMINATION_PHASE); _QuitApps(fUserApps, false); @@ -1292,13 +1284,11 @@ ShutdownProcess::_WorkerDoShutdown() // phase 3: terminate the background apps _SetPhase(BACKGROUND_APP_TERMINATION_PHASE); -// TODO: _QuitNonApps() and _QuitBackgroundApps() are called in reverse? -// and don't match the phase - _QuitNonApps(); + _QuitBackgroundApps(); // phase 4: terminate the other processes _SetPhase(OTHER_PROCESSES_TERMINATION_PHASE); - _QuitBackgroundApps(); + _QuitNonApps(); _ScheduleTimeoutEvent(kBackgroundAppQuitTimeout, -1); _WaitForBackgroundApps(); _KillBackgroundApps(); @@ -1341,12 +1331,12 @@ ShutdownProcess::_WorkerDoShutdown() // _QuitApps void -ShutdownProcess::_QuitApps(AppInfoList &list, bool disableCancel) +ShutdownProcess::_QuitApps(AppInfoList &list, bool systemApps) { PRINT(("ShutdownProcess::_QuitApps(%s)\n", - (disableCancel ? "system" : "user"))); + (systemApps ? "system" : "user"))); - if (disableCancel) { + if (systemApps) { _SetShutdownWindowCancelButtonEnabled(false); // check one last time for abort events @@ -1384,7 +1374,7 @@ ShutdownProcess::_QuitApps(AppInfoList &list, bool disableCancel) if (error != B_OK) throw_error(error); - if (!disableCancel && event == ABORT_EVENT) { + if (!systemApps && event == ABORT_EVENT) { PRINT(("ShutdownProcess::_QuitApps(): shutdown cancelled by " "team %ld (-1 => user)\n", team)); @@ -1413,8 +1403,6 @@ ShutdownProcess::_QuitApps(AppInfoList &list, bool disableCancel) return; } - PRINT(("****RJL: Asking %s to quit\n", appName)); - // set window text char buffer[1024]; snprintf(buffer, sizeof(buffer), "Asking \"%s\" to quit.", appName); @@ -1448,10 +1436,10 @@ ShutdownProcess::_QuitApps(AppInfoList &list, bool disableCancel) break; if (event == ABORT_EVENT) { - if (disableCancel) { + if (systemApps) { // If the app requests aborting the shutdown, we don't need // to wait any longer. It has processed the request and - // won't quit by itself. We'll have to kill it. + // won't quit by itself. We ignore this for system apps. if (eventTeam == team) break; } else { @@ -1474,7 +1462,17 @@ ShutdownProcess::_QuitApps(AppInfoList &list, bool disableCancel) } else { // the app is either blocking on a model alert or blocks for another // reason - _QuitBlockingApp(list, team, appName, !disableCancel); + if (!systemApps) + _QuitBlockingApp(list, team, appName, true); + else { + // This is a system app: remove it from the list + BAutolock _(fWorkerLock); + + if (RosterAppInfo *info = list.InfoFor(team)) { + list.RemoveInfo(info); + delete info; + } + } } } } diff --git a/src/servers/registrar/ShutdownProcess.h b/src/servers/registrar/ShutdownProcess.h index 314886ee9f..8e7eee5461 100644 --- a/src/servers/registrar/ShutdownProcess.h +++ b/src/servers/registrar/ShutdownProcess.h @@ -70,7 +70,7 @@ private: status_t _Worker(); void _WorkerDoShutdown(); - void _QuitApps(AppInfoList &list, bool disableCancel); + void _QuitApps(AppInfoList &list, bool systemApps); void _QuitBackgroundApps(); void _WaitForBackgroundApps(); void _KillBackgroundApps(); @@ -97,7 +97,6 @@ private: AppInfoList fSystemApps; AppInfoList fUserApps; AppInfoList fBackgroundApps; - //RosterAppInfo fInputServer; TimeoutEvent *fTimeoutEvent; InternalEventList *fInternalEvents; sem_id fInternalEventSemaphore; diff --git a/src/servers/registrar/TRoster.cpp b/src/servers/registrar/TRoster.cpp index 1a5476bde7..0f11f73b87 100644 --- a/src/servers/registrar/TRoster.cpp +++ b/src/servers/registrar/TRoster.cpp @@ -177,7 +177,6 @@ PRINT(("full registration: %d\n", fullReg)); // check the parameters team_id otherTeam = -1; uint32 token = 0; - RosterAppInfo *otherInfo = NULL; uint32 launchFlags = flags & B_LAUNCH_MASK; @@ -188,12 +187,13 @@ PRINT(("full registration: %d\n", fullReg)); PRINT(("flags: %lx\n", flags)); PRINT(("ref: %ld, %lld, %s\n", ref.device, ref.directory, ref.name)); // check single/exclusive launchers + RosterAppInfo *info = NULL; if ((launchFlags == B_SINGLE_LAUNCH || launchFlags == B_EXCLUSIVE_LAUNCH) - && (((otherInfo = fRegisteredApps.InfoFor(&ref))) - || ((otherInfo = fEarlyPreRegisteredApps.InfoFor(&ref))))) { + && (((info = fRegisteredApps.InfoFor(&ref))) + || ((info = fEarlyPreRegisteredApps.InfoFor(&ref))))) { SET_ERROR(error, B_ALREADY_RUNNING); - otherTeam = otherInfo->team; + otherTeam = info->team; } } else SET_ERROR(error, B_ENTRY_NOT_FOUND); @@ -202,12 +202,13 @@ PRINT(("ref: %ld, %lld, %s\n", ref.device, ref.directory, ref.name)); // signature if (error == B_OK && signature) { // check exclusive launchers + RosterAppInfo *info = NULL; if (launchFlags == B_EXCLUSIVE_LAUNCH - && (((otherInfo = fRegisteredApps.InfoFor(signature))) - || ((otherInfo = fEarlyPreRegisteredApps.InfoFor(signature))))) { + && (((info = fRegisteredApps.InfoFor(signature))) + || ((info = fEarlyPreRegisteredApps.InfoFor(signature))))) { SET_ERROR(error, B_ALREADY_RUNNING); - otherTeam = otherInfo->team; - token = otherInfo->token; + otherTeam = info->team; + token = info->token; } } @@ -276,12 +277,6 @@ PRINT(("added to early pre-regs, token: %lu\n", token)); request->SendReply(&reply); } - if (otherInfo) { - // Activate the other app - printf("Trying to activate other app with team id: %d\n", otherInfo->team); - ActivateApp(otherInfo); - } - FUNCTION_END(); } @@ -1336,7 +1331,6 @@ TRoster::GetShutdownApps(AppInfoList &userApps, AppInfoList &systemApps, // * ourself // * kernel team // * app server - // * input server // * debug server // ourself @@ -1355,16 +1349,9 @@ TRoster::GetShutdownApps(AppInfoList &userApps, AppInfoList &systemApps, vitalSystemApps.insert(portInfo.team); } - // input server - RosterAppInfo *info; -/* = fRegisteredApps.InfoFor("application/x-vnd.Be-input_server"); - if (info) { - inputServer = *info; - vitalSystemApps.insert(info->team); - }*/ - // debug server - info = fRegisteredApps.InfoFor("application/x-vnd.haiku-debug-server"); + RosterAppInfo *info = + fRegisteredApps.InfoFor("application/x-vnd.haiku-debug_server"); if (info) vitalSystemApps.insert(info->team); @@ -1396,6 +1383,12 @@ TRoster::GetShutdownApps(AppInfoList &userApps, AppInfoList &systemApps, break; } + // Special case, we add the input server to vital apps here so it is + // not excluded in the lists above + info = fRegisteredApps.InfoFor("application/x-vnd.Be-input_server"); + if (info) + vitalSystemApps.insert(info->team); + // clean up on error if (error != B_OK) { userApps.MakeEmpty(true);