Allow je_malloc_message to be overridden when linking statically

If an application wants to override je_malloc_message, it is better to define
the symbol locally than to change its value in main(), which might be too late
for various reasons.

Due to je_malloc_message being initialized in util.c, statically linking
jemalloc with an application defining je_malloc_message fails due to
"multiple definition of" the symbol.

Defining it without a value (like je_malloc_conf) makes it more easily
overridable.
This commit is contained in:
Mike Hommey 2012-05-02 13:15:00 +02:00 committed by Jason Evans
parent 80737c3323
commit 3597e91482
2 changed files with 14 additions and 19 deletions

View File

@ -295,16 +295,6 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque,
abort(); abort();
} }
if (write_cb == NULL) {
/*
* The caller did not provide an alternate write_cb callback
* function, so use the default one. malloc_write() is an
* inline function, so use malloc_message() directly here.
*/
write_cb = je_malloc_message;
cbopaque = NULL;
}
if (opts != NULL) { if (opts != NULL) {
unsigned i; unsigned i;
@ -330,7 +320,8 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque,
} }
} }
write_cb(cbopaque, "___ Begin jemalloc statistics ___\n"); malloc_cprintf(write_cb, cbopaque,
"___ Begin jemalloc statistics ___\n");
if (general) { if (general) {
int err; int err;
const char *cpv; const char *cpv;
@ -375,7 +366,8 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque,
" opt."#n": \"%s\"\n", cpv); \ " opt."#n": \"%s\"\n", cpv); \
} }
write_cb(cbopaque, "Run-time option settings:\n"); malloc_cprintf(write_cb, cbopaque,
"Run-time option settings:\n");
OPT_WRITE_BOOL(abort) OPT_WRITE_BOOL(abort)
OPT_WRITE_SIZE_T(lg_chunk) OPT_WRITE_SIZE_T(lg_chunk)
OPT_WRITE_SIZE_T(narenas) OPT_WRITE_SIZE_T(narenas)
@ -425,7 +417,7 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque,
"Min active:dirty page ratio per arena: %u:1\n", "Min active:dirty page ratio per arena: %u:1\n",
(1U << ssv)); (1U << ssv));
} else { } else {
write_cb(cbopaque, malloc_cprintf(write_cb, cbopaque,
"Min active:dirty page ratio per arena: N/A\n"); "Min active:dirty page ratio per arena: N/A\n");
} }
if ((err = je_mallctl("arenas.tcache_max", &sv, &ssz, NULL, 0)) if ((err = je_mallctl("arenas.tcache_max", &sv, &ssz, NULL, 0))
@ -447,7 +439,7 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque,
" (2^%zd)\n", " (2^%zd)\n",
(((uint64_t)1U) << ssv), ssv); (((uint64_t)1U) << ssv), ssv);
} else { } else {
write_cb(cbopaque, malloc_cprintf(write_cb, cbopaque,
"Average profile dump interval: N/A\n"); "Average profile dump interval: N/A\n");
} }
} }
@ -547,5 +539,5 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque,
} }
} }
} }
write_cb(cbopaque, "--- End jemalloc statistics ---\n"); malloc_cprintf(write_cb, cbopaque, "--- End jemalloc statistics ---\n");
} }

View File

@ -56,8 +56,7 @@ wrtmessage(void *cbopaque, const char *s)
#endif #endif
} }
JEMALLOC_EXPORT void (*je_malloc_message)(void *, const char *s) = JEMALLOC_EXPORT void (*je_malloc_message)(void *, const char *s);
wrtmessage;
/* /*
* Wrapper around malloc_message() that avoids the need for * Wrapper around malloc_message() that avoids the need for
@ -67,7 +66,10 @@ void
malloc_write(const char *s) malloc_write(const char *s)
{ {
je_malloc_message(NULL, s); if (je_malloc_message != NULL)
je_malloc_message(NULL, s);
else
wrtmessage(NULL, s);
} }
/* /*
@ -606,7 +608,8 @@ malloc_vcprintf(void (*write_cb)(void *, const char *), void *cbopaque,
* function, so use the default one. malloc_write() is an * function, so use the default one. malloc_write() is an
* inline function, so use malloc_message() directly here. * inline function, so use malloc_message() directly here.
*/ */
write_cb = je_malloc_message; write_cb = (je_malloc_message != NULL) ? je_malloc_message :
wrtmessage;
cbopaque = NULL; cbopaque = NULL;
} }