From: Alex Rønne Petersen Date: Sun, 18 Jun 2017 03:41:28 +0000 (+0200) Subject: [profiler] Simplify the encoding of monitor events. X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=1520a7aaba6b2bbb8e68b7cc576c4b9588bbfc0a;p=mono.git [profiler] Simplify the encoding of monitor events. The way the event was encoded was highly irregular with respect to the rest of the format. --- diff --git a/mono/profiler/log.c b/mono/profiler/log.c index 817ea4d5235..7a04f7620a5 100644 --- a/mono/profiler/log.c +++ b/mono/profiler/log.c @@ -121,9 +121,7 @@ static gint32 sync_points_ctr, code_buffers_ctr, exception_throws_ctr, exception_clauses_ctr, - monitor_contentions_ctr, - monitor_acquisitions_ctr, - monitor_failures_ctr, + monitor_events_ctr, thread_starts_ctr, thread_ends_ctr, thread_names_ctr, @@ -2113,33 +2111,17 @@ clause_exc (MonoProfiler *prof, MonoMethod *method, int clause_type, int clause_ } static void -monitor_event (MonoProfiler *profiler, MonoObject *object, MonoProfilerMonitorEvent event) +monitor_event (MonoProfiler *profiler, MonoObject *object, MonoProfilerMonitorEvent ev) { - int do_bt = (nocalls && InterlockedRead (&runtime_inited) && !notraces && event == MONO_PROFILER_MONITOR_CONTENTION) ? TYPE_MONITOR_BT : 0; + int do_bt = (nocalls && InterlockedRead (&runtime_inited) && !notraces) ? TYPE_MONITOR_BT : 0; FrameData data; if (do_bt) collect_bt (&data); - gint32 *ctr; - - switch (event) { - case MONO_PROFILER_MONITOR_CONTENTION: - ctr = &monitor_contentions_ctr; - break; - case MONO_PROFILER_MONITOR_DONE: - ctr = &monitor_acquisitions_ctr; - break; - case MONO_PROFILER_MONITOR_FAIL: - ctr = &monitor_failures_ctr; - break; - default: - g_assert_not_reached (); - break; - } - - ENTER_LOG (ctr, logbuffer, + ENTER_LOG (&monitor_events_ctr, logbuffer, EVENT_SIZE /* event */ + + BYTE_SIZE /* ev */ + LEB128_SIZE /* object */ + (do_bt ? ( LEB128_SIZE /* count */ + @@ -2149,7 +2131,8 @@ monitor_event (MonoProfiler *profiler, MonoObject *object, MonoProfilerMonitorEv ) : 0) ); - emit_event (logbuffer, (event << 4) | do_bt | TYPE_MONITOR); + emit_event (logbuffer, do_bt | TYPE_MONITOR); + emit_byte (logbuffer, ev); emit_obj (logbuffer, object); if (do_bt) @@ -4468,9 +4451,7 @@ runtime_initialized (MonoProfiler *profiler) register_counter ("Event: Code buffers", &code_buffers_ctr); register_counter ("Event: Exception throws", &exception_throws_ctr); register_counter ("Event: Exception clauses", &exception_clauses_ctr); - register_counter ("Event: Monitor contentions", &monitor_contentions_ctr); - register_counter ("Event: Monitor acquisitions", &monitor_acquisitions_ctr); - register_counter ("Event: Monitor failures", &monitor_failures_ctr); + register_counter ("Event: Monitor events", &monitor_events_ctr); register_counter ("Event: Thread starts", &thread_starts_ctr); register_counter ("Event: Thread ends", &thread_ends_ctr); register_counter ("Event: Thread names", &thread_names_ctr); diff --git a/mono/profiler/mprof-report.c b/mono/profiler/mprof-report.c index 322eb623b34..eab9d32a00e 100644 --- a/mono/profiler/mprof-report.c +++ b/mono/profiler/mprof-report.c @@ -2736,9 +2736,13 @@ decode_buffer (ProfContext *ctx) break; } case TYPE_MONITOR: { - int event = (*p >> 4) & 0x3; int has_bt = *p & TYPE_MONITOR_BT; + int event; + if (ctx->data_version < 13) + event = (*p >> 4) & 0x3; uint64_t tdiff = decode_uleb128 (p + 1, &p); + if (ctx->data_version > 13) + event = *p++; intptr_t objdiff = decode_sleb128 (p, &p); MethodDesc* sframes [8]; MethodDesc** frames = sframes; @@ -2749,27 +2753,14 @@ decode_buffer (ProfContext *ctx) record = (!thread_filter || thread_filter == thread->thread_id); if (!(time_base >= time_from && time_base < time_to)) record = 0; + MonitorDesc *mdesc = lookup_monitor (OBJ_ADDR (objdiff)); if (event == MONO_PROFILER_MONITOR_CONTENTION) { - MonitorDesc *mdesc = lookup_monitor (OBJ_ADDR (objdiff)); if (record) { monitor_contention++; mdesc->contentions++; thread->monitor = mdesc; thread->contention_start = time_base; } - if (has_bt) { - num_bt = 8; - frames = decode_bt (ctx, sframes, &num_bt, p, &p, ptr_base, &method_base); - if (!frames) { - fprintf (outfile, "Cannot load backtrace\n"); - return 0; - } - if (record) - add_trace_methods (frames, num_bt, &mdesc->traces, 1); - } else { - if (record) - add_trace_thread (thread, &mdesc->traces, 1); - } } else if (event == MONO_PROFILER_MONITOR_FAIL) { if (record) { monitor_failed++; @@ -2795,6 +2786,19 @@ decode_buffer (ProfContext *ctx) } } } + if (has_bt) { + num_bt = 8; + frames = decode_bt (ctx, sframes, &num_bt, p, &p, ptr_base, &method_base); + if (!frames) { + fprintf (outfile, "Cannot load backtrace\n"); + return 0; + } + if (record && event == MONO_PROFILER_MONITOR_CONTENTION) + add_trace_methods (frames, num_bt, &mdesc->traces, 1); + } else { + if (record) + add_trace_thread (thread, &mdesc->traces, 1); + } if (debug) fprintf (outfile, "monitor %s for object %p\n", monitor_ev_name (event), (void*)OBJ_ADDR (objdiff)); if (frames != sframes)