summaryrefslogtreecommitdiffstats
path: root/src/jemalloc.c
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2012-12-23 16:51:48 (GMT)
committerJason Evans <jasone@canonware.com>2012-12-23 16:51:48 (GMT)
commit1bf2743e08ba66cc141e296812839947223e4370 (patch)
treed2dd57a56d366213be4ca1ef033bdfd7c7e87931 /src/jemalloc.c
parent1271185b87fcf54afb37dc05e7e0c58e5fb8f06a (diff)
downloadjemalloc-1bf2743e08ba66cc141e296812839947223e4370.zip
jemalloc-1bf2743e08ba66cc141e296812839947223e4370.tar.gz
jemalloc-1bf2743e08ba66cc141e296812839947223e4370.tar.bz2
Add clipping support to lg_chunk option processing.
Modify processing of the lg_chunk option so that it clips an out-of-range input to the edge of the valid range. This makes it possible to request the minimum possible chunk size without intimate knowledge of allocator internals. Submitted by Ian Lepore (see FreeBSD PR bin/174641).
Diffstat (limited to 'src/jemalloc.c')
-rw-r--r--src/jemalloc.c42
1 files changed, 23 insertions, 19 deletions
diff --git a/src/jemalloc.c b/src/jemalloc.c
index 8a667b6..cecd012 100644
--- a/src/jemalloc.c
+++ b/src/jemalloc.c
@@ -469,7 +469,7 @@ malloc_conf_init(void)
while (*opts != '\0' && malloc_conf_next(&opts, &k, &klen, &v,
&vlen) == false) {
-#define CONF_HANDLE_BOOL_HIT(o, n, hit) \
+#define CONF_HANDLE_BOOL(o, n) \
if (sizeof(n)-1 == klen && strncmp(n, k, \
klen) == 0) { \
if (strncmp("true", v, vlen) == 0 && \
@@ -483,16 +483,9 @@ malloc_conf_init(void)
"Invalid conf value", \
k, klen, v, vlen); \
} \
- hit = true; \
- } else \
- hit = false;
-#define CONF_HANDLE_BOOL(o, n) { \
- bool hit; \
- CONF_HANDLE_BOOL_HIT(o, n, hit); \
- if (hit) \
continue; \
-}
-#define CONF_HANDLE_SIZE_T(o, n, min, max) \
+ }
+#define CONF_HANDLE_SIZE_T(o, n, min, max, clip) \
if (sizeof(n)-1 == klen && strncmp(n, k, \
klen) == 0) { \
uintmax_t um; \
@@ -505,12 +498,22 @@ malloc_conf_init(void)
malloc_conf_error( \
"Invalid conf value", \
k, klen, v, vlen); \
- } else if (um < min || um > max) { \
- malloc_conf_error( \
- "Out-of-range conf value", \
- k, klen, v, vlen); \
- } else \
- o = um; \
+ } else if (clip) { \
+ if (um < min) \
+ o = min; \
+ else if (um > max) \
+ o = max; \
+ else \
+ o = um; \
+ } else { \
+ if (um < min || um > max) { \
+ malloc_conf_error( \
+ "Out-of-range " \
+ "conf value", \
+ k, klen, v, vlen); \
+ } else \
+ o = um; \
+ } \
continue; \
}
#define CONF_HANDLE_SSIZE_T(o, n, min, max) \
@@ -555,7 +558,8 @@ malloc_conf_init(void)
* config_fill.
*/
CONF_HANDLE_SIZE_T(opt_lg_chunk, "lg_chunk", LG_PAGE +
- (config_fill ? 2 : 1), (sizeof(size_t) << 3) - 1)
+ (config_fill ? 2 : 1), (sizeof(size_t) << 3) - 1,
+ true)
if (strncmp("dss", k, klen) == 0) {
int i;
bool match = false;
@@ -581,14 +585,14 @@ malloc_conf_init(void)
continue;
}
CONF_HANDLE_SIZE_T(opt_narenas, "narenas", 1,
- SIZE_T_MAX)
+ SIZE_T_MAX, false)
CONF_HANDLE_SSIZE_T(opt_lg_dirty_mult, "lg_dirty_mult",
-1, (sizeof(size_t) << 3) - 1)
CONF_HANDLE_BOOL(opt_stats_print, "stats_print")
if (config_fill) {
CONF_HANDLE_BOOL(opt_junk, "junk")
CONF_HANDLE_SIZE_T(opt_quarantine, "quarantine",
- 0, SIZE_T_MAX)
+ 0, SIZE_T_MAX, false)
CONF_HANDLE_BOOL(opt_redzone, "redzone")
CONF_HANDLE_BOOL(opt_zero, "zero")
}