blob: 53f147e40ceaffd79451dece520bcde7e9f73d90 [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,
Dmitry Vyukov5bfac972012-07-16 16:44:47 +000039 MBlockShadowStack,
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000040 MBlockSync,
41 MBlockClock,
42 MBlockThreadContex,
Dmitry Vyukovf6985e32012-05-22 14:34:43 +000043 MBlockDeadInfo,
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000044 MBlockRacyStacks,
45 MBlockRacyAddresses,
46 MBlockAtExit,
47 MBlockFlag,
48 MBlockReport,
49 MBlockReportMop,
50 MBlockReportThread,
51 MBlockReportMutex,
52 MBlockReportLoc,
53 MBlockReportStack,
54 MBlockSuppression,
55 MBlockExpectRace,
Dmitry Vyukov97c26bd2012-06-27 16:05:06 +000056 MBlockSignal,
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000057
58 // This must be the last.
59 MBlockTypeCount,
60};
61
62// For internal data structures.
63void *internal_alloc(MBlockType typ, uptr sz);
64void internal_free(void *p);
65
66template<typename T>
67void DestroyAndFree(T *&p) {
68 p->~T();
69 internal_free(p);
70 p = 0;
71}
72
73template<typename T>
74class InternalScopedBuf {
75 public:
76 explicit InternalScopedBuf(uptr cnt) {
77 cnt_ = cnt;
78 ptr_ = (T*)internal_alloc(MBlockScopedBuf, cnt * sizeof(T));
79 }
80
81 ~InternalScopedBuf() {
82 internal_free(ptr_);
83 }
84
85 operator T *() {
86 return ptr_;
87 }
88
89 T &operator[](uptr i) {
90 return ptr_[i];
91 }
92
93 T *Ptr() {
94 return ptr_;
95 }
96
97 uptr Count() {
98 return cnt_;
99 }
100
101 uptr Size() {
102 return cnt_ * sizeof(T);
103 }
104
105 private:
106 T *ptr_;
107 uptr cnt_;
108
109 InternalScopedBuf(const InternalScopedBuf&);
110 void operator = (const InternalScopedBuf&);
111};
112
113} // namespace __tsan
114#endif // TSAN_MMAN_H