offline_instru_t::~offline_instru_t() { drcovlib_status_t res; size_t size = 8192; char *buf; size_t wrote; do { buf = (char *)dr_global_alloc(size); res = drmodtrack_dump_buf(buf, size, &wrote); if (res == DRCOVLIB_SUCCESS) { ssize_t written = write_file_func(modfile, buf, wrote - 1/*no null*/); DR_ASSERT(written == (ssize_t)strlen(buf)); } dr_global_free(buf, size); size *= 2; } while (res == DRCOVLIB_ERROR_BUF_TOO_SMALL); res = drmodtrack_exit(); DR_ASSERT(res == DRCOVLIB_SUCCESS); }
drcovlib_status_t drcovlib_exit(void) { int count = dr_atomic_add32_return_sum(&drcovlib_init_count, -1); if (count != 0) return DRCOVLIB_SUCCESS; if (!drcov_per_thread) { dump_drcov_data(NULL, global_data); global_data_destroy(global_data); } /* destroy module table */ drmodtrack_exit(); drmgr_unregister_tls_field(tls_idx); drx_exit(); drmgr_exit(); return DRCOVLIB_SUCCESS; }