X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FMalloc.h;h=59745b5fd0c47615a72a6739f40000697c59b864;hb=65902504332d7f856a1fa407b0930ab5cc55fb2a;hp=7aadfc8fc9558d38cf56eff76d9dd1e44f4a52cc;hpb=21a265b30e6b606417acded87061088ce93b3462;p=folly.git diff --git a/folly/Malloc.h b/folly/Malloc.h index 7aadfc8f..59745b5f 100644 --- a/folly/Malloc.h +++ b/folly/Malloc.h @@ -1,5 +1,5 @@ /* - * Copyright 2012 Facebook, Inc. + * Copyright 2014 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,7 +26,10 @@ // includes and uses fbstring. #if defined(_GLIBCXX_USE_FB) && !defined(_LIBSTDCXX_FBSTRING) +#include + #include + namespace folly { using std::goodMallocSize; using std::jemallocMinInPlaceExpandable; @@ -41,15 +44,30 @@ namespace folly { #ifdef _LIBSTDCXX_FBSTRING #pragma GCC system_header + +/** + * Declare rallocm(), allocm(), and mallctl() as weak symbols. These will be + * provided by jemalloc if we are using jemalloc, or will be NULL if we are + * using another malloc implementation. + */ +extern "C" int rallocm(void**, size_t*, size_t, size_t, int) +__attribute__((weak)); +extern "C" int allocm(void**, size_t*, size_t, int) +__attribute__((weak)); +extern "C" int mallctl(const char*, void*, size_t*, void*, size_t) +__attribute__((weak)); + +#include #define FOLLY_HAVE_MALLOC_H 1 #else -#include "folly-config.h" +#include +#include #endif // for malloc_usable_size // NOTE: FreeBSD 9 doesn't have malloc.h. It's defitions // are found in stdlib.h. -#ifdef FOLLY_HAVE_MALLOC_H +#if FOLLY_HAVE_MALLOC_H #include #else #include @@ -63,27 +81,28 @@ namespace folly { #include /** - * Declare rallocm() and malloc_usable_size() as weak symbols. It - * will be provided by jemalloc if we are using jemalloc, or it will - * be NULL if we are using another malloc implementation. - */ -extern "C" int rallocm(void**, size_t*, size_t, size_t, int) -__attribute__((weak)); - -/** - * Define the ALLOCM_SUCCESS, ALLOCM_ZERO, and ALLOCM_NO_MOVE constants - * normally provided by jemalloc. We define them so that we don't have to - * include jemalloc.h, in case the program is built without jemalloc support. + * Define various ALLOCM_* macros normally provided by jemalloc. We define + * them so that we don't have to include jemalloc.h, in case the program is + * built without jemalloc support. */ #ifndef ALLOCM_SUCCESS + #define ALLOCM_SUCCESS 0 #define ALLOCM_ERR_OOM 1 #define ALLOCM_ERR_NOT_MOVED 2 #define ALLOCM_ZERO 64 #define ALLOCM_NO_MOVE 128 + +#define ALLOCM_LG_ALIGN(la) (la) + +#if defined(JEMALLOC_MANGLE) && defined(JEMALLOC_EXPERIMENTAL) +#define rallocm je_rallocm +#define allocm je_allocm #endif +#endif /* ALLOCM_SUCCESS */ + #ifdef _LIBSTDCXX_FBSTRING namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -91,12 +110,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION namespace folly { #endif +bool usingJEMallocSlow(); /** * Determine if we are using jemalloc or not. */ inline bool usingJEMalloc() { - return rallocm != NULL; + // Checking for rallocm != NULL is not sufficient; we may be in a dlopen()ed + // module that depends on libjemalloc, so rallocm is resolved, but the main + // program might be using a different memory allocator. Look at the + // implementation of usingJEMallocSlow() for the (hacky) details. + static bool result = usingJEMallocSlow(); + return result; } /** @@ -144,19 +169,19 @@ static const size_t jemallocMinInPlaceExpandable = 4096; */ inline void* checkedMalloc(size_t size) { void* p = malloc(size); - if (!p) throw std::bad_alloc(); + if (!p) std::__throw_bad_alloc(); return p; } inline void* checkedCalloc(size_t n, size_t size) { void* p = calloc(n, size); - if (!p) throw std::bad_alloc(); + if (!p) std::__throw_bad_alloc(); return p; } inline void* checkedRealloc(void* ptr, size_t size) { void* p = realloc(ptr, size); - if (!p) throw std::bad_alloc(); + if (!p) std::__throw_bad_alloc(); return p; } @@ -184,7 +209,7 @@ inline void* smartRealloc(void* p, // using jemalloc's API. Don't forget that jemalloc can never grow // in place blocks smaller than 4096 bytes. if (currentCapacity >= jemallocMinInPlaceExpandable && - rallocm(&p, NULL, newCapacity, 0, ALLOCM_NO_MOVE) == ALLOCM_SUCCESS) { + rallocm(&p, nullptr, newCapacity, 0, ALLOCM_NO_MOVE) == ALLOCM_SUCCESS) { // Managed to expand in place return p; }