From d249c293f70010f7a33ee3bc4016cd68416f4636 Mon Sep 17 00:00:00 2001 From: Andrey Vagin Date: Mon, 2 Jul 2012 15:25:00 +0400 Subject: [PATCH] restore: create fake process group leaders Just like for orphaned sessions, create a fake task for orphaned pgids. Signed-off-by: Andrey Vagin Signed-off-by: Pavel Emelyanov --- pstree.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/pstree.c b/pstree.c index e8db46f90..6db300ef9 100644 --- a/pstree.c +++ b/pstree.c @@ -308,6 +308,36 @@ int prepare_pstree_ids(void) /* All other helpers are session leaders for own sessions */ list_splice(&helpers, &root_item->children); + /* Add a process group leader if it is absent */ + for_each_pstree_item(item) { + struct pstree_item *gleader; + + if (!item->pgid || item->pid.virt == item->pgid) + continue; + + for_each_pstree_item(gleader) { + if (gleader->pid.virt == item->pgid) + break; + } + + if (gleader) + continue; + + helper = alloc_pstree_item(); + if (helper == NULL) + return -1; + helper->sid = item->sid; + helper->pgid = item->pgid; + helper->pid.virt = item->pgid; + helper->state = TASK_HELPER; + helper->parent = item; + list_add(&helper->list, &item->children); + task_entries->nr_helpers++; + + pr_info("Add a helper %d for restoring PGID %d\n", + helper->pid.virt, helper->pgid); + } + return 0; }