File 0151-erts-Optimize-etp-processes-and-etp-ports.patch of Package erlang

From 068a8127d812e4c481fd2010242905fb0777263e Mon Sep 17 00:00:00 2001
From: Lukas Larsson <lukas@erlang.org>
Date: Mon, 22 May 2017 09:55:22 +0200
Subject: [PATCH] erts: Optimize etp-processes and etp-ports

Not calculating the max, table and invalid addresses
each loop speeds up iterating through the processes list
by about 5x.
---
 erts/etc/unix/etp-commands.in | 32 +++++++++++++++++++++++++-------
 1 file changed, 25 insertions(+), 7 deletions(-)

diff --git a/erts/etc/unix/etp-commands.in b/erts/etc/unix/etp-commands.in
index b7b3a2ae9..1c0c4c07d 100644
--- a/erts/etc/unix/etp-commands.in
+++ b/erts/etc/unix/etp-commands.in
@@ -1,3 +1,4 @@
+# -*- gdb-script -*-
 #
 # %CopyrightBegin%
 # 
@@ -2153,13 +2154,22 @@ define etp-processes
     printf "No processes, since system isn't initialized!\n"
   else
     set $proc_ix = 0
-    while $proc_ix < erts_proc.r.o.max
-      set $proc = (Process *) *((UWord *) &erts_proc.r.o.tab[$proc_ix])
-      if ($proc != ((Process *) 0) && $proc != &erts_invalid_process)
+    set $proc_max_ix = erts_proc.r.o.max
+    set $proc_tab = erts_proc.r.o.tab
+    set $invalid_proc = &erts_invalid_process
+    set $proc_decentile = $proc_max_ix / 10
+    set $proc_printile = $proc_decentile
+    while $proc_ix < $proc_max_ix
+      set $proc = (Process *) *((UWord *) ($proc_tab + $proc_ix))
+      if ($proc != ((Process *) 0) && $proc != $invalid_proc)
         printf "---\n"
         printf "  Pix: %d\n", $proc_ix
         etp-process-info $proc
       end
+      if $proc_ix == $proc_printile
+        printf "--- %d%% (%d / %d) searched\n", $proc_printile / $proc_decentile * 10, $proc_ix, $proc_max_ix
+        set $proc_printile += $proc_decentile
+      end
       set $proc_ix++
     end
     printf "---\n",
@@ -2479,15 +2489,19 @@ document etp-port-info
 %---------------------------------------------------------------------------
 end
 
-
 define etp-ports
   if (!erts_initialized)
     printf "No ports, since system isn't initialized!\n"
   else
     set $port_ix = 0
-    while $port_ix < erts_port.r.o.max
-      set $port = (Port *) *((UWord *) &erts_port.r.o.tab[$port_ix])
-      if ($port != ((Port *) 0) && $port != &erts_invalid_port)
+    set $port_max_ix = erts_port.r.o.max
+    set $port_tab = erts_port.r.o.tab
+    set $invalid_port = &erts_invalid_port
+    set $port_decentile = $port_max_ix / 10
+    set $port_printile = $port_decentile
+    while $port_ix < $port_max_ix
+      set $port = (Port *) *((UWord *) ($port_tab + $port_ix))
+      if ($port != ((Port *) 0) && $port != $invalid_port)
         if (*(((Uint32 *) &(((Port *) $port)->state))) & 0x100) == 0
           # I.e, not free
           printf "---\n"
@@ -2495,6 +2509,10 @@ define etp-ports
           etp-port-info $port
         end
       end
+      if $port_ix == $port_printile
+        printf "--- %d%% (%d / %d) searched\n", $port_printile / $port_decentile * 10, $port_ix, $port_max_ix
+        set $port_printile += $port_decentile
+      end
       set $port_ix++
     end
     printf "---\n",
-- 
2.13.0

openSUSE Build Service is sponsored by