]> granicus.if.org Git - strace/commitdiff
Simple optimization in get_error
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 16 Feb 2013 13:25:56 +0000 (14:25 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 16 Feb 2013 13:25:56 +0000 (14:25 +0100)
* 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 <vda.linux@googlemail.com>
defs.h
syscall.c

diff --git a/defs.h b/defs.h
index f641e0da2894643b7b0fc1fb32072dd3226cd3d6..3d5f3000d0698cff858f5f581989bc0299046e26 100644 (file)
--- 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)
index 6078cb7a3ffdea27303ba3668749e57d1ceb59e8..5c0d5808939c846d432bbf50adbdca4ab8185d06 100644 (file)
--- 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) {