tsan_mman.h revision 2e87051d136db3150a3ca322d8862f92b0a684bb
1//===-- tsan_mman.h ---------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file is a part of ThreadSanitizer (TSan), a race detector.
11//
12//===----------------------------------------------------------------------===//
13#ifndef TSAN_MMAN_H
14#define TSAN_MMAN_H
15
16#include "tsan_defs.h"
17
18namespace __tsan {
19
20const uptr kDefaultAlignment = 16;
21
22void InitializeAllocator();
23void AlloctorThreadFinish(ThreadState *thr);
24
25// For user allocations.
26void *user_alloc(ThreadState *thr, uptr pc, uptr sz,
27                 uptr align = kDefaultAlignment);
28// Does not accept NULL.
29void user_free(ThreadState *thr, uptr pc, void *p);
30void *user_realloc(ThreadState *thr, uptr pc, void *p, uptr sz);
31void *user_alloc_aligned(ThreadState *thr, uptr pc, uptr sz, uptr align);
32// Given the pointer p into a valid allocated block,
33// returns the descriptor of the block.
34MBlock *user_mblock(ThreadState *thr, void *p);
35
36enum MBlockType {
37  MBlockScopedBuf,
38  MBlockString,
39  MBlockStackTrace,
40  MBlockShadowStack,
41  MBlockSync,
42  MBlockClock,
43  MBlockThreadContex,
44  MBlockDeadInfo,
45  MBlockRacyStacks,
46  MBlockRacyAddresses,
47  MBlockAtExit,
48  MBlockFlag,
49  MBlockReport,
50  MBlockReportMop,
51  MBlockReportThread,
52  MBlockReportMutex,
53  MBlockReportLoc,
54  MBlockReportStack,
55  MBlockSuppression,
56  MBlockExpectRace,
57  MBlockSignal,
58
59  // This must be the last.
60  MBlockTypeCount,
61};
62
63// For internal data structures.
64void *internal_alloc(MBlockType typ, uptr sz);
65void internal_free(void *p);
66
67template<typename T>
68void DestroyAndFree(T *&p) {
69  p->~T();
70  internal_free(p);
71  p = 0;
72}
73
74template<typename T>
75class InternalScopedBuf {
76 public:
77  explicit InternalScopedBuf(uptr cnt) {
78    cnt_ = cnt;
79    ptr_ = (T*)internal_alloc(MBlockScopedBuf, cnt * sizeof(T));
80  }
81
82  ~InternalScopedBuf() {
83    internal_free(ptr_);
84  }
85
86  operator T *() {
87    return ptr_;
88  }
89
90  T &operator[](uptr i) {
91    return ptr_[i];
92  }
93
94  T *Ptr() {
95    return ptr_;
96  }
97
98  uptr Count() {
99    return cnt_;
100  }
101
102  uptr Size() {
103    return cnt_ * sizeof(T);
104  }
105
106 private:
107  T *ptr_;
108  uptr cnt_;
109
110  InternalScopedBuf(const InternalScopedBuf&);
111  void operator = (const InternalScopedBuf&);
112};
113
114}  // namespace __tsan
115#endif  // TSAN_MMAN_H
116