tsan_trace.h revision 0ab628c61594eb80612e5389d9c33da0e0d70c66
1//===-- tsan_trace.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_TRACE_H 14#define TSAN_TRACE_H 15 16#include "tsan_defs.h" 17#include "tsan_mutex.h" 18#include "tsan_sync.h" 19 20namespace __tsan { 21 22#ifndef TSAN_HISTORY_SIZE // in kibitraces 23#define TSAN_HISTORY_SIZE 128 24#endif 25 26const int kTracePartSize = 16 * 1024; 27const int kTraceParts = TSAN_HISTORY_SIZE * 1024 / kTracePartSize; 28const int kTraceSize = kTracePartSize * kTraceParts; 29 30// Must fit into 3 bits. 31enum EventType { 32 EventTypeMop, 33 EventTypeFuncEnter, 34 EventTypeFuncExit, 35 EventTypeLock, 36 EventTypeUnlock, 37 EventTypeRLock, 38 EventTypeRUnlock, 39}; 40 41// Represents a thread event (from most significant bit): 42// u64 typ : 3; // EventType. 43// u64 addr : 61; // Associated pc. 44typedef u64 Event; 45 46struct TraceHeader { 47 StackTrace stack0; // Start stack for the trace. 48 u64 epoch0; // Start epoch for the trace. 49#ifndef TSAN_GO 50 uptr stack0buf[kTraceStackSize]; 51#endif 52 53 TraceHeader() 54#ifndef TSAN_GO 55 : stack0(stack0buf, kTraceStackSize) 56#else 57 : stack0() 58#endif 59 , epoch0() { 60 } 61}; 62 63struct Trace { 64 Event events[kTraceSize]; 65 TraceHeader headers[kTraceParts]; 66 Mutex mtx; 67 68 Trace() 69 : mtx(MutexTypeTrace, StatMtxTrace) { 70 } 71}; 72 73} // namespace __tsan 74 75#endif // TSAN_TRACE_H 76