]> granicus.if.org Git - strace/commitdiff
2006-12-20 Dmitry V. Levin <ldv@altlinux.org>
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 20 Dec 2006 22:37:21 +0000 (22:37 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 20 Dec 2006 22:37:21 +0000 (22:37 +0000)
Show system call summary for each personality.
* syscall.c (countv): New call_counts pointers array.
(counts): Convert to macro wrapper around countv.
(call_summary_pers): New function.
(call_summary): Use it for each personality.
Fixes RH#192193.

ChangeLog
syscall.c

index a2d4cce0bda0d8e843af688cb14e4f961b388ccb..58046b1e6305af425379c152b8a868c4399ed4d2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2006-12-20  Dmitry V. Levin <ldv@altlinux.org>
+
+       Show system call summary for each personality.
+       * syscall.c (countv): New call_counts pointers array.
+       (counts): Convert to macro wrapper around countv.
+       (call_summary_pers): New function.
+       (call_summary): Use it for each personality.
+       Fixes RH#192193.
+
 2006-12-12  Dmitry V. Levin <ldv@altlinux.org>
 
        Fix -ff -o behaviour.  Fix piping trace output.
index 05679ca48c830f0e76b27821d667fda7c8ee2b4c..d3884007481c83dce7aacf7113ea58016191aea8 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -197,8 +197,7 @@ const int personality_wordsize[SUPPORTED_PERSONALITIES] = {
 };;
 
 int
-set_personality(personality)
-int personality;
+set_personality(int personality)
 {
        switch (personality) {
        case 0:
@@ -255,7 +254,8 @@ struct call_counts {
        int calls, errors;
 };
 
-static struct call_counts *counts;
+static struct call_counts *countv[SUPPORTED_PERSONALITIES];
+#define counts (countv[current_personality])
 
 static struct timeval shortest = { 1000000, 0 };
 
@@ -2740,9 +2740,8 @@ int n;
        overhead.tv_usec = n % 1000000;
 }
 
-void
-call_summary(outf)
-FILE *outf;
+static void
+call_summary_pers(FILE *outf)
 {
        int i, j;
        int call_cum, error_cum;
@@ -2808,3 +2807,26 @@ FILE *outf;
                call_cum, error_str, "total");
 
 }
+
+void
+call_summary(FILE *outf)
+{
+       int     i, old_pers = current_personality;
+
+       for (i = 0; i < SUPPORTED_PERSONALITIES; ++i)
+       {
+               if (!countv[i])
+                       continue;
+
+               if (current_personality != i)
+                       set_personality(i);
+               if (i)
+                       fprintf(outf,
+                               "System call usage summary for %u bit mode:\n",
+                               personality_wordsize[current_personality] * 8);
+               call_summary_pers(outf);
+       }
+
+       if (old_pers != current_personality)
+               set_personality(old_pers);
+}