/* test unregistering from inside an event */ static dr_emit_flags_t one_time_bb_event(void *drcontext, void *tag, instrlist_t *bb, bool for_trace, bool translating) { int i; # define STRESS_REGISTER_ITERS 64 # define NAME_SZ 32 char *names[STRESS_REGISTER_ITERS]; drmgr_priority_t pri = { sizeof(pri), }; one_time_exec++; if (!drmgr_unregister_bb_app2app_event(one_time_bb_event)) CHECK(false, "drmgr unregistration failed"); /* stress-test adding and removing */ for (i = 0; i < STRESS_REGISTER_ITERS; i++) { /* force sorted insertion on each add */ pri.priority = STRESS_REGISTER_ITERS - i; names[i] = dr_thread_alloc(drcontext, NAME_SZ); dr_snprintf(names[i], NAME_SZ, "%d", pri.priority); pri.name = names[i]; if (!drmgr_register_bb_app2app_event(one_time_bb_event, &pri)) CHECK(false, "drmgr app2app registration failed"); } /* XXX: drmgr lets us add multiple instances of the same callback * so long as they have different priority names (or use default * priority) -- but on removal it only asks for callback and * removes the first it finds. Thus we cannot free any memory * tied up in a priority until we remove *all* of them. * Normally priorities use string literals, so seems ok. */ for (i = 0; i < STRESS_REGISTER_ITERS; i++) { if (!drmgr_unregister_bb_app2app_event(one_time_bb_event)) CHECK(false, "drmgr app2app unregistration failed"); } for (i = 0; i < STRESS_REGISTER_ITERS; i++) { dr_thread_free(drcontext, names[i], NAME_SZ); } return DR_EMIT_DEFAULT; }
static void event_exit(void) { if (!drmgr_unregister_tls_field(tls_idx) || !drmgr_unregister_thread_init_event(event_thread_init) || !drmgr_unregister_thread_exit_event(event_thread_exit) || !drmgr_unregister_bb_app2app_event(event_bb_app2app) || !drmgr_unregister_bb_insertion_event(event_app_instruction)) DR_ASSERT(false); drx_buf_free(write_buffer); drx_buf_free(trace_buffer); drutil_exit(); drreg_exit(); drmgr_exit(); drx_exit(); }
static void event_exit(void) { dr_log(NULL, DR_LOG_ALL, 1, "Client 'memtrace' num refs seen: " SZFMT "\n", num_refs); if (!dr_raw_tls_cfree(tls_offs, MEMTRACE_TLS_COUNT)) DR_ASSERT(false); if (!drmgr_unregister_tls_field(tls_idx) || !drmgr_unregister_thread_init_event(event_thread_init) || !drmgr_unregister_thread_exit_event(event_thread_exit) || !drmgr_unregister_bb_app2app_event(event_bb_app2app) || !drmgr_unregister_bb_insertion_event(event_app_instruction) || drreg_exit() != DRREG_SUCCESS) DR_ASSERT(false); dr_mutex_destroy(mutex); drutil_exit(); drmgr_exit(); }