/* Called with lock held */ static ucs_status_t ucm_mmap_test(int events) { static int installed_events = 0; ucm_event_handler_t handler; int out_events; void *p; if (ucs_test_all_flags(installed_events, events)) { /* All requested events are already installed */ return UCS_OK; } /* Install a temporary event handler which will add the supported event * type to out_events bitmap. */ handler.events = events; handler.priority = -1; handler.cb = ucm_mmap_event_test_callback; handler.arg = &out_events; out_events = 0; ucm_event_handler_add(&handler); if (events & (UCM_EVENT_MMAP|UCM_EVENT_MUNMAP|UCM_EVENT_MREMAP)) { p = mmap(NULL, 0, 0, 0, -1 ,0); p = mremap(p, 0, 0, 0); munmap(p, 0); } if (events & (UCM_EVENT_SHMAT|UCM_EVENT_SHMDT)) { p = shmat(0, NULL, 0); shmdt(p); } if (events & UCM_EVENT_SBRK) { (void)sbrk(0); } ucm_event_handler_remove(&handler); /* TODO check address / stop all threads */ installed_events |= out_events; ucm_debug("mmap test: got 0x%x out of 0x%x, total: 0x%x", out_events, events, installed_events); /* Return success iff we caught all wanted events */ if (!ucs_test_all_flags(out_events, events)) { return UCS_ERR_UNSUPPORTED; } return UCS_OK; }
/* Has to be called with install_mutex held */ static void ucm_malloc_test(int events) { static const size_t small_alloc_count = 128; static const size_t small_alloc_size = 4096; static const size_t large_alloc_size = 4 * UCS_MBYTE; ucm_event_handler_t handler; void *p[small_alloc_count]; int out_events; int i; ucm_debug("testing malloc..."); /* Install a temporary event handler which will add the supported event * type to out_events bitmap. */ handler.events = events; handler.priority = -1; handler.cb = ucm_mmap_event_test_callback; handler.arg = &out_events; out_events = 0; ucm_event_handler_add(&handler); /* Trigger both small and large allocations * TODO check address / stop all threads */ for (i = 0; i < small_alloc_count; ++i) { p[i] = malloc(small_alloc_size); } for (i = 0; i < small_alloc_count; ++i) { free(p[i]); } p[0] = malloc(large_alloc_size); p[0] = realloc(p[0], large_alloc_size * 2); free(p[0]); if (ucm_malloc_hook_state.hook_called) { ucm_dlmalloc_trim(0); } ucm_event_handler_remove(&handler); ucm_malloc_hook_state.installed_events |= out_events; ucm_debug("malloc test: have 0x%x out of 0x%x, hooks were%s called", ucm_malloc_hook_state.installed_events, events, ucm_malloc_hook_state.hook_called ? "" : " not"); }