runtime·mallocgc ( uintptr size , uintptr typ , uint32 flag ) { int32 sizeclass; uintptr tinysize , size1; intgo rate; MCache *c; MSpan *s; MLink *v , *next; byte *tiny; #line 49 "/home/14/ren/source/golang/go/src/pkg/runtime/malloc.goc" if ( size == 0 ) { #line 53 "/home/14/ren/source/golang/go/src/pkg/runtime/malloc.goc" return &runtime·zerobase; } if ( m->mallocing ) runtime·throw ( "malloc/free - deadlock" ) ; #line 59 "/home/14/ren/source/golang/go/src/pkg/runtime/malloc.goc" m->locks++; m->mallocing = 1; #line 62 "/home/14/ren/source/golang/go/src/pkg/runtime/malloc.goc" if ( DebugTypeAtBlockEnd ) size += sizeof ( uintptr ) ; #line 65 "/home/14/ren/source/golang/go/src/pkg/runtime/malloc.goc" c = m->mcache; if ( !runtime·debug.efence && size <= MaxSmallSize ) { if ( ( flag& ( FlagNoScan|FlagNoGC ) ) == FlagNoScan && size < TinySize ) { #line 98 "/home/14/ren/source/golang/go/src/pkg/runtime/malloc.goc" tinysize = c->tinysize; if ( size <= tinysize ) { tiny = c->tiny; #line 102 "/home/14/ren/source/golang/go/src/pkg/runtime/malloc.goc" if ( ( size&7 ) == 0 ) tiny = ( byte* ) ROUND ( ( uintptr ) tiny , 8 ) ; else if ( ( size&3 ) == 0 ) tiny = ( byte* ) ROUND ( ( uintptr ) tiny , 4 ) ; else if ( ( size&1 ) == 0 ) tiny = ( byte* ) ROUND ( ( uintptr ) tiny , 2 ) ; size1 = size + ( tiny - c->tiny ) ; if ( size1 <= tinysize ) { #line 111 "/home/14/ren/source/golang/go/src/pkg/runtime/malloc.goc" v = ( MLink* ) tiny; c->tiny += size1; c->tinysize -= size1; m->mallocing = 0; m->locks--; if ( m->locks == 0 && g->preempt ) g->stackguard0 = StackPreempt; return v; } } #line 122 "/home/14/ren/source/golang/go/src/pkg/runtime/malloc.goc" s = c->alloc[TinySizeClass]; if ( s->freelist == nil ) s = runtime·MCache_Refill ( c , TinySizeClass ) ; v = s->freelist; next = v->next; s->freelist = next; s->ref++; if ( next != nil ) PREFETCH ( next ) ; ( ( uint64* ) v ) [0] = 0; ( ( uint64* ) v ) [1] = 0; #line 135 "/home/14/ren/source/golang/go/src/pkg/runtime/malloc.goc" if ( TinySize-size > tinysize ) { c->tiny = ( byte* ) v + size; c->tinysize = TinySize - size; } size = TinySize; goto done; } #line 144 "/home/14/ren/source/golang/go/src/pkg/runtime/malloc.goc" if ( size <= 1024-8 ) sizeclass = runtime·size_to_class8[ ( size+7 ) >>3]; else sizeclass = runtime·size_to_class128[ ( size-1024+127 ) >> 7]; size = runtime·class_to_size[sizeclass]; s = c->alloc[sizeclass]; if ( s->freelist == nil ) s = runtime·MCache_Refill ( c , sizeclass ) ; v = s->freelist; next = v->next; s->freelist = next; s->ref++; if ( next != nil ) PREFETCH ( next ) ; if ( ! ( flag & FlagNoZero ) ) { v->next = nil; #line 161 "/home/14/ren/source/golang/go/src/pkg/runtime/malloc.goc" if ( size > 2*sizeof ( uintptr ) && ( ( uintptr* ) v ) [1] != 0 ) runtime·memclr ( ( byte* ) v , size ) ; } done: c->local_cachealloc += size; } else {
// mcallable cache refill void runtime·mcacheRefill_m(void) { runtime·MCache_Refill(g->m->mcache, (int32)g->m->scalararg[0]); }