diff options
author | Lukas Larsson <[email protected]> | 2016-04-05 11:26:52 +0200 |
---|---|---|
committer | Lukas Larsson <[email protected]> | 2016-04-15 15:08:52 +0200 |
commit | c3e7acb4fe304d117f7361292d36f5d73df3e1c7 (patch) | |
tree | 50777c8c13d2e4eeba302b446c14683821dcd83b /erts/emulator/beam/erl_bif_trace.c | |
parent | a1b352dfc68d501a385240cdb7f45a96cf9e3358 (diff) | |
download | otp-c3e7acb4fe304d117f7361292d36f5d73df3e1c7.tar.gz otp-c3e7acb4fe304d117f7361292d36f5d73df3e1c7.tar.bz2 otp-c3e7acb4fe304d117f7361292d36f5d73df3e1c7.zip |
erts: Make trace_delivered go via sys msg dispatcher again
This is needed as otherwise messages from system_profile
will not be guaranteed to arrive before trace delivered.
Diffstat (limited to 'erts/emulator/beam/erl_bif_trace.c')
-rw-r--r-- | erts/emulator/beam/erl_bif_trace.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/erts/emulator/beam/erl_bif_trace.c b/erts/emulator/beam/erl_bif_trace.c index 7e2fe7fcd4..ff2018aa27 100644 --- a/erts/emulator/beam/erl_bif_trace.c +++ b/erts/emulator/beam/erl_bif_trace.c @@ -2253,25 +2253,32 @@ static void reply_trace_delivered_all(void *vtdarp) { ErtsTraceDeliveredAll *tdarp = (ErtsTraceDeliveredAll *) vtdarp; - ErtsProcLocks rp_locks = 0; if (erts_smp_atomic32_dec_read_nob(&tdarp->refc) == 0) { + Eterm ref_copy, msg; Process *rp = tdarp->proc; Eterm *hp = NULL; - ErlOffHeap *ohp = NULL; - ErtsMessage *mp = NULL; - Eterm ref_copy, msg; - + ErlOffHeap *ohp; +#ifdef ERTS_SMP + ErlHeapFragment *bp; + bp = new_message_buffer(4 + NC_HEAP_SIZE(tdarp->ref)); + hp = &bp->mem[0]; + ohp = &bp->off_heap; +#else + ErtsProcLocks rp_locks = 0; + ErtsMessage *mp; mp = erts_alloc_message_heap( rp, &rp_locks, 4 + NC_HEAP_SIZE(tdarp->ref), &hp, &ohp); +#endif ref_copy = STORE_NC(&hp, ohp, tdarp->ref); msg = TUPLE3(hp, am_trace_delivered, tdarp->target, ref_copy); +#ifdef ERTS_SMP + erts_send_sys_msg_proc(rp->common.id, rp->common.id, msg, bp); +#else erts_queue_message(rp, &rp_locks, mp, msg); - - if (rp_locks) - erts_smp_proc_unlock(rp, rp_locks); +#endif erts_free(ERTS_ALC_T_MISC_AUX_WORK, vtdarp); erts_proc_dec_refc(rp); |