File 2463-fixup-seq_trace-Inherit-trace-token-on-spawn.patch of Package erlang

From 3caa7894a0271a656b752c878e82519bf9bd03b8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?John=20H=C3=B6gberg?= <john@erlang.org>
Date: Mon, 25 Mar 2019 10:43:30 +0100
Subject: [PATCH 3/3] fixup! seq_trace: Inherit trace token on spawn

---
 erts/emulator/beam/erl_process.c    | 89 ++++++++++++++++++++-----------------
 lib/kernel/test/seq_trace_SUITE.erl |  2 +-
 2 files changed, 48 insertions(+), 43 deletions(-)

diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index c19b270725..2f37f86afa 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -11617,6 +11617,45 @@ erl_create_process(Process* parent, /* Parent of process (default group leader).
     p->fp_exception = 0;
 #endif
 
+    /* seq_trace is handled before regular tracing as the latter may touch the
+     * trace token. */
+    if (have_seqtrace(SEQ_TRACE_TOKEN(parent))) {
+        Eterm token;
+        Uint token_sz;
+        Eterm *hp;
+
+        ASSERT(SEQ_TRACE_TOKEN_ARITY(parent) == 5);
+        ASSERT(is_immed(SEQ_TRACE_TOKEN_FLAGS(parent)));
+        ASSERT(is_immed(SEQ_TRACE_TOKEN_SERIAL(parent)));
+        ASSERT(is_immed(SEQ_TRACE_TOKEN_LASTCNT(parent)));
+
+        seq_trace_update_serial(parent);
+
+        token = SEQ_TRACE_TOKEN(parent);
+        token_sz = size_object(token);
+
+        hp = HAlloc(p, token_sz);
+        SEQ_TRACE_TOKEN(p) = copy_struct(token, token_sz, &hp, &MSO(p));
+
+        /* The counters behave the same way on spawning as they do on messages;
+         * we don't inherit our parent's lastcnt. */
+        p->seq_trace_lastcnt = parent->seq_trace_clock;
+        p->seq_trace_clock = parent->seq_trace_clock;
+
+        ASSERT((locks & (ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE)) ==
+               (ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE));
+
+        locks &= ~(ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE);
+        erts_proc_unlock(p, ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE);
+        erts_proc_unlock(parent, ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE);
+
+        seq_trace_output(token, NIL, SEQ_TRACE_SPAWN, p->common.id, parent);
+    } else {
+        SEQ_TRACE_TOKEN(p) = NIL;
+        p->seq_trace_lastcnt = 0;
+        p->seq_trace_clock = 0;
+    }
+
     if (IS_TRACED(parent)) {
 	if (ERTS_TRACE_FLAGS(parent) & F_TRACE_SOS) {
 	    ERTS_TRACE_FLAGS(p) |= (ERTS_TRACE_FLAGS(parent) & TRACEE_FLAGS);
@@ -11638,9 +11677,14 @@ erl_create_process(Process* parent, /* Parent of process (default group leader).
 		}
         }
         if (ARE_TRACE_FLAGS_ON(parent, F_TRACE_PROCS)) {
-            locks &= ~(ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE);
-            erts_proc_unlock(p, ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE);
-            erts_proc_unlock(parent, ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE);
+            /* The locks may already be released if seq_trace is enabled as
+             * well. */
+            if ((locks & (ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE))
+                  == (ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE)) {
+                locks &= ~(ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE);
+                erts_proc_unlock(p, ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE);
+                erts_proc_unlock(parent, ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE);
+            }
             trace_proc_spawn(parent, am_spawn, p->common.id, mod, func, args);
             if (so->flags & SPO_LINK)
                 trace_proc(parent, locks, parent, am_link, p->common.id);
@@ -11660,45 +11704,6 @@ erl_create_process(Process* parent, /* Parent of process (default group leader).
             trace_proc(p, locks, p, am_getting_linked, parent->common.id);
     }
 
-    if (have_seqtrace(SEQ_TRACE_TOKEN(parent))) {
-        Eterm token;
-        Uint token_sz;
-        Eterm *hp;
-
-        ASSERT(SEQ_TRACE_TOKEN_ARITY(parent) == 5);
-        ASSERT(is_immed(SEQ_TRACE_TOKEN_FLAGS(parent)));
-        ASSERT(is_immed(SEQ_TRACE_TOKEN_SERIAL(parent)));
-        ASSERT(is_immed(SEQ_TRACE_TOKEN_LASTCNT(parent)));
-
-        seq_trace_update_serial(parent);
-
-        token = SEQ_TRACE_TOKEN(parent);
-        token_sz = size_object(token);
-
-        hp = HAlloc(p, token_sz);
-        SEQ_TRACE_TOKEN(p) = copy_struct(token, token_sz, &hp, &MSO(p));
-
-        /* The counters behave the same way on spawning as they do on messages;
-         * we don't inherit our parent's lastcnt. */
-        p->seq_trace_lastcnt = parent->seq_trace_clock;
-        p->seq_trace_clock = parent->seq_trace_clock;
-
-        if ((locks & (ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE))
-              == (ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE)) {
-            /* The locks may already be released if ordinary tracing is
-             * enabled. */
-            locks &= ~(ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE);
-            erts_proc_unlock(p, ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE);
-            erts_proc_unlock(parent, ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE);
-        }
-
-        seq_trace_output(token, NIL, SEQ_TRACE_SPAWN, p->common.id, parent);
-    } else {
-        SEQ_TRACE_TOKEN(p) = NIL;
-        p->seq_trace_lastcnt = 0;
-        p->seq_trace_clock = 0;
-    }
-
     /*
      * Check if this process should be initially linked to its parent.
      */
diff --git a/lib/kernel/test/seq_trace_SUITE.erl b/lib/kernel/test/seq_trace_SUITE.erl
index 3256b6e9ad..09b4365c8c 100644
--- a/lib/kernel/test/seq_trace_SUITE.erl
+++ b/lib/kernel/test/seq_trace_SUITE.erl
@@ -994,7 +994,7 @@ stop_tracer(N) when is_integer(N) ->
 	    receive
 		{tracerlog,Data} ->
 		    Data
-	    after 1000 ->
+	    after 5000 ->
 		    {error,timeout}
 	    end
     end.
-- 
2.16.4

openSUSE Build Service is sponsored by