[profiler] Simplify the encoding of monitor events.
authorAlex Rønne Petersen <alexrp@xamarin.com>
Sun, 18 Jun 2017 03:41:28 +0000 (05:41 +0200)
committerAlex Rønne Petersen <alexrp@xamarin.com>
Mon, 19 Jun 2017 22:30:45 +0000 (00:30 +0200)
The way the event was encoded was highly irregular with respect to the rest of
the format.

mono/profiler/log.c
mono/profiler/mprof-report.c

index 817ea4d5235dc02665177c77bb1821a18236c964..7a04f7620a5c42de7a950aaa4937c69567a51fc2 100644 (file)
@@ -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);
index 322eb623b341bf7df3b025b51318955ff977a255..eab9d32a00ef87ba154eb8e99cda6c1244d8263b 100644 (file)
@@ -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)