void runtime·racefuncenter1(uintptr pc) { // If the caller PC is lessstack, use slower runtime·callers // to walk across the stack split to find the real caller. if(pc == (uintptr)runtime·lessstack) runtime·callers(2, &pc, 1); m->racecall = true; runtime∕race·FuncEnter(g->racectx, (void*)pc); m->racecall = false; }
void runtime·racefuncenter(uintptr pc) { // If the caller PC is lessstack, use slower runtime·callers // to walk across the stack split to find the real caller. // Same thing if the PC is on the heap, which should be a // closure trampoline. if(pc == (uintptr)runtime·lessstack || (pc >= (uintptr)runtime·mheap.arena_start && pc < (uintptr)runtime·mheap.arena_used)) runtime·callers(2, &pc, 1); m->racecall = true; runtime∕race·FuncEnter(g->goid-1, (void*)pc); m->racecall = false; }
static void rangeaccess(void *addr, uintptr size, uintptr step, uintptr callpc, uintptr pc, bool write) { uintptr racectx; if(!onstack((uintptr)addr)) { m->racecall = true; racectx = g->racectx; if(callpc) { if(callpc == (uintptr)runtime·lessstack) runtime·callers(3, &callpc, 1); runtime∕race·FuncEnter(racectx, (void*)callpc); } if(write) runtime∕race·WriteRange(racectx, addr, size, step, (void*)pc); else runtime∕race·ReadRange(racectx, addr, size, step, (void*)pc); if(callpc) runtime∕race·FuncExit(racectx); m->racecall = false; } }
static void memoryaccess(void *addr, uintptr callpc, uintptr pc, bool write) { int64 goid; if(!onstack((uintptr)addr)) { m->racecall = true; goid = g->goid-1; if(callpc) { if(callpc == (uintptr)runtime·lessstack || (callpc >= (uintptr)runtime·mheap.arena_start && callpc < (uintptr)runtime·mheap.arena_used)) runtime·callers(3, &callpc, 1); runtime∕race·FuncEnter(goid, (void*)callpc); } if(write) runtime∕race·Write(goid, addr, (void*)pc); else runtime∕race·Read(goid, addr, (void*)pc); if(callpc) runtime∕race·FuncExit(goid); m->racecall = false; } }