static const char fwk_user_app_dir[] = FWK_USER_APP_DIR;
static char *homeappdir;
+/****************** manages pids **********************/
+
+/* get a runner by its pid */
+static struct apprun *runner_of_pid(pid_t pid)
+{
+ int i;
+ struct apprun *result;
+
+ for (i = 0 ; i < ROOT_RUNNERS_COUNT ; i++)
+ for (result = runners_by_pgid[i] ; result != NULL ; result = result->next_by_pgid)
+ if (result->pids[0] == pid || result->pids[1] == pid)
+ return result;
+ return NULL;
+}
+
/****************** manages pgids **********************/
/* get a runner by its pgid */
/* insert a runner for its pgid */
static void pgid_insert(struct apprun *runner)
{
- struct apprun **prev = &runners_by_runid[(int)(runner->pids[0] & (ROOT_RUNNERS_COUNT - 1))];
+ struct apprun **prev = &runners_by_pgid[(int)(runner->pids[0] & (ROOT_RUNNERS_COUNT - 1))];
runner->next_by_pgid = *prev;
*prev = runner;
}
/* remove a runner for its pgid */
static void pgid_remove(struct apprun *runner)
{
- struct apprun **prev = &runners_by_runid[(int)(runner->pids[0] & (ROOT_RUNNERS_COUNT - 1))];
- runner->next_by_pgid = *prev;
- *prev = runner;
-}
-
-/****************** manages pids **********************/
-
-/* get a runner by its pid */
-static struct apprun *runner_of_pid(pid_t pid)
-{
- /* try avoiding system call */
- struct apprun *result = runner_of_pgid(pid);
- if (result == NULL) {
- result = runner_of_pgid(getpgid(pid));
- if (result && result->pids[1] != pid)
- result = NULL;
+ struct apprun **prev = &runners_by_pgid[(int)(runner->pids[0] & (ROOT_RUNNERS_COUNT - 1))];
+ while (*prev) {
+ if (*prev == runner) {
+ *prev = runner->next_by_pgid;
+ break;
+ }
+ prev = &(*prev)->next_by_pgid;
}
- return result;
}
/****************** manages runners (by runid) **********************/
{
struct apprun *runner;
- runner = runner_of_pgid(info->si_pid);
+ runner = runner_of_pid(info->si_pid);
if (!runner)
return;
case CLD_TRAPPED:
runner->state = as_terminated;
pgid_remove(runner);
+ killpg(runner->pids[0], SIGKILL);
break;
case CLD_STOPPED:
sigset_t saved, blocked;
assert(launch_mode_is_valid(mode));
+ assert(mode == mode_local || uri != NULL);
+ assert(uri == NULL || *uri == NULL);
/* prepare to launch */
rc = fill_launch_desc(appli, mode, &desc);