// Initialize the heap; fetch memory using alloc. void runtime·MHeap_Init(MHeap *h, void *(*alloc)(uintptr)) { uint32 i; runtime·FixAlloc_Init(&h->spanalloc, sizeof(MSpan), alloc, RecordSpan, h); runtime·FixAlloc_Init(&h->cachealloc, sizeof(MCache), alloc, nil, nil); // h->mapcache needs no init for(i=0; i<nelem(h->free); i++) runtime·MSpanList_Init(&h->free[i]); runtime·MSpanList_Init(&h->large); for(i=0; i<nelem(h->central); i++) runtime·MCentral_Init(&h->central[i], i); }
// Initialize the heap; fetch memory using alloc. void runtime·MHeap_Init(MHeap *h) { uint32 i; runtime·FixAlloc_Init(&h->spanalloc, sizeof(MSpan), RecordSpan, h, &mstats.mspan_sys); runtime·FixAlloc_Init(&h->cachealloc, sizeof(MCache), nil, nil, &mstats.mcache_sys); runtime·FixAlloc_Init(&h->specialfinalizeralloc, sizeof(SpecialFinalizer), nil, nil, &mstats.other_sys); runtime·FixAlloc_Init(&h->specialprofilealloc, sizeof(SpecialProfile), nil, nil, &mstats.other_sys); // h->mapcache needs no init for(i=0; i<nelem(h->free); i++) { runtime·MSpanList_Init(&h->free[i]); runtime·MSpanList_Init(&h->busy[i]); } runtime·MSpanList_Init(&h->freelarge); runtime·MSpanList_Init(&h->busylarge); for(i=0; i<nelem(h->central); i++) runtime·MCentral_Init(&h->central[i].mcentral, i); }
static void mcommoninit(M *m) { m->id = runtime·sched.mcount++; m->fastrand = 0x49f6428aUL + m->id + runtime·cputicks(); m->stackalloc = runtime·malloc(sizeof(*m->stackalloc)); runtime·FixAlloc_Init(m->stackalloc, FixedStack, runtime·SysAlloc, nil, nil); if(m->mcache == nil) m->mcache = runtime·allocmcache(); runtime·callers(1, m->createstack, nelem(m->createstack)); // Add to runtime·allm so garbage collector doesn't free m // when it is just in a register or thread-local storage. m->alllink = runtime·allm; // runtime·NumCgoCall() iterates over allm w/o schedlock, // so we need to publish it safely. runtime·atomicstorep(&runtime·allm, m); }