120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#include "test/jemalloc_test.h" 220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#ifdef JEMALLOC_PROF 420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansconst char *malloc_conf = 520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "prof:true,prof_active:false,lg_prof_sample:0"; 620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#endif 720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansstatic int 920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansprof_dump_open_intercept(bool propagate_err, const char *filename) 1020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans{ 1120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans int fd; 1220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 1320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans fd = open("/dev/null", O_WRONLY); 1420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_d_ne(fd, -1, "Unexpected open() failure"); 1520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 1620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans return (fd); 1720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans} 1820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 19a00b10735a80f7070714b278c8acdad4473bea69Jason Evansstatic void 20a00b10735a80f7070714b278c8acdad4473bea69Jason Evansset_prof_active(bool active) 21a00b10735a80f7070714b278c8acdad4473bea69Jason Evans{ 22a00b10735a80f7070714b278c8acdad4473bea69Jason Evans 23a00b10735a80f7070714b278c8acdad4473bea69Jason Evans assert_d_eq(mallctl("prof.active", NULL, NULL, &active, sizeof(active)), 24a00b10735a80f7070714b278c8acdad4473bea69Jason Evans 0, "Unexpected mallctl failure"); 25a00b10735a80f7070714b278c8acdad4473bea69Jason Evans} 26a00b10735a80f7070714b278c8acdad4473bea69Jason Evans 27594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evansstatic size_t 28594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evansget_lg_prof_sample(void) 29594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans{ 30594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans size_t lg_prof_sample; 31594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans size_t sz = sizeof(size_t); 32594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans 33594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans assert_d_eq(mallctl("prof.lg_sample", &lg_prof_sample, &sz, NULL, 0), 0, 34594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans "Unexpected mallctl failure while reading profiling sample rate"); 35594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans return (lg_prof_sample); 36594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans} 37594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans 38594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evansstatic void 39594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evansdo_prof_reset(size_t lg_prof_sample) 40594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans{ 41594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans assert_d_eq(mallctl("prof.reset", NULL, NULL, 42594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans &lg_prof_sample, sizeof(size_t)), 0, 43594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans "Unexpected mallctl failure while resetting profile data"); 44594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans assert_zu_eq(lg_prof_sample, get_lg_prof_sample(), 45594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans "Expected profile sample rate change"); 46594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans} 47594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans 4820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason EvansTEST_BEGIN(test_prof_reset_basic) 4920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans{ 5020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans size_t lg_prof_sample_orig, lg_prof_sample, lg_prof_sample_next; 5120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans size_t sz; 5220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans unsigned i; 5320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 54fc12c0b8bc1160530d1e3e641b76d2a4f793136fJason Evans test_skip_if(!config_prof); 55fc12c0b8bc1160530d1e3e641b76d2a4f793136fJason Evans 5620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans sz = sizeof(size_t); 5720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_d_eq(mallctl("opt.lg_prof_sample", &lg_prof_sample_orig, &sz, 5820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans NULL, 0), 0, 5920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "Unexpected mallctl failure while reading profiling sample rate"); 6020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_zu_eq(lg_prof_sample_orig, 0, 6120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "Unexpected profiling sample rate"); 62594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans lg_prof_sample = get_lg_prof_sample(); 6320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_zu_eq(lg_prof_sample_orig, lg_prof_sample, 6420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "Unexpected disagreement between \"opt.lg_prof_sample\" and " 6520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "\"prof.lg_sample\""); 6620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 6720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans /* Test simple resets. */ 6820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans for (i = 0; i < 2; i++) { 6920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_d_eq(mallctl("prof.reset", NULL, NULL, NULL, 0), 0, 7020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "Unexpected mallctl failure while resetting profile data"); 71594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans lg_prof_sample = get_lg_prof_sample(); 7220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_zu_eq(lg_prof_sample_orig, lg_prof_sample, 7320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "Unexpected profile sample rate change"); 7420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans } 7520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 7620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans /* Test resets with prof.lg_sample changes. */ 7720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans lg_prof_sample_next = 1; 7820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans for (i = 0; i < 2; i++) { 79594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans do_prof_reset(lg_prof_sample_next); 80594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans lg_prof_sample = get_lg_prof_sample(); 8120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_zu_eq(lg_prof_sample, lg_prof_sample_next, 8220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "Expected profile sample rate change"); 8320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans lg_prof_sample_next = lg_prof_sample_orig; 8420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans } 8520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 8620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans /* Make sure the test code restored prof.lg_sample. */ 87594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans lg_prof_sample = get_lg_prof_sample(); 8820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_zu_eq(lg_prof_sample_orig, lg_prof_sample, 8920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "Unexpected disagreement between \"opt.lg_prof_sample\" and " 9020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "\"prof.lg_sample\""); 9120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans} 9220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason EvansTEST_END 9320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 9420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansbool prof_dump_header_intercepted = false; 9520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansprof_cnt_t cnt_all_copy = {0, 0, 0, 0}; 9620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansstatic bool 9720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansprof_dump_header_intercept(bool propagate_err, const prof_cnt_t *cnt_all) 9820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans{ 9920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 10020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans prof_dump_header_intercepted = true; 10120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans memcpy(&cnt_all_copy, cnt_all, sizeof(prof_cnt_t)); 10220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 10320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans return (false); 10420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans} 10520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 10620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason EvansTEST_BEGIN(test_prof_reset_cleanup) 10720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans{ 10820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans void *p; 10920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans prof_dump_header_t *prof_dump_header_orig; 11020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 111fc12c0b8bc1160530d1e3e641b76d2a4f793136fJason Evans test_skip_if(!config_prof); 112fc12c0b8bc1160530d1e3e641b76d2a4f793136fJason Evans 113a00b10735a80f7070714b278c8acdad4473bea69Jason Evans set_prof_active(true); 11420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 11520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_zu_eq(prof_bt_count(), 0, "Expected 0 backtraces"); 11620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans p = mallocx(1, 0); 11720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_ptr_not_null(p, "Unexpected mallocx() failure"); 11820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_zu_eq(prof_bt_count(), 1, "Expected 1 backtrace"); 11920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 12020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans prof_dump_header_orig = prof_dump_header; 12120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans prof_dump_header = prof_dump_header_intercept; 12220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_false(prof_dump_header_intercepted, "Unexpected intercept"); 12320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 12420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_d_eq(mallctl("prof.dump", NULL, NULL, NULL, 0), 12520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 0, "Unexpected error while dumping heap profile"); 12620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_true(prof_dump_header_intercepted, "Expected intercept"); 12720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_u64_eq(cnt_all_copy.curobjs, 1, "Expected 1 allocation"); 12820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 12920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_d_eq(mallctl("prof.reset", NULL, NULL, NULL, 0), 0, 13020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "Unexpected error while resetting heap profile data"); 13120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_d_eq(mallctl("prof.dump", NULL, NULL, NULL, 0), 13220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 0, "Unexpected error while dumping heap profile"); 13320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_u64_eq(cnt_all_copy.curobjs, 0, "Expected 0 allocations"); 13420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_zu_eq(prof_bt_count(), 1, "Expected 1 backtrace"); 13520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 13620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans prof_dump_header = prof_dump_header_orig; 13720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 13820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans dallocx(p, 0); 13920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_zu_eq(prof_bt_count(), 0, "Expected 0 backtraces"); 14020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 141a00b10735a80f7070714b278c8acdad4473bea69Jason Evans set_prof_active(false); 14220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans} 14320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason EvansTEST_END 14420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 14520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#define NTHREADS 4 14620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#define NALLOCS_PER_THREAD (1U << 13) 14720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#define OBJ_RING_BUF_COUNT 1531 14820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#define RESET_INTERVAL (1U << 10) 14920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#define DUMP_INTERVAL 3677 15020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansstatic void * 15120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansthd_start(void *varg) 15220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans{ 15320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans unsigned thd_ind = *(unsigned *)varg; 15420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans unsigned i; 15520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans void *objs[OBJ_RING_BUF_COUNT]; 15620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 15720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans memset(objs, 0, sizeof(objs)); 15820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 15920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans for (i = 0; i < NALLOCS_PER_THREAD; i++) { 16020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans if (i % RESET_INTERVAL == 0) { 16120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_d_eq(mallctl("prof.reset", NULL, NULL, NULL, 0), 16220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 0, "Unexpected error while resetting heap profile " 16320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "data"); 16420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans } 16520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 16620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans if (i % DUMP_INTERVAL == 0) { 16720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_d_eq(mallctl("prof.dump", NULL, NULL, NULL, 0), 16820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 0, "Unexpected error while dumping heap profile"); 16920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans } 17020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 17120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans { 17220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans void **pp = &objs[i % OBJ_RING_BUF_COUNT]; 17320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans if (*pp != NULL) { 17420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans dallocx(*pp, 0); 17520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans *pp = NULL; 17620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans } 17720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans *pp = btalloc(1, thd_ind*NALLOCS_PER_THREAD + i); 17820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_ptr_not_null(*pp, 17920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "Unexpected btalloc() failure"); 18020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans } 18120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans } 18220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 18320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans /* Clean up any remaining objects. */ 18420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans for (i = 0; i < OBJ_RING_BUF_COUNT; i++) { 18520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans void **pp = &objs[i % OBJ_RING_BUF_COUNT]; 18620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans if (*pp != NULL) { 18720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans dallocx(*pp, 0); 18820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans *pp = NULL; 18920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans } 19020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans } 19120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 19220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans return (NULL); 19320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans} 19420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 19520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason EvansTEST_BEGIN(test_prof_reset) 19620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans{ 197594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans size_t lg_prof_sample_orig; 19820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans thd_t thds[NTHREADS]; 19920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans unsigned thd_args[NTHREADS]; 20020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans unsigned i; 20120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans size_t bt_count, tdata_count; 20220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 20320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans test_skip_if(!config_prof); 20420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 20520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans bt_count = prof_bt_count(); 20620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_zu_eq(bt_count, 0, 20720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "Unexpected pre-existing tdata structures"); 20820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans tdata_count = prof_tdata_count(); 20920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 210594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans lg_prof_sample_orig = get_lg_prof_sample(); 211594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans do_prof_reset(5); 212594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans 213a00b10735a80f7070714b278c8acdad4473bea69Jason Evans set_prof_active(true); 21420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 21520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans for (i = 0; i < NTHREADS; i++) { 21620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans thd_args[i] = i; 21720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans thd_create(&thds[i], thd_start, (void *)&thd_args[i]); 21820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans } 21920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans for (i = 0; i < NTHREADS; i++) 22020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans thd_join(thds[i], NULL); 22120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 22220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_zu_eq(prof_bt_count(), bt_count, 22320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "Unexpected bactrace count change"); 22420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans assert_zu_eq(prof_tdata_count(), tdata_count, 22520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans "Unexpected remaining tdata structures"); 22620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 227a00b10735a80f7070714b278c8acdad4473bea69Jason Evans set_prof_active(false); 228594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans 229594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans do_prof_reset(lg_prof_sample_orig); 23020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans} 23120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason EvansTEST_END 23220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#undef NTHREADS 23320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#undef NALLOCS_PER_THREAD 23420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#undef OBJ_RING_BUF_COUNT 23520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#undef RESET_INTERVAL 23620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#undef DUMP_INTERVAL 23720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 238a00b10735a80f7070714b278c8acdad4473bea69Jason Evans/* Test sampling at the same allocation site across resets. */ 239a00b10735a80f7070714b278c8acdad4473bea69Jason Evans#define NITER 10 240a00b10735a80f7070714b278c8acdad4473bea69Jason EvansTEST_BEGIN(test_xallocx) 241a00b10735a80f7070714b278c8acdad4473bea69Jason Evans{ 242a00b10735a80f7070714b278c8acdad4473bea69Jason Evans size_t lg_prof_sample_orig; 243a00b10735a80f7070714b278c8acdad4473bea69Jason Evans unsigned i; 244a00b10735a80f7070714b278c8acdad4473bea69Jason Evans void *ptrs[NITER]; 245a00b10735a80f7070714b278c8acdad4473bea69Jason Evans 246a00b10735a80f7070714b278c8acdad4473bea69Jason Evans test_skip_if(!config_prof); 247a00b10735a80f7070714b278c8acdad4473bea69Jason Evans 248a00b10735a80f7070714b278c8acdad4473bea69Jason Evans lg_prof_sample_orig = get_lg_prof_sample(); 249a00b10735a80f7070714b278c8acdad4473bea69Jason Evans set_prof_active(true); 250a00b10735a80f7070714b278c8acdad4473bea69Jason Evans 251a00b10735a80f7070714b278c8acdad4473bea69Jason Evans /* Reset profiling. */ 252a00b10735a80f7070714b278c8acdad4473bea69Jason Evans do_prof_reset(0); 253a00b10735a80f7070714b278c8acdad4473bea69Jason Evans 254a00b10735a80f7070714b278c8acdad4473bea69Jason Evans for (i = 0; i < NITER; i++) { 255a00b10735a80f7070714b278c8acdad4473bea69Jason Evans void *p; 256a00b10735a80f7070714b278c8acdad4473bea69Jason Evans size_t sz, nsz; 257a00b10735a80f7070714b278c8acdad4473bea69Jason Evans 258a00b10735a80f7070714b278c8acdad4473bea69Jason Evans /* Reset profiling. */ 259a00b10735a80f7070714b278c8acdad4473bea69Jason Evans do_prof_reset(0); 260a00b10735a80f7070714b278c8acdad4473bea69Jason Evans 261a00b10735a80f7070714b278c8acdad4473bea69Jason Evans /* Allocate small object (which will be promoted). */ 262a00b10735a80f7070714b278c8acdad4473bea69Jason Evans p = ptrs[i] = mallocx(1, 0); 263a00b10735a80f7070714b278c8acdad4473bea69Jason Evans assert_ptr_not_null(p, "Unexpected mallocx() failure"); 264a00b10735a80f7070714b278c8acdad4473bea69Jason Evans 265a00b10735a80f7070714b278c8acdad4473bea69Jason Evans /* Reset profiling. */ 266a00b10735a80f7070714b278c8acdad4473bea69Jason Evans do_prof_reset(0); 267a00b10735a80f7070714b278c8acdad4473bea69Jason Evans 268a00b10735a80f7070714b278c8acdad4473bea69Jason Evans /* Perform successful xallocx(). */ 269a00b10735a80f7070714b278c8acdad4473bea69Jason Evans sz = sallocx(p, 0); 270a00b10735a80f7070714b278c8acdad4473bea69Jason Evans assert_zu_eq(xallocx(p, sz, 0, 0), sz, 271a00b10735a80f7070714b278c8acdad4473bea69Jason Evans "Unexpected xallocx() failure"); 272a00b10735a80f7070714b278c8acdad4473bea69Jason Evans 273a00b10735a80f7070714b278c8acdad4473bea69Jason Evans /* Perform unsuccessful xallocx(). */ 274a00b10735a80f7070714b278c8acdad4473bea69Jason Evans nsz = nallocx(sz+1, 0); 275a00b10735a80f7070714b278c8acdad4473bea69Jason Evans assert_zu_eq(xallocx(p, nsz, 0, 0), sz, 276a00b10735a80f7070714b278c8acdad4473bea69Jason Evans "Unexpected xallocx() success"); 277a00b10735a80f7070714b278c8acdad4473bea69Jason Evans } 278a00b10735a80f7070714b278c8acdad4473bea69Jason Evans 279a00b10735a80f7070714b278c8acdad4473bea69Jason Evans for (i = 0; i < NITER; i++) { 280a00b10735a80f7070714b278c8acdad4473bea69Jason Evans /* dallocx. */ 281a00b10735a80f7070714b278c8acdad4473bea69Jason Evans dallocx(ptrs[i], 0); 282a00b10735a80f7070714b278c8acdad4473bea69Jason Evans } 283a00b10735a80f7070714b278c8acdad4473bea69Jason Evans 284a00b10735a80f7070714b278c8acdad4473bea69Jason Evans set_prof_active(false); 285a00b10735a80f7070714b278c8acdad4473bea69Jason Evans do_prof_reset(lg_prof_sample_orig); 286a00b10735a80f7070714b278c8acdad4473bea69Jason Evans} 287a00b10735a80f7070714b278c8acdad4473bea69Jason EvansTEST_END 288a00b10735a80f7070714b278c8acdad4473bea69Jason Evans#undef NITER 289a00b10735a80f7070714b278c8acdad4473bea69Jason Evans 29020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansint 29120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansmain(void) 29220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans{ 29320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 29420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans /* Intercept dumping prior to running any tests. */ 29520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans prof_dump_open = prof_dump_open_intercept; 29620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans 29720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans return (test( 29820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans test_prof_reset_basic, 29920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans test_prof_reset_cleanup, 300a00b10735a80f7070714b278c8acdad4473bea69Jason Evans test_prof_reset, 301a00b10735a80f7070714b278c8acdad4473bea69Jason Evans test_xallocx)); 30220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans} 303