Don't perform TCB_WAITEXECVE wait if not needed.

* defs.h (ptrace_setoptions_for_all): Expose this variable.
* strace.c (ptrace_setoptions_for_all): Remove "static".
* process.c (internal_exec): Don't set TCB_WAITEXECVE bit
if we know that post-execve SIGTRAP is not going to happen.
This commit is contained in:
Denys Vlasenko 2011-05-24 20:30:24 +02:00
parent 3454e4b463
commit f8bc0655a0
3 changed files with 8 additions and 5 deletions

1
defs.h
View File

@ -505,6 +505,7 @@ extern struct tcb **tcbtab;
extern int *qual_flags;
extern int debug, followfork;
extern unsigned int ptrace_setoptions_followfork;
extern unsigned int ptrace_setoptions_for_all;
extern int dtime, xflag, qflag;
extern cflag_t cflag;
extern int acolumn;

View File

@ -1775,8 +1775,7 @@ struct tcb *tcp;
#endif
int
internal_exec(tcp)
struct tcb *tcp;
internal_exec(struct tcb *tcp)
{
#ifdef SUNOS4
if (exiting(tcp) && !syserror(tcp) && followfork)
@ -1785,8 +1784,11 @@ struct tcb *tcp;
#if defined LINUX && defined TCB_WAITEXECVE
if (exiting(tcp) && syserror(tcp))
tcp->flags &= ~TCB_WAITEXECVE;
else
tcp->flags |= TCB_WAITEXECVE;
else {
/* Maybe we have post-execve SIGTRAP suppressed? */
if (!(ptrace_setoptions_for_all & PTRACE_O_TRACEEXEC))
tcp->flags |= TCB_WAITEXECVE; /* no */
}
#endif /* LINUX && TCB_WAITEXECVE */
return 0;
}

View File

@ -85,7 +85,7 @@ extern char *optarg;
int debug = 0, followfork = 0;
unsigned int ptrace_setoptions_followfork = 0;
static unsigned int ptrace_setoptions_for_all = 0;
unsigned int ptrace_setoptions_for_all = 0;
/* Which WSTOPSIG(status) value marks syscall traps? */
static unsigned int SYSCALLTRAP = SIGTRAP;
int dtime = 0, xflag = 0, qflag = 0;