summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Goldblatt <davidgoldblatt@fb.com>2018-04-26 22:46:08 (GMT)
committerDavid Goldblatt <davidtgoldblatt@gmail.com>2018-05-18 18:43:03 (GMT)
commit126e9a84a5a793fb0d53ca4656a91889b3ae40e8 (patch)
treeef1e8c2f6b85a923f6f5736757b028c74b774459
parentcb0707c0fc948875876b93514938646455650e2b (diff)
downloadjemalloc-126e9a84a5a793fb0d53ca4656a91889b3ae40e8.zip
jemalloc-126e9a84a5a793fb0d53ca4656a91889b3ae40e8.tar.gz
jemalloc-126e9a84a5a793fb0d53ca4656a91889b3ae40e8.tar.bz2
Hooks: move the "extra" pointer into the hook_t itself.
This simplifies the mallctl call to install a hook, which should only take a single argument.
-rw-r--r--include/jemalloc/internal/hook.h3
-rw-r--r--src/hook.c14
-rw-r--r--test/unit/hook.c45
3 files changed, 31 insertions, 31 deletions
diff --git a/include/jemalloc/internal/hook.h b/include/jemalloc/internal/hook.h
index fc61e9b..678c601 100644
--- a/include/jemalloc/internal/hook.h
+++ b/include/jemalloc/internal/hook.h
@@ -103,6 +103,7 @@ struct hooks_s {
hook_alloc alloc_hook;
hook_dalloc dalloc_hook;
hook_expand expand_hook;
+ void *extra;
};
/*
@@ -142,7 +143,7 @@ struct hook_ralloc_args_s {
*/
bool hook_boot();
-void *hook_install(tsdn_t *tsdn, hooks_t *hooks, void *extra);
+void *hook_install(tsdn_t *tsdn, hooks_t *hooks);
/* Uninstalls the hook with the handle previously returned from hook_install. */
void hook_remove(tsdn_t *tsdn, void *opaque);
diff --git a/src/hook.c b/src/hook.c
index 5c6818f..564c2a0 100644
--- a/src/hook.c
+++ b/src/hook.c
@@ -9,7 +9,6 @@
typedef struct hooks_internal_s hooks_internal_t;
struct hooks_internal_s {
hooks_t hooks;
- void *extra;
bool in_use;
};
@@ -27,7 +26,7 @@ hook_boot() {
}
static void *
-hook_install_locked(hooks_t *to_install, void *extra) {
+hook_install_locked(hooks_t *to_install) {
hooks_internal_t hooks_internal;
for (int i = 0; i < HOOKS_MAX; i++) {
bool success = seq_try_load_hooks(&hooks_internal, &hooks[i]);
@@ -35,7 +34,6 @@ hook_install_locked(hooks_t *to_install, void *extra) {
assert(success);
if (!hooks_internal.in_use) {
hooks_internal.hooks = *to_install;
- hooks_internal.extra = extra;
hooks_internal.in_use = true;
seq_store_hooks(&hooks[i], &hooks_internal);
atomic_store_u(&nhooks,
@@ -48,9 +46,9 @@ hook_install_locked(hooks_t *to_install, void *extra) {
}
void *
-hook_install(tsdn_t *tsdn, hooks_t *to_install, void *extra) {
+hook_install(tsdn_t *tsdn, hooks_t *to_install) {
malloc_mutex_lock(tsdn, &hooks_mu);
- void *ret = hook_install_locked(to_install, extra);
+ void *ret = hook_install_locked(to_install);
if (ret != NULL) {
tsd_global_slow_inc(tsdn);
}
@@ -112,7 +110,7 @@ hook_invoke_alloc(hook_alloc_t type, void *result, uintptr_t result_raw,
FOR_EACH_HOOK_BEGIN(&hook)
hook_alloc h = hook.hooks.alloc_hook;
if (h != NULL) {
- h(hook.extra, type, result, result_raw, args_raw);
+ h(hook.hooks.extra, type, result, result_raw, args_raw);
}
FOR_EACH_HOOK_END
}
@@ -126,7 +124,7 @@ hook_invoke_dalloc(hook_dalloc_t type, void *address, uintptr_t args_raw[3]) {
FOR_EACH_HOOK_BEGIN(&hook)
hook_dalloc h = hook.hooks.dalloc_hook;
if (h != NULL) {
- h(hook.extra, type, address, args_raw);
+ h(hook.hooks.extra, type, address, args_raw);
}
FOR_EACH_HOOK_END
}
@@ -141,7 +139,7 @@ hook_invoke_expand(hook_expand_t type, void *address, size_t old_usize,
FOR_EACH_HOOK_BEGIN(&hook)
hook_expand h = hook.hooks.expand_hook;
if (h != NULL) {
- h(hook.extra, type, address, old_usize, new_usize,
+ h(hook.hooks.extra, type, address, old_usize, new_usize,
result_raw, args_raw);
}
FOR_EACH_HOOK_END
diff --git a/test/unit/hook.c b/test/unit/hook.c
index 693cb23..3f85ff1 100644
--- a/test/unit/hook.c
+++ b/test/unit/hook.c
@@ -81,8 +81,9 @@ test_expand_hook(void *extra, hook_expand_t type, void *address,
TEST_BEGIN(test_hooks_basic) {
/* Just verify that the record their arguments correctly. */
hooks_t hooks = {
- &test_alloc_hook, &test_dalloc_hook, &test_expand_hook};
- void *handle = hook_install(TSDN_NULL, &hooks, (void *)111);
+ &test_alloc_hook, &test_dalloc_hook, &test_expand_hook,
+ (void *)111};
+ void *handle = hook_install(TSDN_NULL, &hooks);
uintptr_t args_raw[4] = {10, 20, 30, 40};
/* Alloc */
@@ -124,15 +125,15 @@ TEST_END
TEST_BEGIN(test_hooks_null) {
/* Null hooks should be ignored, not crash. */
- hooks_t hooks1 = {NULL, NULL, NULL};
- hooks_t hooks2 = {&test_alloc_hook, NULL, NULL};
- hooks_t hooks3 = {NULL, &test_dalloc_hook, NULL};
- hooks_t hooks4 = {NULL, NULL, &test_expand_hook};
+ hooks_t hooks1 = {NULL, NULL, NULL, NULL};
+ hooks_t hooks2 = {&test_alloc_hook, NULL, NULL, NULL};
+ hooks_t hooks3 = {NULL, &test_dalloc_hook, NULL, NULL};
+ hooks_t hooks4 = {NULL, NULL, &test_expand_hook, NULL};
- void *handle1 = hook_install(TSDN_NULL, &hooks1, NULL);
- void *handle2 = hook_install(TSDN_NULL, &hooks2, NULL);
- void *handle3 = hook_install(TSDN_NULL, &hooks3, NULL);
- void *handle4 = hook_install(TSDN_NULL, &hooks4, NULL);
+ void *handle1 = hook_install(TSDN_NULL, &hooks1);
+ void *handle2 = hook_install(TSDN_NULL, &hooks2);
+ void *handle3 = hook_install(TSDN_NULL, &hooks3);
+ void *handle4 = hook_install(TSDN_NULL, &hooks4);
assert_ptr_ne(handle1, NULL, "Hook installation failed");
assert_ptr_ne(handle2, NULL, "Hook installation failed");
@@ -161,8 +162,8 @@ TEST_BEGIN(test_hooks_null) {
TEST_END
TEST_BEGIN(test_hooks_remove) {
- hooks_t hooks = {&test_alloc_hook, NULL, NULL};
- void *handle = hook_install(TSDN_NULL, &hooks, NULL);
+ hooks_t hooks = {&test_alloc_hook, NULL, NULL, NULL};
+ void *handle = hook_install(TSDN_NULL, &hooks);
assert_ptr_ne(handle, NULL, "Hook installation failed");
call_count = 0;
uintptr_t args_raw[4] = {10, 20, 30, 40};
@@ -179,8 +180,8 @@ TEST_END
TEST_BEGIN(test_hooks_alloc_simple) {
/* "Simple" in the sense that we're not in a realloc variant. */
- hooks_t hooks = {&test_alloc_hook, NULL, NULL};
- void *handle = hook_install(TSDN_NULL, &hooks, (void *)123);
+ hooks_t hooks = {&test_alloc_hook, NULL, NULL, (void *)123};
+ void *handle = hook_install(TSDN_NULL, &hooks);
assert_ptr_ne(handle, NULL, "Hook installation failed");
/* Stop malloc from being optimized away. */
@@ -290,8 +291,8 @@ TEST_END
TEST_BEGIN(test_hooks_dalloc_simple) {
/* "Simple" in the sense that we're not in a realloc variant. */
- hooks_t hooks = {NULL, &test_dalloc_hook, NULL};
- void *handle = hook_install(TSDN_NULL, &hooks, (void *)123);
+ hooks_t hooks = {NULL, &test_dalloc_hook, NULL, (void *)123};
+ void *handle = hook_install(TSDN_NULL, &hooks);
assert_ptr_ne(handle, NULL, "Hook installation failed");
void *volatile ptr;
@@ -337,8 +338,8 @@ TEST_END
TEST_BEGIN(test_hooks_expand_simple) {
/* "Simple" in the sense that we're not in a realloc variant. */
- hooks_t hooks = {NULL, NULL, &test_expand_hook};
- void *handle = hook_install(TSDN_NULL, &hooks, (void *)123);
+ hooks_t hooks = {NULL, NULL, &test_expand_hook, (void *)123};
+ void *handle = hook_install(TSDN_NULL, &hooks);
assert_ptr_ne(handle, NULL, "Hook installation failed");
void *volatile ptr;
@@ -365,8 +366,8 @@ TEST_END
TEST_BEGIN(test_hooks_realloc_as_malloc_or_free) {
hooks_t hooks = {&test_alloc_hook, &test_dalloc_hook,
- &test_expand_hook};
- void *handle = hook_install(TSDN_NULL, &hooks, (void *)123);
+ &test_expand_hook, (void *)123};
+ void *handle = hook_install(TSDN_NULL, &hooks);
assert_ptr_ne(handle, NULL, "Hook installation failed");
void *volatile ptr;
@@ -416,8 +417,8 @@ static void
do_realloc_test(void *(*ralloc)(void *, size_t, int), int flags,
int expand_type, int dalloc_type) {
hooks_t hooks = {&test_alloc_hook, &test_dalloc_hook,
- &test_expand_hook};
- void *handle = hook_install(TSDN_NULL, &hooks, (void *)123);
+ &test_expand_hook, (void *)123};
+ void *handle = hook_install(TSDN_NULL, &hooks);
assert_ptr_ne(handle, NULL, "Hook installation failed");
void *volatile ptr;