| Index: third_party/tcmalloc/chromium/src/memfs_malloc.cc
 | 
| ===================================================================
 | 
| --- third_party/tcmalloc/chromium/src/memfs_malloc.cc	(revision 126022)
 | 
| +++ third_party/tcmalloc/chromium/src/memfs_malloc.cc	(working copy)
 | 
| @@ -54,16 +54,13 @@
 | 
|  #include <new>                          // for operator new
 | 
|  #include <string>
 | 
|  
 | 
| -#include <gperftools/malloc_extension.h>
 | 
| +#include <google/malloc_extension.h>
 | 
|  #include "base/basictypes.h"
 | 
|  #include "base/googleinit.h"
 | 
|  #include "base/sysinfo.h"
 | 
| +#include "system-alloc.h"
 | 
|  #include "internal_logging.h"
 | 
|  
 | 
| -// TODO(sanjay): Move the code below into the tcmalloc namespace
 | 
| -using tcmalloc::kLog;
 | 
| -using tcmalloc::kCrash;
 | 
| -using tcmalloc::Log;
 | 
|  using std::string;
 | 
|  
 | 
|  DEFINE_string(memfs_malloc_path, EnvToString("TCMALLOC_MEMFS_MALLOC_PATH", ""),
 | 
| @@ -89,7 +86,7 @@
 | 
|  class HugetlbSysAllocator: public SysAllocator {
 | 
|  public:
 | 
|    explicit HugetlbSysAllocator(SysAllocator* fallback)
 | 
| -    : failed_(true),  // To disable allocator until Initialize() is called.
 | 
| +    : failed_(true),  // Unusable until FlagsInitialized() is called
 | 
|        big_page_size_(0),
 | 
|        hugetlb_fd_(-1),
 | 
|        hugetlb_base_(0),
 | 
| @@ -97,10 +94,10 @@
 | 
|    }
 | 
|  
 | 
|    void* Alloc(size_t size, size_t *actual_size, size_t alignment);
 | 
| -  bool Initialize();
 | 
|  
 | 
| -  bool failed_;          // Whether failed to allocate memory.
 | 
| +  void FlagsInitialized();
 | 
|  
 | 
| +  bool failed_;          // Whether failed to allocate memory.
 | 
|  private:
 | 
|    void* AllocInternal(size_t size, size_t *actual_size, size_t alignment);
 | 
|  
 | 
| @@ -139,11 +136,11 @@
 | 
|    if (result != NULL) {
 | 
|      return result;
 | 
|    }
 | 
| -  Log(kLog, __FILE__, __LINE__,
 | 
| -      "HugetlbSysAllocator: (failed, allocated)", failed_, hugetlb_base_);
 | 
| +  TCMalloc_MESSAGE(__FILE__, __LINE__,
 | 
| +                   "HugetlbSysAllocator: failed_=%d allocated=%"PRId64"\n",
 | 
| +                   failed_, static_cast<int64_t>(hugetlb_base_));
 | 
|    if (FLAGS_memfs_malloc_abort_on_fail) {
 | 
| -    Log(kCrash, __FILE__, __LINE__,
 | 
| -        "memfs_malloc_abort_on_fail is set");
 | 
| +    CRASH("memfs_malloc_abort_on_fail is set\n");
 | 
|    }
 | 
|    return fallback_->Alloc(size, actual_size, alignment);
 | 
|  }
 | 
| @@ -161,12 +158,13 @@
 | 
|    if (limit > 0 && hugetlb_base_ + size + extra > limit) {
 | 
|      // Disable the allocator when there's less than one page left.
 | 
|      if (limit - hugetlb_base_ < big_page_size_) {
 | 
| -      Log(kLog, __FILE__, __LINE__, "reached memfs_malloc_limit_mb");
 | 
| +      TCMalloc_MESSAGE(__FILE__, __LINE__, "reached memfs_malloc_limit_mb\n");
 | 
|        failed_ = true;
 | 
|      }
 | 
|      else {
 | 
| -      Log(kLog, __FILE__, __LINE__,
 | 
| -          "alloc too large (size, bytes left)", size, limit-hugetlb_base_);
 | 
| +      TCMalloc_MESSAGE(__FILE__, __LINE__, "alloc size=%"PRIuS
 | 
| +                       " too large while %"PRId64" bytes remain\n",
 | 
| +                       size, static_cast<int64_t>(limit - hugetlb_base_));
 | 
|      }
 | 
|      return NULL;
 | 
|    }
 | 
| @@ -175,8 +173,8 @@
 | 
|    // hugetlbfs returns EINVAL for ftruncate.
 | 
|    int ret = ftruncate(hugetlb_fd_, hugetlb_base_ + size + extra);
 | 
|    if (ret != 0 && errno != EINVAL) {
 | 
| -    Log(kLog, __FILE__, __LINE__,
 | 
| -        "ftruncate failed", strerror(errno));
 | 
| +    TCMalloc_MESSAGE(__FILE__, __LINE__, "ftruncate failed: %s\n",
 | 
| +                     strerror(errno));
 | 
|      failed_ = true;
 | 
|      return NULL;
 | 
|    }
 | 
| @@ -191,8 +189,8 @@
 | 
|                  hugetlb_fd_, hugetlb_base_);
 | 
|    if (result == reinterpret_cast<void*>(MAP_FAILED)) {
 | 
|      if (!FLAGS_memfs_malloc_ignore_mmap_fail) {
 | 
| -      Log(kLog, __FILE__, __LINE__,
 | 
| -          "mmap failed (size, error)", size + extra, strerror(errno));
 | 
| +      TCMalloc_MESSAGE(__FILE__, __LINE__, "mmap of size %"PRIuS" failed: %s\n",
 | 
| +                       size + extra, strerror(errno));
 | 
|        failed_ = true;
 | 
|      }
 | 
|      return NULL;
 | 
| @@ -214,54 +212,49 @@
 | 
|    return reinterpret_cast<void*>(ptr);
 | 
|  }
 | 
|  
 | 
| -bool HugetlbSysAllocator::Initialize() {
 | 
| -  char path[PATH_MAX];
 | 
| -  const int pathlen = FLAGS_memfs_malloc_path.size();
 | 
| -  if (pathlen + 8 > sizeof(path)) {
 | 
| -    Log(kCrash, __FILE__, __LINE__, "XX fatal: memfs_malloc_path too long");
 | 
| -    return false;
 | 
| -  }
 | 
| -  memcpy(path, FLAGS_memfs_malloc_path.data(), pathlen);
 | 
| -  memcpy(path + pathlen, ".XXXXXX", 8);  // Also copies terminating \0
 | 
| +void HugetlbSysAllocator::FlagsInitialized() {
 | 
| +  if (FLAGS_memfs_malloc_path.length()) {
 | 
| +    char path[PATH_MAX];
 | 
| +    int rc = snprintf(path, sizeof(path), "%s.XXXXXX",
 | 
| +                      FLAGS_memfs_malloc_path.c_str());
 | 
| +    if (rc < 0 || rc >= sizeof(path)) {
 | 
| +      CRASH("XX fatal: memfs_malloc_path too long\n");
 | 
| +    }
 | 
|  
 | 
| -  int hugetlb_fd = mkstemp(path);
 | 
| -  if (hugetlb_fd == -1) {
 | 
| -    Log(kLog, __FILE__, __LINE__,
 | 
| -        "warning: unable to create memfs_malloc_path",
 | 
| -        path, strerror(errno));
 | 
| -    return false;
 | 
| -  }
 | 
| +    int hugetlb_fd = mkstemp(path);
 | 
| +    if (hugetlb_fd == -1) {
 | 
| +      TCMalloc_MESSAGE(__FILE__, __LINE__,
 | 
| +                       "warning: unable to create memfs_malloc_path %s: %s\n",
 | 
| +                       path, strerror(errno));
 | 
| +      return;
 | 
| +    }
 | 
|  
 | 
| -  // Cleanup memory on process exit
 | 
| -  if (unlink(path) == -1) {
 | 
| -    Log(kCrash, __FILE__, __LINE__,
 | 
| -        "fatal: error unlinking memfs_malloc_path", path, strerror(errno));
 | 
| -    return false;
 | 
| -  }
 | 
| +    // Cleanup memory on process exit
 | 
| +    if (unlink(path) == -1) {
 | 
| +      CRASH("fatal: error unlinking memfs_malloc_path %s: %s\n",
 | 
| +            path, strerror(errno));
 | 
| +    }
 | 
|  
 | 
| -  // Use fstatfs to figure out the default page size for memfs
 | 
| -  struct statfs sfs;
 | 
| -  if (fstatfs(hugetlb_fd, &sfs) == -1) {
 | 
| -    Log(kCrash, __FILE__, __LINE__,
 | 
| -        "fatal: error fstatfs of memfs_malloc_path", strerror(errno));
 | 
| -    return false;
 | 
| +    // Use fstatfs to figure out the default page size for memfs
 | 
| +    struct statfs sfs;
 | 
| +    if (fstatfs(hugetlb_fd, &sfs) == -1) {
 | 
| +      CRASH("fatal: error fstatfs of memfs_malloc_path: %s\n",
 | 
| +            strerror(errno));
 | 
| +    }
 | 
| +    int64 page_size = sfs.f_bsize;
 | 
| +
 | 
| +    hugetlb_fd_ = hugetlb_fd;
 | 
| +    big_page_size_ = page_size;
 | 
| +    failed_ = false;
 | 
|    }
 | 
| -  int64 page_size = sfs.f_bsize;
 | 
| +}
 | 
|  
 | 
| -  hugetlb_fd_ = hugetlb_fd;
 | 
| -  big_page_size_ = page_size;
 | 
| -  failed_ = false;
 | 
| -  return true;
 | 
| +static void InitSystemAllocator() {
 | 
| +  SysAllocator *alloc = MallocExtension::instance()->GetSystemAllocator();
 | 
| +  HugetlbSysAllocator *hugetlb = new (hugetlb_space) HugetlbSysAllocator(alloc);
 | 
| +  MallocExtension::instance()->SetSystemAllocator(hugetlb);
 | 
|  }
 | 
|  
 | 
| -REGISTER_MODULE_INITIALIZER(memfs_malloc, {
 | 
| -  if (FLAGS_memfs_malloc_path.length()) {
 | 
| -    SysAllocator* alloc = MallocExtension::instance()->GetSystemAllocator();
 | 
| -    HugetlbSysAllocator* hp = new (hugetlb_space) HugetlbSysAllocator(alloc);
 | 
| -    if (hp->Initialize()) {
 | 
| -      MallocExtension::instance()->SetSystemAllocator(hp);
 | 
| -    }
 | 
| -  }
 | 
| -});
 | 
| +REGISTER_MODULE_INITIALIZER(memfs_malloc, { InitSystemAllocator(); });
 | 
|  
 | 
|  #endif   /* ifdef __linux */
 | 
| 
 |