aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Högberg <[email protected]>2019-03-25 10:43:30 +0100
committerJohn Högberg <[email protected]>2019-03-25 11:49:05 +0100
commit3caa7894a0271a656b752c878e82519bf9bd03b8 (patch)
tree1d1b748bac621ba8c28d4f8873e0245d38a24cc3
parent2f75782815441a161e6157c941b7f482f96bdbcb (diff)
downloadotp-3caa7894a0271a656b752c878e82519bf9bd03b8.tar.gz
otp-3caa7894a0271a656b752c878e82519bf9bd03b8.tar.bz2
otp-3caa7894a0271a656b752c878e82519bf9bd03b8.zip
fixup! seq_trace: Inherit trace token on spawn
-rw-r--r--erts/emulator/beam/erl_process.c89
-rw-r--r--lib/kernel/test/seq_trace_SUITE.erl2
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.