15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2005, Google Inc.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met:
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions of source code must retain the above copyright
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions in binary form must reproduce the above
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Neither the name of Google Inc. nor the names of its
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ---
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: Sanjay Ghemawat
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This has the implementation details of malloc_hook that are needed
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to use malloc-hook inside the tcmalloc system.  It does not hold
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// any of the client-facing calls that are used to add new hooks.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _MALLOC_HOOK_INL_H_
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _MALLOC_HOOK_INL_H_
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stddef.h>
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h>
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/atomicops.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gperftools/malloc_hook.h>
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { namespace internal {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following (implementation) code is DEPRECATED.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple atomic pointer class that can be initialized by the linker
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// when you define a namespace-scope variable as:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   AtomicPtr<Foo*> my_global = { &initial_value };
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This isn't suitable for a general atomic<> class because of the
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// public access to data_.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename PtrT>
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AtomicPtr {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(sizeof(PtrT) <= sizeof(AtomicWord),
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 PtrT_should_fit_in_AtomicWord);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PtrT Get() const {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Depending on the system, Acquire_Load(AtomicWord*) may have
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // been defined to return an AtomicWord, Atomic32, or Atomic64.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We hide that implementation detail here with an explicit cast.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This prevents MSVC 2005, at least, from complaining (it has to
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // do with __wp64; AtomicWord is __wp64, but Atomic32/64 aren't).
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return reinterpret_cast<PtrT>(static_cast<AtomicWord>(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::subtle::Acquire_Load(&data_)));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the contained value to new_val and returns the old value,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // atomically, with acquire and release semantics.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a full-barrier instruction.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PtrT Exchange(PtrT new_val);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Atomically executes:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //      result = data_
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //      if (data_ == old_val)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //        data_ = new_val;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //      return result;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a full-barrier instruction.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PtrT CompareAndSwap(PtrT old_val, PtrT new_val);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not private so that the class is an aggregate and can be
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // initialized by the linker. Don't access this directly.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AtomicWord data_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These are initialized in malloc_hook.cc
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern AtomicPtr<MallocHook::NewHook>     new_hook_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern AtomicPtr<MallocHook::DeleteHook>  delete_hook_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern AtomicPtr<MallocHook::PreMmapHook> premmap_hook_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern AtomicPtr<MallocHook::MmapHook>    mmap_hook_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern AtomicPtr<MallocHook::MunmapHook>  munmap_hook_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern AtomicPtr<MallocHook::MremapHook>  mremap_hook_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern AtomicPtr<MallocHook::PreSbrkHook> presbrk_hook_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern AtomicPtr<MallocHook::SbrkHook>    sbrk_hook_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// End DEPRECATED code.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maximum of 7 hooks means that HookList is 8 words.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kHookListMaxValues = 7;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HookList: a class that provides synchronized insertions and removals and
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// lockless traversal.  Most of the implementation is in malloc_hook.cc.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T>
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PERFTOOLS_DLL_DECL HookList {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(sizeof(T) <= sizeof(AtomicWord), T_should_fit_in_AtomicWord);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds value to the list.  Note that duplicates are allowed.  Thread-safe and
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // blocking (acquires hooklist_spinlock).  Returns true on success; false
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // otherwise (failures include invalid value and no space left).
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Add(T value);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes the first entry matching value from the list.  Thread-safe and
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // blocking (acquires hooklist_spinlock).  Returns true on success; false
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // otherwise (failures include invalid value and no value found).
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Remove(T value);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Store up to n values of the list in output_array, and return the number of
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // elements stored.  Thread-safe and non-blocking.  This is fast (one memory
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // access) if the list is empty.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int Traverse(T* output_array, int n) const;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fast inline implementation for fast path of Invoke*Hook.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool empty() const {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::subtle::Acquire_Load(&priv_end) == 0;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This internal data is not private so that the class is an aggregate and can
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be initialized by the linker.  Don't access this directly.  Use the
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // INIT_HOOK_LIST macro in malloc_hook.cc.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // One more than the index of the last valid element in priv_data.  During
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 'Remove' this may be past the last valid element in priv_data, but
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // subsequent values will be 0.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AtomicWord priv_end;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AtomicWord priv_data[kHookListMaxValues];
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern HookList<MallocHook::NewHook> new_hooks_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern HookList<MallocHook::DeleteHook> delete_hooks_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern HookList<MallocHook::PreMmapHook> premmap_hooks_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern HookList<MallocHook::MmapHook> mmap_hooks_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern HookList<MallocHook::MmapReplacement> mmap_replacement_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern HookList<MallocHook::MunmapHook> munmap_hooks_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern HookList<MallocHook::MunmapReplacement> munmap_replacement_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern HookList<MallocHook::MremapHook> mremap_hooks_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern HookList<MallocHook::PreSbrkHook> presbrk_hooks_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern HookList<MallocHook::SbrkHook> sbrk_hooks_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} }  // namespace base::internal
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following method is DEPRECATED
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline MallocHook::NewHook MallocHook::GetNewHook() {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::internal::new_hook_.Get();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void MallocHook::InvokeNewHook(const void* p, size_t s) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!base::internal::new_hooks_.empty()) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InvokeNewHookSlow(p, s);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following code is DEPRECATED.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MallocHook::NewHook hook = MallocHook::GetNewHook();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (hook != NULL) (*hook)(p, s);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // End DEPRECATED code.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following method is DEPRECATED
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline MallocHook::DeleteHook MallocHook::GetDeleteHook() {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::internal::delete_hook_.Get();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void MallocHook::InvokeDeleteHook(const void* p) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!base::internal::delete_hooks_.empty()) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InvokeDeleteHookSlow(p);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following code is DEPRECATED.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MallocHook::DeleteHook hook = MallocHook::GetDeleteHook();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (hook != NULL) (*hook)(p);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // End DEPRECATED code.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following method is DEPRECATED
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline MallocHook::PreMmapHook MallocHook::GetPreMmapHook() {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::internal::premmap_hook_.Get();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void MallocHook::InvokePreMmapHook(const void* start,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          size_t size,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          int protection,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          int flags,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          int fd,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          off_t offset) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!base::internal::premmap_hooks_.empty()) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InvokePreMmapHookSlow(start, size, protection, flags, fd, offset);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following code is DEPRECATED.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MallocHook::PreMmapHook hook = MallocHook::GetPreMmapHook();
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (hook != NULL) (*hook)(start, size,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            protection, flags,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            fd, offset);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // End DEPRECATED code.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following method is DEPRECATED
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline MallocHook::MmapHook MallocHook::GetMmapHook() {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::internal::mmap_hook_.Get();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void MallocHook::InvokeMmapHook(const void* result,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const void* start,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       size_t size,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int protection,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int flags,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int fd,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       off_t offset) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!base::internal::mmap_hooks_.empty()) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InvokeMmapHookSlow(result, start, size, protection, flags, fd, offset);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following code is DEPRECATED.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MallocHook::MmapHook hook = MallocHook::GetMmapHook();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (hook != NULL) (*hook)(result,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            start, size,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            protection, flags,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            fd, offset);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // End DEPRECATED code.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool MallocHook::InvokeMmapReplacement(const void* start,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              size_t size,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              int protection,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              int flags,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              int fd,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              off_t offset,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              void** result) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!base::internal::mmap_replacement_.empty()) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InvokeMmapReplacementSlow(start, size,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     protection, flags,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     fd, offset,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     result);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following method is DEPRECATED
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline MallocHook::MunmapHook MallocHook::GetMunmapHook() {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::internal::munmap_hook_.Get();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void MallocHook::InvokeMunmapHook(const void* p, size_t size) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!base::internal::munmap_hooks_.empty()) {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InvokeMunmapHookSlow(p, size);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following code is DEPRECATED.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MallocHook::MunmapHook hook = MallocHook::GetMunmapHook();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (hook != NULL) (*hook)(p, size);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // End DEPRECATED code.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool MallocHook::InvokeMunmapReplacement(
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const void* p, size_t size, int* result) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!base::internal::mmap_replacement_.empty()) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InvokeMunmapReplacementSlow(p, size, result);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following method is DEPRECATED
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline MallocHook::MremapHook MallocHook::GetMremapHook() {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::internal::mremap_hook_.Get();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void MallocHook::InvokeMremapHook(const void* result,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const void* old_addr,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         size_t old_size,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         size_t new_size,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int flags,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const void* new_addr) {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!base::internal::mremap_hooks_.empty()) {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InvokeMremapHookSlow(result, old_addr, old_size, new_size, flags, new_addr);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following code is DEPRECATED.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MallocHook::MremapHook hook = MallocHook::GetMremapHook();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (hook != NULL) (*hook)(result,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            old_addr, old_size,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            new_size, flags, new_addr);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // End DEPRECATED code.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following method is DEPRECATED
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline MallocHook::PreSbrkHook MallocHook::GetPreSbrkHook() {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::internal::presbrk_hook_.Get();
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void MallocHook::InvokePreSbrkHook(ptrdiff_t increment) {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!base::internal::presbrk_hooks_.empty() && increment != 0) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InvokePreSbrkHookSlow(increment);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following code is DEPRECATED.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MallocHook::PreSbrkHook hook = MallocHook::GetPreSbrkHook();
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (hook != NULL && increment != 0) (*hook)(increment);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // End DEPRECATED code.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following method is DEPRECATED
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline MallocHook::SbrkHook MallocHook::GetSbrkHook() {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::internal::sbrk_hook_.Get();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void MallocHook::InvokeSbrkHook(const void* result,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       ptrdiff_t increment) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!base::internal::sbrk_hooks_.empty() && increment != 0) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InvokeSbrkHookSlow(result, increment);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following code is DEPRECATED.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MallocHook::SbrkHook hook = MallocHook::GetSbrkHook();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (hook != NULL && increment != 0) (*hook)(result, increment);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // End DEPRECATED code.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* _MALLOC_HOOK_INL_H_ */
323