* defs.h [LINUX] (reparent): New function declaration. * process.c [LINUX] (reparent): New function. [LINUX] (internal_fork): Move code that handles parent relationship of new child process to the new function, and call it instead.
Signed-off-by: Wang Chao <[email protected]> --- defs.h | 3 ++ process.c | 79 +++++++++++++++++++++++++++++++----------------------------- 2 files changed, 44 insertions(+), 38 deletions(-) diff --git a/defs.h b/defs.h index fc7e362..0b3ba43 100644 --- a/defs.h +++ b/defs.h @@ -545,6 +545,9 @@ extern int internal_fork(struct tcb *); extern int internal_exec(struct tcb *); extern int internal_wait(struct tcb *, int); extern int internal_exit(struct tcb *); +#ifdef LINUX +extern void reparent(struct tcb *, struct tcb *); +#endif extern const struct ioctlent *ioctl_lookup(long); extern const struct ioctlent *ioctl_next_match(const struct ioctlent *); diff --git a/process.c b/process.c index 8999fc6..3cf6d28 100644 --- a/process.c +++ b/process.c @@ -792,6 +792,46 @@ change_syscall(struct tcb *tcp, int new) } #ifdef LINUX +void reparent(struct tcb *tcp, struct tcb *tcpchild) +{ + /* + * Save the flags used in this call, + * in case we point TCP to our parent below. + */ + int call_flags = tcp->u_arg[ARG_FLAGS]; + if ((tcp->flags & TCB_CLONE_THREAD) && + tcp->parent != NULL) { + /* The parent in this clone is itself a + thread belonging to another process. + There is no meaning to the parentage + relationship of the new child with the + thread, only with the process. We + associate the new thread with our + parent. Since this is done for every + new thread, there will never be a + TCB_CLONE_THREAD process that has + children. */ + --tcp->nchildren; + tcp = tcp->parent; + tcpchild->parent = tcp; + ++tcp->nchildren; + } + if (call_flags & CLONE_THREAD) { + tcpchild->flags |= TCB_CLONE_THREAD; + ++tcp->nclone_threads; + } + if ((call_flags & CLONE_PARENT) && + !(call_flags & CLONE_THREAD)) { + --tcp->nchildren; + tcpchild->parent = NULL; + if (tcp->parent != NULL) { + tcp = tcp->parent; + tcpchild->parent = tcp; + ++tcp->nchildren; + } + } +} + int internal_fork(struct tcb *tcp) { @@ -884,44 +924,7 @@ Process %u resumed (parent %d ready)\n", } #ifdef TCB_CLONE_THREAD - { - /* - * Save the flags used in this call, - * in case we point TCP to our parent below. - */ - int call_flags = tcp->u_arg[ARG_FLAGS]; - if ((tcp->flags & TCB_CLONE_THREAD) && - tcp->parent != NULL) { - /* The parent in this clone is itself a - thread belonging to another process. - There is no meaning to the parentage - relationship of the new child with the - thread, only with the process. We - associate the new thread with our - parent. Since this is done for every - new thread, there will never be a - TCB_CLONE_THREAD process that has - children. */ - --tcp->nchildren; - tcp = tcp->parent; - tcpchild->parent = tcp; - ++tcp->nchildren; - } - if (call_flags & CLONE_THREAD) { - tcpchild->flags |= TCB_CLONE_THREAD; - ++tcp->nclone_threads; - } - if ((call_flags & CLONE_PARENT) && - !(call_flags & CLONE_THREAD)) { - --tcp->nchildren; - tcpchild->parent = NULL; - if (tcp->parent != NULL) { - tcp = tcp->parent; - tcpchild->parent = tcp; - ++tcp->nchildren; - } - } - } + reparent(tcp, tcpchild); #endif /* TCB_CLONE_THREAD */ } return 0; -- 1.6.5.2 ------------------------------------------------------------------------------ Start uncovering the many advantages of virtual appliances and start using them to simplify application deployment and accelerate your shift to cloud computing. http://p.sf.net/sfu/novell-sfdev2dev _______________________________________________ Strace-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/strace-devel
