/*
- * Copyright 2014 Facebook, Inc.
+ * Copyright 2015 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <folly/Portability.h>
#endif
-#include <folly/ScopeGuard.h>
-
// for malloc_usable_size
// NOTE: FreeBSD 9 doesn't have malloc.h. It's defitions
// are found in stdlib.h.
return minSize;
}
size_t goodSize;
- SCOPE_EXIT { assert(nallocx(goodSize, 0) == goodSize); };
if (minSize <= 64) {
// Choose smallest allocation to be 64 bytes - no tripping over
// cache line boundaries, and small string optimization takes care
// of short strings anyway.
- return goodSize = 64;
- }
- if (minSize <= 512) {
+ goodSize = 64;
+ } else if (minSize <= 512) {
// Round up to the next multiple of 64; we don't want to trip over
// cache line boundaries.
- return goodSize = (minSize + 63) & ~size_t(63);
- }
- if (minSize <= 3584) {
- // Round up to the next multiple of 256. For some size classes jemalloc
- // will additionally round up to the nearest multiple of 512, hence the
- // nallocx() call.
- return goodSize = nallocx((minSize + 255) & ~size_t(255), 0);
- }
- if (minSize <= 4072 * 1024) {
- // Round up to the next multiple of 4KB
- return goodSize = (minSize + 4095) & ~size_t(4095);
+ goodSize = (minSize + 63) & ~size_t(63);
+ } else {
+ // Boundaries between size classes depend on numerious factors, some of
+ // which can even be modified at run-time. Determine the good allocation
+ // size by calling nallocx() directly.
+ goodSize = nallocx(minSize, 0);
}
- // Holy Moly
- // Round up to the next multiple of 4MB
- return goodSize = (minSize + 4194303) & ~size_t(4194303);
+ assert(nallocx(goodSize, 0) == goodSize);
+ return goodSize;
}
// We always request "good" sizes for allocation, so jemalloc can