From: Denys Vlasenko Date: Sat, 16 Feb 2013 13:25:56 +0000 (+0100) Subject: Simple optimization in get_error X-Git-Tag: v4.8~152 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c956ef085f5685b47bd7a66d0bff5abcb0a50484;p=strace Simple optimization in get_error * defs.h: Define SCNO_IN_RANGE(scno) macro. * syscall.c (get_error): Change return type to void. Use SCNO_IN_RANGE instead of SCNO_IS_VALID. (trace_syscall_exiting): Stop checking get_error() return value. Signed-off-by: Denys Vlasenko --- diff --git a/defs.h b/defs.h index f641e0da..3d5f3000 100644 --- a/defs.h +++ b/defs.h @@ -753,5 +753,12 @@ extern unsigned nioctlents; extern const char *const *signalent; extern unsigned nsignals; +/* + * If you need non-NULL sysent[scno].sys_func and sysent[scno].sys_name + */ #define SCNO_IS_VALID(scno) \ - ((unsigned long)(scno) < nsyscalls && sysent[scno].sys_func) + ((unsigned long)(scno) < nsyscalls && sysent[scno].sys_func) + +/* Only ensures that sysent[scno] isn't out of range */ +#define SCNO_IN_RANGE(scno) \ + ((unsigned long)(scno) < nsyscalls) diff --git a/syscall.c b/syscall.c index 6078cb7a..5c0d5808 100644 --- a/syscall.c +++ b/syscall.c @@ -2073,12 +2073,12 @@ is_negated_errno_x32(unsigned long long val) * -1: error, trace_syscall_exiting() should print error indicator * ("????" etc) and bail out. */ -static int +static void get_error(struct tcb *tcp) { int u_error = 0; int check_errno = 1; - if (SCNO_IS_VALID(tcp->scno) + if (SCNO_IN_RANGE(tcp->scno) && (sysent[tcp->scno].sys_flags & SYSCALL_NEVER_FAILS) ) { check_errno = 0; @@ -2304,7 +2304,6 @@ get_error(struct tcb *tcp) } #endif tcp->u_error = u_error; - return 1; } static void @@ -2358,14 +2357,11 @@ trace_syscall_exiting(struct tcb *tcp) res = (get_regs_error ? -1 : get_syscall_result(tcp)); if (res == 1) { syscall_fixup_on_sysexit(tcp); /* never fails */ - res = get_error(tcp); /* returns 1 or -1 */ - if (res == 1) { - if (need_fork_exec_workarounds) - syscall_fixup_for_fork_exec(tcp); - if (filtered(tcp)) { - goto ret; - } - } + get_error(tcp); /* never fails */ + if (need_fork_exec_workarounds) + syscall_fixup_for_fork_exec(tcp); + if (filtered(tcp)) + goto ret; } if (cflag) {