]> granicus.if.org Git - strace/commitdiff
Remove TCB_FOLLOWFORK
authorDenys Vlasenko <dvlasenk@redhat.com>
Thu, 23 Jun 2011 19:46:37 +0000 (21:46 +0200)
committerDenys Vlasenko <dvlasenk@redhat.com>
Thu, 23 Jun 2011 19:46:37 +0000 (21:46 +0200)
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>
defs.h
process.c
strace.c

diff --git a/defs.h b/defs.h
index 23ed783208f461fe65cbdfba4816dfa857306a9c..c1c31793056e78ad7c7acfa31c4283cf1d149698 100644 (file)
--- a/defs.h
+++ b/defs.h
@@ -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
index 381f53de30458d27811ea1905fd5f272b1d38027..c16e93f4291b0adb3644513fe71ff4e971eb7b53 100644 (file)
--- a/process.c
+++ b/process.c
@@ -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
index 61d012164cdb6028d748045001109096e70e76fd..c201316a7217c3e32529f728e81ff8513417f265 100644 (file)
--- a/strace.c
+++ b/strace.c
@@ -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];
                                        }