Catch a app_server crash in the debug server. Let the registrar restart the app_server and notify all apps.
This commit is contained in:
@@ -13,6 +13,10 @@
|
||||
#include <Roster.h>
|
||||
|
||||
|
||||
const int32 kMsgAppServerRestarted = 'ASRe';
|
||||
const int32 kMsgRestartAppServer = 'ReAS';
|
||||
|
||||
|
||||
class BRoster::Private {
|
||||
public:
|
||||
Private() : fRoster(const_cast<BRoster*>(be_roster)) {}
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <Locale.h>
|
||||
#include <Path.h>
|
||||
|
||||
#include <MessengerPrivate.h>
|
||||
#include <RegistrarDefs.h>
|
||||
#include <RosterPrivate.h>
|
||||
#include <Server.h>
|
||||
@@ -865,8 +866,10 @@ TeamDebugHandler::_HandlerThread()
|
||||
kill = true;
|
||||
}
|
||||
|
||||
bool isGuiServer = _IsGUIServer();
|
||||
|
||||
// kill the team or hand it over to the debugger
|
||||
thread_id debuggerThread;
|
||||
thread_id debuggerThread = -1;
|
||||
if (kill) {
|
||||
// The team shall be killed. Since that is also the handling in case
|
||||
// an error occurs while handing over the team to the debugger, we do
|
||||
@@ -919,6 +922,22 @@ TeamDebugHandler::_HandlerThread()
|
||||
// remove this handler from the roster and delete it
|
||||
TeamDebugHandlerRoster::Default()->RemoveHandler(fTeam);
|
||||
|
||||
if (isGuiServer) {
|
||||
// wait till debugging is done
|
||||
status_t dummy;
|
||||
wait_for_thread(debuggerThread, &dummy);
|
||||
|
||||
// find the registrar port
|
||||
port_id rosterPort = find_port(BPrivate::get_roster_port_name());
|
||||
port_info info;
|
||||
BMessenger messenger;
|
||||
if (rosterPort >= 0 && get_port_info(rosterPort, &info) == B_OK) {
|
||||
BMessenger::Private(messenger).SetTo(info.team, rosterPort,
|
||||
B_PREFERRED_TOKEN);
|
||||
}
|
||||
messenger.SendMessage(kMsgRestartAppServer);
|
||||
}
|
||||
|
||||
delete this;
|
||||
|
||||
return B_OK;
|
||||
|
||||
@@ -350,6 +350,12 @@ Registrar::_MessageReceived(BMessage *message)
|
||||
}
|
||||
break;
|
||||
|
||||
case kMsgRestartAppServer:
|
||||
{
|
||||
fRoster->HandleRestartAppServer(message);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
BApplication::MessageReceived(message);
|
||||
break;
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <AppMisc.h>
|
||||
#include <MessagePrivate.h>
|
||||
#include <MessengerPrivate.h>
|
||||
#include <RosterPrivate.h>
|
||||
#include <ServerProtocol.h>
|
||||
#include <storage_support.h>
|
||||
|
||||
@@ -1139,6 +1140,45 @@ TRoster::HandleSaveRecentLists(BMessage* request)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
TRoster::HandleRestartAppServer(BMessage* request)
|
||||
{
|
||||
BAutolock _(fLock);
|
||||
|
||||
// TODO: if an app_server is still running, stop it first
|
||||
|
||||
const char* pathString;
|
||||
if (request->FindString("path", &pathString) != B_OK)
|
||||
pathString = "/boot/system/servers";
|
||||
BPath path(pathString);
|
||||
path.Append("app_server");
|
||||
// NOTE: its required at some point that the binary name is "app_server"
|
||||
|
||||
const char **argv = new const char * [2];
|
||||
argv[0] = strdup(path.Path());
|
||||
argv[1] = NULL;
|
||||
|
||||
thread_id threadId = load_image(1, argv, (const char**)environ);
|
||||
int i;
|
||||
for (i = 0; i < 1; i++)
|
||||
delete argv[i];
|
||||
delete [] argv;
|
||||
|
||||
resume_thread(threadId);
|
||||
// give the server some time to create the server port
|
||||
snooze(100000);
|
||||
|
||||
// notify all apps
|
||||
// TODO: whats about ourself?
|
||||
AppInfoListMessagingTargetSet targetSet(fRegisteredApps);
|
||||
if (targetSet.HasNext()) {
|
||||
// send the messages
|
||||
BMessage message(kMsgAppServerRestarted);
|
||||
MessageDeliverer::Default()->DeliverMessage(&message, targetSet);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*! \brief Clears the current list of recent documents
|
||||
*/
|
||||
void
|
||||
|
||||
@@ -59,6 +59,8 @@ public:
|
||||
void HandleLoadRecentLists(BMessage* request);
|
||||
void HandleSaveRecentLists(BMessage* request);
|
||||
|
||||
void HandleRestartAppServer(BMessage* request);
|
||||
|
||||
void ClearRecentDocuments();
|
||||
void ClearRecentFolders();
|
||||
void ClearRecentApps();
|
||||
|
||||
Reference in New Issue
Block a user