]> granicus.if.org Git - strace/commitdiff
numa.c: use print_array function
authorDmitry V. Levin <ldv@altlinux.org>
Sat, 7 May 2016 23:02:36 +0000 (23:02 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Sat, 7 May 2016 23:37:52 +0000 (23:37 +0000)
* numa.c (print_node): New function.
(print_nodemask): Use it via print_array.
(print_page_array, print_int_array): Remove.
(print_addr): New function.
(print_status, print_int): Change for use as print_array callback.
(SYS_FUNC(move_pages)): Use print_addr, print_int, and print_status
via print_array.
* tests/move_pages.c: Update.
* tests/set_mempolicy.c: Likewise.
* tests/set_mempolicy.test: Likewise.

numa.c
tests/move_pages.c
tests/set_mempolicy.c
tests/set_mempolicy.test

diff --git a/numa.c b/numa.c
index e57fe3f22d2d168aee14a923d1b2368531ec70fe..db2c7fd8591219822316c5655d98b97fd8f33ce6 100644 (file)
--- a/numa.c
+++ b/numa.c
 
 #include "defs.h"
 
+static bool
+print_node(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
+{
+       if (elem_size < sizeof(long)) {
+               tprintf("%#0*x", (int) elem_size * 2 + 2,
+                       * (unsigned int *) elem_buf);
+       } else {
+               tprintf("%#0*lx", (int) elem_size * 2 + 2,
+                       * (unsigned long *) elem_buf);
+       }
+
+       return true;
+}
+
 static void
 print_nodemask(struct tcb *tcp, unsigned long addr, unsigned long maxnodes)
 {
-       const unsigned long nlongs =
+       const unsigned long nmemb =
                (maxnodes + 8 * current_wordsize - 2) / (8 * current_wordsize);
-       const unsigned long size = nlongs * current_wordsize;
-       const unsigned long end = addr + size;
 
-       if (!verbose(tcp) || (exiting(tcp) && syserror(tcp))
-           || end <= addr || size / current_wordsize != nlongs
-           || nlongs < maxnodes / (8 * current_wordsize)) {
+       if (nmemb < maxnodes / (8 * current_wordsize) ||
+           (maxnodes && !nmemb)) {
                printaddr(addr);
                return;
        }
 
-       const unsigned long abbrev_end =
-               (abbrev(tcp) && max_strlen < nlongs) ?
-                       addr + max_strlen * current_wordsize : end;
-       unsigned long cur;
-       for (cur = addr; cur < end; cur += current_wordsize) {
-               if (cur != addr)
-                       tprints(", ");
-
-               unsigned long n;
-               if (umove_ulong_or_printaddr(tcp, cur, &n))
-                       break;
-
-               if (cur == addr)
-                       tprints("[");
-
-               if (cur >= abbrev_end) {
-                       tprints("...");
-                       cur = end;
-                       break;
-               }
-
-               tprintf("%#0*lx", (int) current_wordsize * 2 + 2, n);
-       }
-       if (cur != addr)
-               tprints("]");
+       unsigned long buf;
+       print_array(tcp, addr, nmemb, &buf, current_wordsize,
+                   umoven_or_printaddr, print_node, 0);
 }
 
 SYS_FUNC(migrate_pages)
@@ -129,107 +118,59 @@ SYS_FUNC(get_mempolicy)
 
 #include "xlat/move_pages_flags.h"
 
-static void
-print_page_array(struct tcb *tcp, const unsigned long addr,
-                const unsigned long count)
+static bool
+print_addr(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
 {
-       const unsigned long size = count * current_wordsize;
-       const unsigned long end = addr + size;
+       unsigned long addr;
 
-       if (end <= addr || size / current_wordsize != count) {
-               printaddr(addr);
-               return;
+       if (elem_size < sizeof(long)) {
+               addr = * (unsigned int *) elem_buf;
+       } else {
+               addr = * (unsigned long *) elem_buf;
        }
-       const unsigned long abbrev_end =
-               (abbrev(tcp) && max_strlen < count) ?
-                       addr + max_strlen * current_wordsize : end;
-       unsigned long cur;
-       for (cur = addr; cur < end; cur += current_wordsize) {
-               if (cur != addr)
-                       tprints(", ");
-
-               unsigned long n;
-               if (umove_ulong_or_printaddr(tcp, cur, &n))
-                       break;
-
-               if (cur == addr)
-                       tprints("[");
 
-               if (cur >= abbrev_end) {
-                       tprints("...");
-                       cur = end;
-                       break;
-               }
-               printaddr(n);
-       }
-       if (cur != addr)
-               tprints("]");
+       printaddr(addr);
+
+       return true;
 }
 
-static void
-print_status(const int status)
+static bool
+print_status(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
 {
+       const int status = * (int *) elem_buf;
+
        if (status < 0 && (unsigned) -status < nerrnos)
                tprintf("%s", errnoent[-status]);
        else
                tprintf("%d", status);
-}
 
-static void
-print_int(const int i)
-{
-       tprintf("%d", i);
+       return true;
 }
 
-static void
-print_int_array(struct tcb *tcp, const unsigned long addr,
-               const unsigned long count, void (*func)(int))
+static bool
+print_int(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
 {
-       int i;
-       const unsigned long size = count * sizeof(i);
-       const unsigned long end = addr + size;
-
-       if (end <= addr || size / sizeof(i) != count) {
-               printaddr(addr);
-               return;
-       }
-       const unsigned long abbrev_end =
-               (abbrev(tcp) && max_strlen < count) ?
-                       addr + max_strlen * sizeof(i) : end;
-       unsigned long cur;
-       for (cur = addr; cur < end; cur += sizeof(i)) {
-               if (cur != addr)
-                       tprints(", ");
-
-               if (umove_or_printaddr(tcp, cur, &i))
-                       break;
-
-               if (cur == addr)
-                       tprints("[");
+       tprintf("%d", * (int *) elem_buf);
 
-               if (cur >= abbrev_end) {
-                       tprints("...");
-                       cur = end;
-                       break;
-               }
-               func(i);
-       }
-       if (cur != addr)
-               tprints("]");
+       return true;
 }
 
 SYS_FUNC(move_pages)
 {
        const unsigned long npages = tcp->u_arg[1];
+       long buf;
 
        if (entering(tcp)) {
                tprintf("%d, %lu, ", (int) tcp->u_arg[0], npages);
-               print_page_array(tcp, tcp->u_arg[2], npages);
+               print_array(tcp, tcp->u_arg[2], npages, &buf, current_wordsize,
+                           umoven_or_printaddr, print_addr, 0);
                tprints(", ");
-               print_int_array(tcp, tcp->u_arg[3], npages, print_int);
+               print_array(tcp, tcp->u_arg[3], npages, &buf, sizeof(int),
+                           umoven_or_printaddr, print_int, 0);
                tprints(", ");
        } else {
-               print_int_array(tcp, tcp->u_arg[4], npages, print_status);
+               print_array(tcp, tcp->u_arg[4], npages, &buf, sizeof(int),
+                           umoven_or_printaddr, print_status, 0);
                tprints(", ");
                printflags(move_pages_flags, tcp->u_arg[5], "MPOL_???");
        }
index f9d695f08147d0149623356e77c46c725ddd14f1..d95b7360242acde8622bc00acaee7ee6b378e9a1 100644 (file)
@@ -43,6 +43,10 @@ print_page_array(const void **const pages,
                 const unsigned long count,
                 const unsigned int offset)
 {
+       if (!count) {
+               printf("%s", pages ? "[]" : "NULL");
+               return;
+       }
        if (count <= offset) {
                printf("%p", pages);
                return;
@@ -75,6 +79,10 @@ print_node_array(const int *const nodes,
                 const unsigned long count,
                 const unsigned int offset)
 {
+       if (!count) {
+               printf("%s", nodes ? "[]" : "NULL");
+               return;
+       }
        if (count <= offset) {
                printf("%p", nodes);
                return;
@@ -102,7 +110,7 @@ static void
 print_status_array(const int *const status, const unsigned long count)
 {
        if (!count) {
-               printf("%p", status);
+               printf("%s", status ? "[]" : "NULL");
                return;
        }
        printf("[");
@@ -136,9 +144,14 @@ print_stat_pages(const unsigned long pid, const unsigned long count,
                int saved_errno = errno;
                printf("move_pages(%d, %lu, ", (int) pid, count);
                print_page_array(pages, count, 0);
+               printf(", NULL, ");
+               if (count)
+                       printf("%p", status);
+               else
+                       printf("[]");
                errno = saved_errno;
-               printf(", NULL, %p, MPOL_MF_MOVE) = %ld %s (%m)\n",
-                      status, rc, errno2name());
+               printf(", MPOL_MF_MOVE) = %ld %s (%m)\n",
+                      rc, errno2name());
        } else {
                printf("move_pages(%d, %lu, ", (int) pid, count);
                print_page_array(pages, count, 0);
@@ -166,7 +179,12 @@ print_move_pages(const unsigned long pid,
        print_page_array(pages, count, offset);
        printf(", ");
        print_node_array(nodes, count, offset);
-       printf(", %p, MPOL_MF_MOVE_ALL) = ", status);
+       printf(", ");
+       if (count)
+               printf("%p", status);
+       else
+               printf("[]");
+       printf(", MPOL_MF_MOVE_ALL) = ");
        if (rc) {
                errno = saved_errno;
                printf("%ld %s (%m)\n", rc, errno2name());
index 9c2948909f4f3c436ec755055912169b1ba11229..efc266339d9d0e792721b6f3cc3323ec33ad05f6 100644 (file)
@@ -83,7 +83,10 @@ print_nodes(const unsigned long maxnode, unsigned int offset)
                }
                putc(']', stdout);
        } else {
-               printf("%p", nodemask);
+               if (maxnode)
+                       printf("%p", nodemask);
+               else
+                       printf("[]");
        }
 
        printf(", %lu) = ", maxnode);
index 45d477be7081059306bef740df438fda1e15c30e..0ed6666cb5dd343f71a4177cdca8829cd8892338 100755 (executable)
@@ -3,4 +3,4 @@
 # Check set_mempolicy syscall decoding.
 
 . "${srcdir=.}/init.sh"
-run_strace_match_diff -s3 -a37
+run_strace_match_diff -s3 -a35