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,
}
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 */ +
) : 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)
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);
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;
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++;
}
}
}
+ 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)