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