From 5b9f6b5485af065913bc747f5c6a21001b275b7f Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Fri, 28 Aug 2015 21:28:07 +0200 Subject: [PATCH] BRoster: Add launchSuspended option to _LaunchApp(). It allows to launch the app, but keep its main thread suspended instead of automatically resuming it. Also add appThread argument which allows to retrieve the main thread of the launched team. --- headers/os/app/Roster.h | 4 +++- headers/private/app/RosterPrivate.h | 5 +++-- src/kits/app/Roster.cpp | 31 ++++++++++++++++++++--------- src/servers/launch/Job.cpp | 4 ++-- 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/headers/os/app/Roster.h b/headers/os/app/Roster.h index 559544ebf7..69a11a7777 100644 --- a/headers/os/app/Roster.h +++ b/headers/os/app/Roster.h @@ -183,7 +183,9 @@ private: const BList* messageList, int argc, const char* const* args, const char** environment, - team_id* appTeam) const; + team_id* appTeam, + thread_id* appThread, + bool launchSuspended) const; status_t _UpdateActiveApp(team_id team) const; diff --git a/headers/private/app/RosterPrivate.h b/headers/private/app/RosterPrivate.h index 88006f1706..33c2e507c3 100644 --- a/headers/private/app/RosterPrivate.h +++ b/headers/private/app/RosterPrivate.h @@ -30,9 +30,10 @@ class BRoster::Private { status_t Launch(const char* mimeType, const entry_ref* ref, const BList* messageList, int argc, const char* const* args, - const char** environment, team_id* appTeam) + const char** environment, team_id* appTeam, + thread_id* appThread, bool launchSuspended) { return fRoster->_LaunchApp(mimeType, ref, messageList, argc, - args, environment, appTeam); } + args, environment, appTeam, appThread, launchSuspended); } status_t ShutDown(bool reboot, bool confirm, bool synchronous) { return fRoster->_ShutDown(reboot, confirm, synchronous); } diff --git a/src/kits/app/Roster.cpp b/src/kits/app/Roster.cpp index deaef0b4a6..df8ec689d1 100644 --- a/src/kits/app/Roster.cpp +++ b/src/kits/app/Roster.cpp @@ -923,7 +923,7 @@ BRoster::Launch(const char* mimeType, BMessage* initialMessage, messageList.AddItem(initialMessage); return _LaunchApp(mimeType, NULL, &messageList, 0, NULL, - (const char**)environ, _appTeam); + (const char**)environ, _appTeam, NULL, false); } @@ -935,7 +935,7 @@ BRoster::Launch(const char* mimeType, BList* messageList, return B_BAD_VALUE; return _LaunchApp(mimeType, NULL, messageList, 0, NULL, - (const char**)environ, _appTeam); + (const char**)environ, _appTeam, NULL, false); } @@ -947,7 +947,7 @@ BRoster::Launch(const char* mimeType, int argc, const char* const* args, return B_BAD_VALUE; return _LaunchApp(mimeType, NULL, NULL, argc, args, (const char**)environ, - _appTeam); + _appTeam, NULL, false); } @@ -963,7 +963,7 @@ BRoster::Launch(const entry_ref* ref, const BMessage* initialMessage, messageList.AddItem(const_cast(initialMessage)); return _LaunchApp(NULL, ref, &messageList, 0, NULL, (const char**)environ, - _appTeam); + _appTeam, NULL, false); } @@ -975,7 +975,7 @@ BRoster::Launch(const entry_ref* ref, const BList* messageList, return B_BAD_VALUE; return _LaunchApp(NULL, ref, messageList, 0, NULL, (const char**)environ, - appTeam); + appTeam, NULL, false); } @@ -987,7 +987,7 @@ BRoster::Launch(const entry_ref* ref, int argc, const char* const* args, return B_BAD_VALUE; return _LaunchApp(NULL, ref, NULL, argc, args, (const char**)environ, - appTeam); + appTeam, NULL, false); } @@ -1800,6 +1800,10 @@ BRoster::_UpdateActiveApp(team_id team) const \c B_REFS_RECEIVED message, if no arguments are supplied via \a argc and \args. + If \a launchSuspended is set to true, the main thread of the loaded app + (returned in \a appThread) is kept in the suspended state and not + automatically resumed. + \param mimeType MIME type for which the application shall be launched. May be \c NULL. \param ref entry_ref referring to the file for which an application shall @@ -1811,6 +1815,10 @@ BRoster::_UpdateActiveApp(team_id team) const to the launched application. \param appTeam Pointer to a pre-allocated team_id variable to be set to the team ID of the launched application. + \param appThread Pointer to a pre-allocated thread_id variable to + be set to the thread ID of the launched main thread. + \param launchSuspended Indicates whether to keep the app thread in the + suspended state or resume it. \return A status code. \retval B_OK Everything went fine. @@ -1828,7 +1836,8 @@ BRoster::_UpdateActiveApp(team_id team) const status_t BRoster::_LaunchApp(const char* mimeType, const entry_ref* ref, const BList* messageList, int argc, const char* const* args, - const char** environment, team_id* _appTeam) const + const char** environment, team_id* _appTeam, + thread_id* _appThread, bool launchSuspended) const { DBG(OUT("BRoster::_LaunchApp()")); @@ -1856,6 +1865,7 @@ BRoster::_LaunchApp(const char* mimeType, const entry_ref* ref, status_t error = B_OK; ArgVector argVector; team_id team = -1; + thread_id appThread = -1; do { // find the app @@ -1900,7 +1910,7 @@ BRoster::_LaunchApp(const char* mimeType, const entry_ref* ref, if (error == B_OK && !alreadyRunning) { DBG(OUT(" token: %lu\n", appToken)); // load the app image - thread_id appThread = load_image(argVector.Count(), + appThread = load_image(argVector.Count(), const_cast(argVector.Args()), environment); // get the app team @@ -1922,7 +1932,7 @@ BRoster::_LaunchApp(const char* mimeType, const entry_ref* ref, DBG(OUT(" set thread and team: %s (%lx)\n", strerror(error), error)); // resume the launched team - if (error == B_OK) + if (error == B_OK && !launchSuspended) error = resume_thread(appThread); DBG(OUT(" resume thread: %s (%lx)\n", strerror(error), error)); @@ -1983,6 +1993,9 @@ BRoster::_LaunchApp(const char* mimeType, const entry_ref* ref, error = B_ALREADY_RUNNING; else if (_appTeam) *_appTeam = team; + + if (_appThread != NULL) + *_appThread = appThread; } DBG(OUT("BRoster::_LaunchApp() done: %s (%lx)\n", diff --git a/src/servers/launch/Job.cpp b/src/servers/launch/Job.cpp index 5cb9c985b2..374a526dd9 100644 --- a/src/servers/launch/Job.cpp +++ b/src/servers/launch/Job.cpp @@ -352,7 +352,7 @@ Job::Launch() signature << Name(); status_t status = BRoster::Private().Launch(signature.String(), NULL, - NULL, 0, NULL, &environment[0], &fTeam); + NULL, 0, NULL, &environment[0], &fTeam, NULL, false); _SetLaunchStatus(status); return status; } @@ -378,7 +378,7 @@ Job::Launch() // Launch via entry_ref status = BRoster::Private().Launch(NULL, &ref, NULL, count, &args[0], - &environment[0], &fTeam); + &environment[0], &fTeam, NULL, false); _SetLaunchStatus(status); return status; }