1//===-- tsan_rtl_proc.cc ------------------------------------------------===// 2// 3// This file is distributed under the University of Illinois Open Source 4// License. See LICENSE.TXT for details. 5// 6//===----------------------------------------------------------------------===// 7// 8// This file is a part of ThreadSanitizer (TSan), a race detector. 9// 10//===----------------------------------------------------------------------===// 11 12#include "sanitizer_common/sanitizer_placement_new.h" 13#include "tsan_rtl.h" 14#include "tsan_mman.h" 15#include "tsan_flags.h" 16 17namespace __tsan { 18 19Processor *ProcCreate() { 20 void *mem = InternalAlloc(sizeof(Processor)); 21 internal_memset(mem, 0, sizeof(Processor)); 22 Processor *proc = new(mem) Processor; 23 proc->thr = nullptr; 24#if !SANITIZER_GO 25 AllocatorProcStart(proc); 26#endif 27 if (common_flags()->detect_deadlocks) 28 proc->dd_pt = ctx->dd->CreatePhysicalThread(); 29 return proc; 30} 31 32void ProcDestroy(Processor *proc) { 33 CHECK_EQ(proc->thr, nullptr); 34#if !SANITIZER_GO 35 AllocatorProcFinish(proc); 36#endif 37 ctx->clock_alloc.FlushCache(&proc->clock_cache); 38 ctx->metamap.OnProcIdle(proc); 39 if (common_flags()->detect_deadlocks) 40 ctx->dd->DestroyPhysicalThread(proc->dd_pt); 41 proc->~Processor(); 42 InternalFree(proc); 43} 44 45void ProcWire(Processor *proc, ThreadState *thr) { 46 CHECK_EQ(thr->proc1, nullptr); 47 CHECK_EQ(proc->thr, nullptr); 48 thr->proc1 = proc; 49 proc->thr = thr; 50} 51 52void ProcUnwire(Processor *proc, ThreadState *thr) { 53 CHECK_EQ(thr->proc1, proc); 54 CHECK_EQ(proc->thr, thr); 55 thr->proc1 = nullptr; 56 proc->thr = nullptr; 57} 58 59} // namespace __tsan 60