[PATCH 2/4] Remove TCB_ATTACH_DONE

Denys Vlasenko dvlasenk at redhat.com
Fri Sep 2 14:15:42 UTC 2011


> Patch 2: Remove TCB_ATTACH_DONE - it is possible to use TCB_STARTUP bit instead.


diff -d -urpN strace.2/defs.h strace.3/defs.h
--- strace.2/defs.h	2011-09-01 16:18:18.000000000 +0200
+++ strace.3/defs.h	2011-09-01 20:17:13.712850718 +0200
@@ -458,9 +458,6 @@ struct tcb {
  */
 #define TCB_INSYSCALL	00004
 #define TCB_ATTACHED	00010	/* Process is not our own child */
-#ifdef LINUX
-#define TCB_ATTACH_DONE	00020	/* PTRACE_ATTACH was done on this tcb->pid */
-#endif
 #define TCB_BPTSET	00100	/* "Breakpoint" set after fork(2) */
 #define TCB_SIGTRAPPED	00200	/* Process wanted to block SIGTRAP */
 #define TCB_REPRINT	01000	/* We should reprint this syscall on exit */
diff -d -urpN strace.2/strace.c strace.3/strace.c
--- strace.2/strace.c	2011-09-02 16:08:29.976955668 +0200
+++ strace.3/strace.c	2011-09-02 16:06:04.360190184 +0200
@@ -444,12 +444,10 @@ startup_attach(void)
 	for (tcbi = 0; tcbi < tcbtabsize; tcbi++) {
 		tcp = tcbtab[tcbi];
 
-		if (!(tcp->flags & TCB_INUSE) || !(tcp->flags & TCB_ATTACHED))
-			continue;
-#ifdef LINUX
-		if (tcp->flags & TCB_ATTACH_DONE)
-			continue;
-#endif
+		/* Is this a process we should attach to, but not yet attached? */
+		if ((tcp->flags & (TCB_INUSE | TCB_ATTACHED | TCB_STARTUP)) != (TCB_INUSE | TCB_ATTACHED))
+			continue; /* no */
+
 		/* Reinitialize the output since it may have changed. */
 		tcp->outf = outf;
 		newoutf(tcp);
@@ -471,8 +469,11 @@ startup_attach(void)
 			if (dir != NULL) {
 				unsigned int ntid = 0, nerr = 0;
 				struct dirent *de;
-				int tid;
+
 				while ((de = readdir(dir)) != NULL) {
+					struct tcb *cur_tcp;
+					int tid;
+
 					if (de->d_fileno == 0)
 						continue;
 					tid = atoi(de->d_name);
@@ -483,23 +484,22 @@ startup_attach(void)
 						++nerr;
 						if (debug)
 							fprintf(stderr, "attach to pid %d failed\n", tid);
+						continue;
 					}
-					else {
-						if (debug)
-							fprintf(stderr, "attach to pid %d succeeded\n", tid);
-						if (tid != tcp->pid) {
-							struct tcb *new_tcp = alloctcb(tid);
-							new_tcp->flags |= TCB_ATTACHED|TCB_ATTACH_DONE|TCB_STARTUP;
-						}
-					}
-					if (interactive) {
-						sigprocmask(SIG_SETMASK, &empty_set, NULL);
-						if (interrupted)
-							goto ret;
-						sigprocmask(SIG_BLOCK, &blocked_set, NULL);
-					}
+					if (debug)
+						fprintf(stderr, "attach to pid %d succeeded\n", tid);
+					cur_tcp = tcp;
+					if (tid != tcp->pid)
+						cur_tcp = alloctcb(tid);
+					cur_tcp->flags |= TCB_ATTACHED | TCB_STARTUP;
 				}
 				closedir(dir);
+				if (interactive) {
+					sigprocmask(SIG_SETMASK, &empty_set, NULL);
+					if (interrupted)
+						goto ret;
+					sigprocmask(SIG_BLOCK, &blocked_set, NULL);
+				}
 				ntid -= nerr;
 				if (ntid == 0) {
 					perror("attach: ptrace(PTRACE_ATTACH, ...)");
@@ -546,14 +546,6 @@ startup_attach(void)
 	} /* for each tcbtab[] */
 
  ret:
-#ifdef LINUX
-	/* TCB_ATTACH_DONE flag is used only in this function */
-	for (tcbi = 0; tcbi < tcbtabsize; tcbi++) {
-		tcp = tcbtab[tcbi];
-		tcp->flags &= ~TCB_ATTACH_DONE;
-	}
-#endif
-
 	if (interactive)
 		sigprocmask(SIG_SETMASK, &empty_set, NULL);
 }






More information about the Strace-devel mailing list