Bug 1401101 - Remove the generic replace-malloc library. r?njn draft
authorMike Hommey <mh+mozilla@glandium.org>
Tue, 19 Sep 2017 15:58:33 +0900
changeset 666822 3586797af0c9134a1a9b7247fb30d91649478ace
parent 666815 71117833832b01192e48766544214e778d5669a6
child 666844 da838b77a718db22b337e61c4fe72d5d14381745
push id80501
push userbmo:mh+mozilla@glandium.org
push dateTue, 19 Sep 2017 07:05:37 +0000
reviewersnjn
bugs1401101, 1168719, 1385953
milestone57.0a1
Bug 1401101 - Remove the generic replace-malloc library. r?njn It is one of the moving parts when adding new memory allocation APIs. It was added in bug 1168719 and the only thing that actually used it was the sampling-based memory profiler, which was removed in bug 1385953. We however keep the replace-malloc bridge entry point so that something else, in the future, may still provide the feature.
memory/replace/moz.build
memory/replace/replace/ReplaceMalloc.cpp
memory/replace/replace/moz.build
--- a/memory/replace/moz.build
+++ b/memory/replace/moz.build
@@ -1,13 +1,12 @@
 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DIRS += [
     'logalloc',
-    'replace',
 ]
 
 if CONFIG['MOZ_DMD']:
     DIRS += ['dmd']
deleted file mode 100644
--- a/memory/replace/replace/ReplaceMalloc.cpp
+++ /dev/null
@@ -1,274 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "replace_malloc.h"
-#include <errno.h>
-#include "mozilla/CheckedInt.h"
-#include "mozilla/Atomics.h"
-
-/* Replace-malloc library allowing different kinds of dispatch.
- * The long term goal is to allow multiple replace-malloc libraries
- * to be loaded and coexist properly.
- * This is however a limited version to fulfil more immediate needs.
- */
-static const malloc_table_t* gFuncs = nullptr;
-static mozilla::Atomic<const malloc_hook_table_t*> gHookTable(nullptr);
-
-class GenericReplaceMallocBridge : public ReplaceMallocBridge
-{
-  virtual const malloc_table_t*
-  RegisterHook(const char* aName, const malloc_table_t* aTable,
-               const malloc_hook_table_t* aHookTable) override
-  {
-    // Can't register a hook before replace_init is called.
-    if (!gFuncs) {
-      return nullptr;
-    }
-
-    // Expect a name to be given.
-    if (!aName) {
-      return nullptr;
-    }
-
-    // Giving a malloc_table_t is not supported yet.
-    if (aTable) {
-      return nullptr;
-    }
-
-    if (aHookTable) {
-      // Expect at least a malloc and a free hook.
-      if (!aHookTable->malloc_hook || !aHookTable->free_hook) {
-        return nullptr;
-      }
-      gHookTable = const_cast<malloc_hook_table_t*>(aHookTable);
-      return gFuncs;
-    }
-    gHookTable = nullptr;
-
-    return nullptr;
-  }
-};
-
-void
-replace_init(const malloc_table_t* aTable)
-{
-  gFuncs = aTable;
-}
-
-ReplaceMallocBridge*
-replace_get_bridge()
-{
-  static GenericReplaceMallocBridge bridge;
-  return &bridge;
-}
-
-void*
-replace_malloc(size_t aSize)
-{
-  void* ptr = gFuncs->malloc(aSize);
-  const malloc_hook_table_t* hook_table = gHookTable;
-  if (hook_table) {
-    return hook_table->malloc_hook(ptr, aSize);
-  }
-  return ptr;
-}
-
-int
-replace_posix_memalign(void** aPtr, size_t aAlignment, size_t aSize)
-{
-  int ret = gFuncs->posix_memalign(aPtr, aAlignment, aSize);
-  const malloc_hook_table_t* hook_table = gHookTable;
-  if (hook_table) {
-    if (hook_table->posix_memalign_hook) {
-      return hook_table->posix_memalign_hook(ret, aPtr, aAlignment, aSize);
-    }
-    void* ptr = hook_table->malloc_hook(*aPtr, aSize);
-    if (!ptr && *aPtr) {
-      *aPtr = ptr;
-      ret = ENOMEM;
-    }
-  }
-  return ret;
-}
-
-void*
-replace_aligned_alloc(size_t aAlignment, size_t aSize)
-{
-  void* ptr = gFuncs->aligned_alloc(aAlignment, aSize);
-  const malloc_hook_table_t* hook_table = gHookTable;
-  if (hook_table) {
-    if (hook_table->aligned_alloc_hook) {
-      return hook_table->aligned_alloc_hook(ptr, aAlignment, aSize);
-    }
-    return hook_table->malloc_hook(ptr, aSize);
-  }
-  return ptr;
-}
-
-void*
-replace_calloc(size_t aNum, size_t aSize)
-{
-  void* ptr = gFuncs->calloc(aNum, aSize);
-  const malloc_hook_table_t* hook_table = gHookTable;
-  if (hook_table) {
-    if (hook_table->calloc_hook) {
-      return hook_table->calloc_hook(ptr, aNum, aSize);
-    }
-    mozilla::CheckedInt<size_t> size = mozilla::CheckedInt<size_t>(aNum) * aSize;
-    if (size.isValid()) {
-      return hook_table->malloc_hook(ptr, size.value());
-    }
-    /* If the multiplication above overflows, calloc will have failed, so ptr
-     * is null. But the hook might still be interested in knowing about the
-     * allocation attempt. The choice made is to indicate the overflow with
-     * the biggest value of a size_t, which is not that bad an indicator:
-     * there are only 5 prime factors to 2^32 - 1 and 7 prime factors to
-     * 2^64 - 1 and none of them is going to come directly out of sizeof().
-     * IOW, the likelyhood of aNum * aSize being exactly SIZE_MAX is low
-     * enough, and SIZE_MAX still conveys that the attempted allocation was
-     * too big anyways. */
-    return hook_table->malloc_hook(ptr, SIZE_MAX);
-  }
-  return ptr;
-}
-
-void*
-replace_realloc(void* aPtr, size_t aSize)
-{
-  const malloc_hook_table_t* hook_table = gHookTable;
-  if (hook_table) {
-    if (hook_table->realloc_hook_before) {
-      hook_table->realloc_hook_before(aPtr);
-    } else {
-      hook_table->free_hook(aPtr);
-    }
-  }
-  void* new_ptr = gFuncs->realloc(aPtr, aSize);
-  /* The hook table might have changed since before realloc was called,
-   * either because of unregistration or registration of a new table.
-   * We however go with consistency and use the same hook table as the
-   * one that was used before the call to realloc. */
-  if (hook_table) {
-    if (hook_table->realloc_hook) {
-      /* aPtr is likely invalid when reaching here, it is only given for
-       * tracking purposes, and should not be dereferenced. */
-      return hook_table->realloc_hook(new_ptr, aPtr, aSize);
-    }
-    return hook_table->malloc_hook(new_ptr, aSize);
-  }
-  return new_ptr;
-}
-
-void
-replace_free(void* aPtr)
-{
-  const malloc_hook_table_t* hook_table = gHookTable;
-  if (hook_table) {
-    hook_table->free_hook(aPtr);
-  }
-  gFuncs->free(aPtr);
-}
-
-void*
-replace_memalign(size_t aAlignment, size_t aSize)
-{
-  void* ptr = gFuncs->memalign(aAlignment, aSize);
-  const malloc_hook_table_t* hook_table = gHookTable;
-  if (hook_table) {
-    if (hook_table->memalign_hook) {
-      return hook_table->memalign_hook(ptr, aAlignment, aSize);
-    }
-    return hook_table->malloc_hook(ptr, aSize);
-  }
-  return ptr;
-}
-
-void*
-replace_valloc(size_t aSize)
-{
-  void* ptr = gFuncs->valloc(aSize);
-  const malloc_hook_table_t* hook_table = gHookTable;
-  if (hook_table) {
-    if (hook_table->valloc_hook) {
-      return hook_table->valloc_hook(ptr, aSize);
-    }
-    return hook_table->malloc_hook(ptr, aSize);
-  }
-  return ptr;
-}
-
-size_t
-replace_malloc_usable_size(usable_ptr_t aPtr)
-{
-  size_t ret = gFuncs->malloc_usable_size(aPtr);
-  const malloc_hook_table_t* hook_table = gHookTable;
-  if (hook_table && hook_table->malloc_usable_size_hook) {
-    return hook_table->malloc_usable_size_hook(ret, aPtr);
-  }
-  return ret;
-}
-
-size_t
-replace_malloc_good_size(size_t aSize)
-{
-  size_t ret = gFuncs->malloc_good_size(aSize);
-  const malloc_hook_table_t* hook_table = gHookTable;
-  if (hook_table && hook_table->malloc_good_size_hook) {
-    return hook_table->malloc_good_size_hook(ret, aSize);
-  }
-  return ret;
-}
-
-void
-replace_jemalloc_stats(jemalloc_stats_t* aStats)
-{
-  gFuncs->jemalloc_stats(aStats);
-  const malloc_hook_table_t* hook_table = gHookTable;
-  if (hook_table && hook_table->jemalloc_stats_hook) {
-    hook_table->jemalloc_stats_hook(aStats);
-  }
-}
-
-void
-replace_jemalloc_purge_freed_pages(void)
-{
-  gFuncs->jemalloc_purge_freed_pages();
-  const malloc_hook_table_t* hook_table = gHookTable;
-  if (hook_table && hook_table->jemalloc_purge_freed_pages_hook) {
-    hook_table->jemalloc_purge_freed_pages_hook();
-  }
-}
-
-void
-replace_jemalloc_free_dirty_pages(void)
-{
-  gFuncs->jemalloc_free_dirty_pages();
-  const malloc_hook_table_t* hook_table = gHookTable;
-  if (hook_table && hook_table->jemalloc_free_dirty_pages_hook) {
-    hook_table->jemalloc_free_dirty_pages_hook();
-  }
-}
-
-void
-replace_jemalloc_thread_local_arena(bool aEnabled)
-{
-  gFuncs->jemalloc_thread_local_arena(aEnabled);
-  const malloc_hook_table_t* hook_table = gHookTable;
-  if (hook_table && hook_table->jemalloc_thread_local_arena_hook) {
-    hook_table->jemalloc_thread_local_arena_hook(aEnabled);
-  }
-}
-
-void
-replace_jemalloc_ptr_info(const void* aPtr, jemalloc_ptr_info_t* aInfo)
-{
-  gFuncs->jemalloc_ptr_info(aPtr, aInfo);
-  const malloc_hook_table_t* hook_table = gHookTable;
-  if (hook_table && hook_table->jemalloc_ptr_info_hook) {
-    hook_table->jemalloc_ptr_info_hook(aPtr, aInfo);
-  }
-}
-
deleted file mode 100644
--- a/memory/replace/replace/moz.build
+++ /dev/null
@@ -1,13 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-SharedLibrary('replace_malloc')
-
-SOURCES += [
-    'ReplaceMalloc.cpp',
-]
-
-DisableStlWrapping()