1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- //===-- tsan_trace.h --------------------------------------------*- C++ -*-===//
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- //
- // This file is a part of ThreadSanitizer (TSan), a race detector.
- //
- //===----------------------------------------------------------------------===//
- #ifndef TSAN_TRACE_H
- #define TSAN_TRACE_H
- #include "tsan_defs.h"
- #include "tsan_mutex.h"
- #include "tsan_stack_trace.h"
- #include "tsan_mutexset.h"
- namespace __tsan {
- const int kTracePartSizeBits = 14;
- const int kTracePartSize = 1 << kTracePartSizeBits;
- const int kTraceParts = 4 * 1024 * 1024 / kTracePartSize;
- const int kTraceSize = kTracePartSize * kTraceParts;
- // Must fit into 3 bits.
- enum EventType {
- EventTypeMop,
- EventTypeFuncEnter,
- EventTypeFuncExit,
- EventTypeLock,
- EventTypeUnlock,
- EventTypeRLock,
- EventTypeRUnlock
- };
- // Represents a thread event (from most significant bit):
- // u64 typ : 3; // EventType.
- // u64 addr : 61; // Associated pc.
- typedef u64 Event;
- struct TraceHeader {
- #ifndef TSAN_GO
- BufferedStackTrace stack0; // Start stack for the trace.
- #else
- VarSizeStackTrace stack0;
- #endif
- u64 epoch0; // Start epoch for the trace.
- MutexSet mset0;
- TraceHeader() : stack0(), epoch0() {}
- };
- struct Trace {
- TraceHeader headers[kTraceParts];
- Mutex mtx;
- #ifndef TSAN_GO
- // Must be last to catch overflow as paging fault.
- // Go shadow stack is dynamically allocated.
- uptr shadow_stack[kShadowStackSize];
- #endif
- Trace()
- : mtx(MutexTypeTrace, StatMtxTrace) {
- }
- };
- } // namespace __tsan
- #endif // TSAN_TRACE_H
|