X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FMalloc.h;h=59745b5fd0c47615a72a6739f40000697c59b864;hb=65902504332d7f856a1fa407b0930ab5cc55fb2a;hp=e65ce226e16bf0c375a758f71f70e1ef171c31bb;hpb=f5cac66e7afed78ae6ad79d1648a779ec31542e7;p=folly.git diff --git a/folly/Malloc.h b/folly/Malloc.h index e65ce226..59745b5f 100644 --- a/folly/Malloc.h +++ b/folly/Malloc.h @@ -1,5 +1,5 @@ /* - * Copyright 2013 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,9 +26,10 @@ // includes and uses fbstring. #if defined(_GLIBCXX_USE_FB) && !defined(_LIBSTDCXX_FBSTRING) -#include "folly/detail/Malloc.h" +#include #include + namespace folly { using std::goodMallocSize; using std::jemallocMinInPlaceExpandable; @@ -43,10 +44,24 @@ 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/detail/Malloc.h" -#include "folly/Portability.h" +#include +#include #endif // for malloc_usable_size @@ -65,8 +80,6 @@ namespace folly { #include -#include - /** * 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 @@ -97,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; } /** @@ -190,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; }