Remove TCB_FOLLOWFORK

TCB_FOLLOWFORK flag seems to be unnecessary, because we either follow
all [v]forks/clones or don't follow any, therefore global variable
followfork is an already existing indicator of what we want to do.
This patch drops all setting/clearing of TCB_FOLLOWFORK bit,
and replaces checks for this bit by checks of followfork value.
In internal_fork, check is moved to in front of if(), since
the check is needed on both "entering" and "exiting" branch.

* defs.h: Remove TCB_FOLLOWFORK define.
* process.c (internal_fork): Do not set/clear TCB_FOLLOWFORK,
  test followfork instead of tcp->flags & TCB_FOLLOWFORK.
  (handle_new_child): Likewise.
* strace.c (startup_attach): Likewise.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
This commit is contained in:
Denys Vlasenko 2011-06-23 21:46:37 +02:00
parent 1c706b3809
commit 65d7c4d66c
3 changed files with 9 additions and 16 deletions

1
defs.h
View File

@ -401,7 +401,6 @@ struct tcb {
#define TCB_SUSPENDED 00040 /* Process can not be allowed to resume just now */
#define TCB_BPTSET 00100 /* "Breakpoint" set after fork(2) */
#define TCB_SIGTRAPPED 00200 /* Process wanted to block SIGTRAP */
#define TCB_FOLLOWFORK 00400 /* Process should have forks followed */
#define TCB_REPRINT 01000 /* We should reprint this syscall on exit */
#define TCB_FILTERED 02000 /* This system call has been filtered out */
#ifdef LINUX

View File

@ -495,7 +495,6 @@ internal_fork(struct tcb *tcp)
return 0;
if (!followfork)
return 0;
tcp->flags |= TCB_FOLLOWFORK;
if (syserror(tcp))
return 0;
tcpchild = alloctcb(tcp->u_rval);
@ -796,7 +795,6 @@ handle_new_child(struct tcb *tcp, int pid, int bpt)
else
#endif /* CLONE_PTRACE */
{
tcp->flags |= TCB_FOLLOWFORK;
tcpchild = alloctcb(pid);
}
@ -891,10 +889,10 @@ internal_fork(struct tcb *tcp)
== (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
return 0;
if (!followfork)
return 0;
if (entering(tcp)) {
tcp->flags &= ~TCB_FOLLOWFORK;
if (!followfork)
return 0;
/*
* In occasion of using PTRACE_O_TRACECLONE, we won't see the
* new child if clone is called with flag CLONE_UNTRACED, so
@ -903,15 +901,11 @@ internal_fork(struct tcb *tcp)
if ((sysent[tcp->scno].sys_func == sys_clone) &&
(tcp->u_arg[ARG_FLAGS] & CLONE_UNTRACED))
return 0;
tcp->flags |= TCB_FOLLOWFORK;
setbpt(tcp);
} else {
int pid;
int bpt;
if (!(tcp->flags & TCB_FOLLOWFORK))
return 0;
bpt = tcp->flags & TCB_BPTSET;
if (syserror(tcp)) {
@ -943,17 +937,18 @@ internal_fork(struct tcb *tcp)
dont_follow = 1;
}
#endif
if (!followfork)
return 0;
if (entering(tcp)) {
if (!followfork || dont_follow)
if (dont_follow)
return 0;
tcp->flags |= TCB_FOLLOWFORK;
setbpt(tcp);
}
else {
int bpt = tcp->flags & TCB_BPTSET;
if (!(tcp->flags & TCB_FOLLOWFORK))
return 0;
if (bpt)
clearbpt(tcp);
@ -961,7 +956,6 @@ internal_fork(struct tcb *tcp)
return 0;
pid = tcp->u_rval;
tcp->flags |= TCB_FOLLOWFORK;
tcpchild = alloctcb(pid);
#ifdef SUNOS4
#ifdef oldway

View File

@ -475,7 +475,7 @@ startup_attach(void)
++nerr;
else if (tid != tcbtab[tcbi]->pid) {
tcp = alloctcb(tid);
tcp->flags |= TCB_ATTACHED|TCB_CLONE_THREAD|TCB_FOLLOWFORK;
tcp->flags |= TCB_ATTACHED|TCB_CLONE_THREAD;
tcbtab[tcbi]->nclone_threads++;
tcp->parent = tcbtab[tcbi];
}