void runtime·stackfree(G *gp, void *v, Stktop *top) { uint32 pos; uintptr n; n = (uintptr)(top+1) - (uintptr)v; if(StackDebug >= 1) runtime·printf("stackfree %p %d\n", v, (int32)n); gp->stacksize -= n; if(runtime·debug.efence || StackFromSystem) { if(runtime·debug.efence || StackFaultOnFree) runtime·SysFault(v, n); else runtime·SysFree(v, n, &mstats.stacks_sys); return; } if(top->malloced) { runtime·free(v); return; } if(n != FixedStack) runtime·throw("stackfree: bad fixed size"); if(m->stackcachecnt == StackCacheSize) stackcacherelease(); pos = m->stackcachepos; m->stackcache[pos] = v; m->stackcachepos = (pos + 1) % StackCacheSize; m->stackcachecnt++; m->stackinuse--; }
void runtime·stackfree(void *v, uintptr n) { uint32 pos; if(n == FixedStack || m->mallocing || m->gcing) { if(m->stackcachecnt == StackCacheSize) stackcacherelease(); pos = m->stackcachepos; m->stackcache[pos] = v; m->stackcachepos = (pos + 1) % StackCacheSize; m->stackcachecnt++; m->stackinuse--; return; } runtime·free(v); }