13cab2bb3Spatrick //===-- tsan_mman.h ---------------------------------------------*- C++ -*-===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick //
93cab2bb3Spatrick // This file is a part of ThreadSanitizer (TSan), a race detector.
103cab2bb3Spatrick //
113cab2bb3Spatrick //===----------------------------------------------------------------------===//
123cab2bb3Spatrick #ifndef TSAN_MMAN_H
133cab2bb3Spatrick #define TSAN_MMAN_H
143cab2bb3Spatrick
153cab2bb3Spatrick #include "tsan_defs.h"
163cab2bb3Spatrick
173cab2bb3Spatrick namespace __tsan {
183cab2bb3Spatrick
193cab2bb3Spatrick const uptr kDefaultAlignment = 16;
203cab2bb3Spatrick
213cab2bb3Spatrick void InitializeAllocator();
223cab2bb3Spatrick void InitializeAllocatorLate();
233cab2bb3Spatrick void ReplaceSystemMalloc();
243cab2bb3Spatrick void AllocatorProcStart(Processor *proc);
253cab2bb3Spatrick void AllocatorProcFinish(Processor *proc);
263cab2bb3Spatrick void AllocatorPrintStats();
27*810390e3Srobert void AllocatorLock();
28*810390e3Srobert void AllocatorUnlock();
29*810390e3Srobert void GlobalProcessorLock();
30*810390e3Srobert void GlobalProcessorUnlock();
313cab2bb3Spatrick
323cab2bb3Spatrick // For user allocations.
333cab2bb3Spatrick void *user_alloc_internal(ThreadState *thr, uptr pc, uptr sz,
343cab2bb3Spatrick uptr align = kDefaultAlignment, bool signal = true);
353cab2bb3Spatrick // Does not accept NULL.
363cab2bb3Spatrick void user_free(ThreadState *thr, uptr pc, void *p, bool signal = true);
373cab2bb3Spatrick // Interceptor implementations.
383cab2bb3Spatrick void *user_alloc(ThreadState *thr, uptr pc, uptr sz);
393cab2bb3Spatrick void *user_calloc(ThreadState *thr, uptr pc, uptr sz, uptr n);
403cab2bb3Spatrick void *user_realloc(ThreadState *thr, uptr pc, void *p, uptr sz);
413cab2bb3Spatrick void *user_reallocarray(ThreadState *thr, uptr pc, void *p, uptr sz, uptr n);
423cab2bb3Spatrick void *user_memalign(ThreadState *thr, uptr pc, uptr align, uptr sz);
433cab2bb3Spatrick int user_posix_memalign(ThreadState *thr, uptr pc, void **memptr, uptr align,
443cab2bb3Spatrick uptr sz);
453cab2bb3Spatrick void *user_aligned_alloc(ThreadState *thr, uptr pc, uptr align, uptr sz);
463cab2bb3Spatrick void *user_valloc(ThreadState *thr, uptr pc, uptr sz);
473cab2bb3Spatrick void *user_pvalloc(ThreadState *thr, uptr pc, uptr sz);
483cab2bb3Spatrick uptr user_alloc_usable_size(const void *p);
493cab2bb3Spatrick
503cab2bb3Spatrick // Invoking malloc/free hooks that may be installed by the user.
513cab2bb3Spatrick void invoke_malloc_hook(void *ptr, uptr size);
523cab2bb3Spatrick void invoke_free_hook(void *ptr);
533cab2bb3Spatrick
543cab2bb3Spatrick // For internal data structures.
55*810390e3Srobert void *Alloc(uptr sz);
56*810390e3Srobert void FreeImpl(void *p);
57*810390e3Srobert
58*810390e3Srobert template <typename T, typename... Args>
New(Args &&...args)59*810390e3Srobert T *New(Args &&...args) {
60*810390e3Srobert return new (Alloc(sizeof(T))) T(static_cast<Args &&>(args)...);
61*810390e3Srobert }
623cab2bb3Spatrick
633cab2bb3Spatrick template <typename T>
Free(T * & p)64*810390e3Srobert void Free(T *&p) {
65*810390e3Srobert if (p == nullptr)
66*810390e3Srobert return;
67*810390e3Srobert FreeImpl(p);
68*810390e3Srobert p = nullptr;
69*810390e3Srobert }
70*810390e3Srobert
71*810390e3Srobert template <typename T>
DestroyAndFree(T * & p)72*810390e3Srobert void DestroyAndFree(T *&p) {
73*810390e3Srobert if (p == nullptr)
74*810390e3Srobert return;
753cab2bb3Spatrick p->~T();
76*810390e3Srobert Free(p);
773cab2bb3Spatrick }
783cab2bb3Spatrick
793cab2bb3Spatrick } // namespace __tsan
803cab2bb3Spatrick #endif // TSAN_MMAN_H
81