[profiler] Simplify the encoding of monitor events.
[mono.git] / mono / profiler / mprof-report.c
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)