d: Merge upstream dmd, druntime c8ae4adb2e, phobos 792c8b7c1.
[official-gcc.git] / libsanitizer / tsan / tsan_mman.h
blob2095f28c0253e47a95aa1f8a2db9665b1d157cbc
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.
11 //===----------------------------------------------------------------------===//
12 #ifndef TSAN_MMAN_H
13 #define TSAN_MMAN_H
15 #include "tsan_defs.h"
17 namespace __tsan {
19 const uptr kDefaultAlignment = 16;
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();
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);
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);
54 // For internal data structures.
55 void *Alloc(uptr sz);
56 void FreeImpl(void *p);
58 template <typename T, typename... Args>
59 T *New(Args &&...args) {
60 return new (Alloc(sizeof(T))) T(static_cast<Args &&>(args)...);
63 template <typename T>
64 void Free(T *&p) {
65 if (p == nullptr)
66 return;
67 FreeImpl(p);
68 p = nullptr;
71 template <typename T>
72 void DestroyAndFree(T *&p) {
73 if (p == nullptr)
74 return;
75 p->~T();
76 Free(p);
79 } // namespace __tsan
80 #endif // TSAN_MMAN_H