blob: b0f86c96b47536f118ed3fd6769e44ff002d100c [file] [log] [blame]
Kostya Serebryany4ad375f2012-05-10 13:48:04 +00001//===-- 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
20// Descriptor of user's memory block.
21struct MBlock {
22 uptr size;
23};
24
25// For user allocations.
26void *user_alloc(ThreadState *thr, uptr pc, uptr sz);
27// Does not accept NULL.
28void user_free(ThreadState *thr, uptr pc, void *p);
29void *user_realloc(ThreadState *thr, uptr pc, void *p, uptr sz);
30void *user_alloc_aligned(ThreadState *thr, uptr pc, uptr sz, uptr align);
31// Given the pointer p into a valid allocated block,
32// returns the descriptor of the block.
33MBlock *user_mblock(ThreadState *thr, void *p);
34
35enum MBlockType {
36 MBlockScopedBuf,
37 MBlockString,
38 MBlockStackTrace,
39 MBlockSync,
40 MBlockClock,
41 MBlockThreadContex,
Dmitry Vyukovf6985e32012-05-22 14:34:43 +000042 MBlockDeadInfo,
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000043 MBlockRacyStacks,
44 MBlockRacyAddresses,
45 MBlockAtExit,
46 MBlockFlag,
47 MBlockReport,
48 MBlockReportMop,
49 MBlockReportThread,
50 MBlockReportMutex,
51 MBlockReportLoc,
52 MBlockReportStack,
53 MBlockSuppression,
54 MBlockExpectRace,
55
56 // This must be the last.
57 MBlockTypeCount,
58};
59
60// For internal data structures.
61void *internal_alloc(MBlockType typ, uptr sz);
62void internal_free(void *p);
63
64template<typename T>
65void DestroyAndFree(T *&p) {
66 p->~T();
67 internal_free(p);
68 p = 0;
69}
70
71template<typename T>
72class InternalScopedBuf {
73 public:
74 explicit InternalScopedBuf(uptr cnt) {
75 cnt_ = cnt;
76 ptr_ = (T*)internal_alloc(MBlockScopedBuf, cnt * sizeof(T));
77 }
78
79 ~InternalScopedBuf() {
80 internal_free(ptr_);
81 }
82
83 operator T *() {
84 return ptr_;
85 }
86
87 T &operator[](uptr i) {
88 return ptr_[i];
89 }
90
91 T *Ptr() {
92 return ptr_;
93 }
94
95 uptr Count() {
96 return cnt_;
97 }
98
99 uptr Size() {
100 return cnt_ * sizeof(T);
101 }
102
103 private:
104 T *ptr_;
105 uptr cnt_;
106
107 InternalScopedBuf(const InternalScopedBuf&);
108 void operator = (const InternalScopedBuf&);
109};
110
111} // namespace __tsan
112#endif // TSAN_MMAN_H