1  //===-- tsan_mman.h ---------------------------------------------*- C++ -*-===//
       2  //
       3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
       4  // See https://llvm.org/LICENSE.txt for license information.
       5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
       6  //
       7  //===----------------------------------------------------------------------===//
       8  //
       9  // This file is a part of ThreadSanitizer (TSan), a race detector.
      10  //
      11  //===----------------------------------------------------------------------===//
      12  #ifndef TSAN_MMAN_H
      13  #define TSAN_MMAN_H
      14  
      15  #include "tsan_defs.h"
      16  
      17  namespace __tsan {
      18  
      19  const uptr kDefaultAlignment = 16;
      20  
      21  void InitializeAllocator();
      22  void InitializeAllocatorLate();
      23  void ReplaceSystemMalloc();
      24  void AllocatorProcStart(Processor *proc);
      25  void AllocatorProcFinish(Processor *proc);
      26  void AllocatorPrintStats();
      27  void AllocatorLock();
      28  void AllocatorUnlock();
      29  void GlobalProcessorLock();
      30  void GlobalProcessorUnlock();
      31  
      32  // For user allocations.
      33  void *user_alloc_internal(ThreadState *thr, uptr pc, uptr sz,
      34                            uptr align = kDefaultAlignment, bool signal = true);
      35  // Does not accept NULL.
      36  void user_free(ThreadState *thr, uptr pc, void *p, bool signal = true);
      37  // Interceptor implementations.
      38  void *user_alloc(ThreadState *thr, uptr pc, uptr sz);
      39  void *user_calloc(ThreadState *thr, uptr pc, uptr sz, uptr n);
      40  void *user_realloc(ThreadState *thr, uptr pc, void *p, uptr sz);
      41  void *user_reallocarray(ThreadState *thr, uptr pc, void *p, uptr sz, uptr n);
      42  void *user_memalign(ThreadState *thr, uptr pc, uptr align, uptr sz);
      43  int user_posix_memalign(ThreadState *thr, uptr pc, void **memptr, uptr align,
      44                          uptr sz);
      45  void *user_aligned_alloc(ThreadState *thr, uptr pc, uptr align, uptr sz);
      46  void *user_valloc(ThreadState *thr, uptr pc, uptr sz);
      47  void *user_pvalloc(ThreadState *thr, uptr pc, uptr sz);
      48  uptr user_alloc_usable_size(const void *p);
      49  
      50  // Invoking malloc/free hooks that may be installed by the user.
      51  void invoke_malloc_hook(void *ptr, uptr size);
      52  void invoke_free_hook(void *ptr);
      53  
      54  // For internal data structures.
      55  void *Alloc(uptr sz);
      56  void FreeImpl(void *p);
      57  
      58  template <typename T, typename... Args>
      59  T *New(Args &&...args) {
      60    return new (Alloc(sizeof(T))) T(static_cast<Args &&>(args)...);
      61  }
      62  
      63  template <typename T>
      64  void Free(T *&p) {
      65    if (p == nullptr)
      66      return;
      67    FreeImpl(p);
      68    p = nullptr;
      69  }
      70  
      71  template <typename T>
      72  void DestroyAndFree(T *&p) {
      73    if (p == nullptr)
      74      return;
      75    p->~T();
      76    Free(p);
      77  }
      78  
      79  }  // namespace __tsan
      80  #endif  // TSAN_MMAN_H