diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2017-01-03 22:58:48 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2017-01-03 22:58:48 +0000 |
commit | 0f2a6e84c6e4edd122228be318a014dd88d1c4f2 (patch) | |
tree | 3478fe1adc6005eb49dda8f1c31857b5324fb886 /libgo/runtime | |
parent | c65f76af364733b576d738af315811a68d23886d (diff) | |
download | gcc-0f2a6e84c6e4edd122228be318a014dd88d1c4f2.zip gcc-0f2a6e84c6e4edd122228be318a014dd88d1c4f2.tar.gz gcc-0f2a6e84c6e4edd122228be318a014dd88d1c4f2.tar.bz2 |
runtime: remove __go_alloc and __go_free
Move allocg and handling of allgs slice from C to Go.
Reviewed-on: https://go-review.googlesource.com/34797
From-SVN: r244036
Diffstat (limited to 'libgo/runtime')
-rw-r--r-- | libgo/runtime/go-libmain.c | 1 | ||||
-rw-r--r-- | libgo/runtime/go-main.c | 1 | ||||
-rw-r--r-- | libgo/runtime/go-new.c | 1 | ||||
-rw-r--r-- | libgo/runtime/go-reflect-call.c | 1 | ||||
-rw-r--r-- | libgo/runtime/go-unwind.c | 1 | ||||
-rw-r--r-- | libgo/runtime/heapdump.c | 4 | ||||
-rw-r--r-- | libgo/runtime/malloc.goc | 105 | ||||
-rw-r--r-- | libgo/runtime/mgc0.c | 7 | ||||
-rw-r--r-- | libgo/runtime/parfor.c | 3 | ||||
-rw-r--r-- | libgo/runtime/proc.c | 322 | ||||
-rw-r--r-- | libgo/runtime/runtime.h | 13 | ||||
-rw-r--r-- | libgo/runtime/runtime_c.c | 3 |
12 files changed, 36 insertions, 426 deletions
diff --git a/libgo/runtime/go-libmain.c b/libgo/runtime/go-libmain.c index a404eb9..8e07e90 100644 --- a/libgo/runtime/go-libmain.c +++ b/libgo/runtime/go-libmain.c @@ -13,7 +13,6 @@ #include <unistd.h> #include "runtime.h" -#include "go-alloc.h" #include "array.h" #include "arch.h" #include "malloc.h" diff --git a/libgo/runtime/go-main.c b/libgo/runtime/go-main.c index b8c9af1..dba8085 100644 --- a/libgo/runtime/go-main.c +++ b/libgo/runtime/go-main.c @@ -15,7 +15,6 @@ #endif #include "runtime.h" -#include "go-alloc.h" #include "array.h" #include "arch.h" #include "malloc.h" diff --git a/libgo/runtime/go-new.c b/libgo/runtime/go-new.c index 01bc2af..da44074 100644 --- a/libgo/runtime/go-new.c +++ b/libgo/runtime/go-new.c @@ -4,7 +4,6 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. */ -#include "go-alloc.h" #include "runtime.h" #include "arch.h" #include "malloc.h" diff --git a/libgo/runtime/go-reflect-call.c b/libgo/runtime/go-reflect-call.c index dc2f605..6a9a7f3 100644 --- a/libgo/runtime/go-reflect-call.c +++ b/libgo/runtime/go-reflect-call.c @@ -9,7 +9,6 @@ #include <stdlib.h> #include "runtime.h" -#include "go-alloc.h" #include "go-assert.h" #include "go-type.h" diff --git a/libgo/runtime/go-unwind.c b/libgo/runtime/go-unwind.c index 9e85b4b..4c9fb49 100644 --- a/libgo/runtime/go-unwind.c +++ b/libgo/runtime/go-unwind.c @@ -14,7 +14,6 @@ #include "unwind-pe.h" #include "runtime.h" -#include "go-alloc.h" /* The code for a Go exception. */ diff --git a/libgo/runtime/heapdump.c b/libgo/runtime/heapdump.c index 80d2b7b..c050541 100644 --- a/libgo/runtime/heapdump.c +++ b/libgo/runtime/heapdump.c @@ -311,8 +311,8 @@ dumpgs(void) uint32 i; // goroutines & stacks - for(i = 0; i < runtime_allglen; i++) { - gp = runtime_allg[i]; + for(i = 0; i < runtime_getallglen(); i++) { + gp = runtime_getallg(i); switch(gp->atomicstatus){ default: runtime_printf("unexpected G.status %d\n", gp->atomicstatus); diff --git a/libgo/runtime/malloc.goc b/libgo/runtime/malloc.goc index 5cbdc46..1e6704c 100644 --- a/libgo/runtime/malloc.goc +++ b/libgo/runtime/malloc.goc @@ -10,7 +10,6 @@ package runtime #include <stddef.h> #include <errno.h> #include <stdlib.h> -#include "go-alloc.h" #include "runtime.h" #include "arch.h" #include "malloc.h" @@ -308,107 +307,6 @@ runtime_profilealloc(void *v, uintptr size) runtime_MProf_Malloc(v, size); } -void* -__go_alloc(uintptr size) -{ - return runtime_mallocgc(size, 0, FlagNoInvokeGC); -} - -// Free the object whose base pointer is v. -void -__go_free(void *v) -{ - M *m; - int32 sizeclass; - MSpan *s; - MCache *c; - uintptr size; - - if(v == nil) - return; - - // If you change this also change mgc0.c:/^sweep, - // which has a copy of the guts of free. - - m = runtime_m(); - if(m->mallocing) - runtime_throw("malloc/free - deadlock"); - m->mallocing = 1; - - if(!runtime_mlookup(v, nil, nil, &s)) { - runtime_printf("free %p: not an allocated block\n", v); - runtime_throw("free runtime_mlookup"); - } - size = s->elemsize; - sizeclass = s->sizeclass; - // Objects that are smaller than TinySize can be allocated using tiny alloc, - // if then such object is combined with an object with finalizer, we will crash. - if(size < TinySize) - runtime_throw("freeing too small block"); - - if(runtime_debug.allocfreetrace) - runtime_tracefree(v, size); - - // Ensure that the span is swept. - // If we free into an unswept span, we will corrupt GC bitmaps. - runtime_MSpan_EnsureSwept(s); - - if(s->specials != nil) - runtime_freeallspecials(s, v, size); - - c = m->mcache; - if(sizeclass == 0) { - // Large object. - s->needzero = 1; - // Must mark v freed before calling unmarkspan and MHeap_Free: - // they might coalesce v into other spans and change the bitmap further. - runtime_markfreed(v); - runtime_unmarkspan(v, 1<<PageShift); - // NOTE(rsc,dvyukov): The original implementation of efence - // in CL 22060046 used SysFree instead of SysFault, so that - // the operating system would eventually give the memory - // back to us again, so that an efence program could run - // longer without running out of memory. Unfortunately, - // calling SysFree here without any kind of adjustment of the - // heap data structures means that when the memory does - // come back to us, we have the wrong metadata for it, either in - // the MSpan structures or in the garbage collection bitmap. - // Using SysFault here means that the program will run out of - // memory fairly quickly in efence mode, but at least it won't - // have mysterious crashes due to confused memory reuse. - // It should be possible to switch back to SysFree if we also - // implement and then call some kind of MHeap_DeleteSpan. - if(runtime_debug.efence) - runtime_SysFault((void*)(s->start<<PageShift), size); - else - runtime_MHeap_Free(&runtime_mheap, s, 1); - c->local_nlargefree++; - c->local_largefree += size; - } else { - // Small object. - if(size > 2*sizeof(uintptr)) - ((uintptr*)v)[1] = (uintptr)0xfeedfeedfeedfeedll; // mark as "needs to be zeroed" - else if(size > sizeof(uintptr)) - ((uintptr*)v)[1] = 0; - // Must mark v freed before calling MCache_Free: - // it might coalesce v and other blocks into a bigger span - // and change the bitmap further. - c->local_nsmallfree[sizeclass]++; - c->local_cachealloc -= size; - if(c->alloc[sizeclass] == s) { - // We own the span, so we can just add v to the freelist - runtime_markfreed(v); - ((MLink*)v)->next = s->freelist; - s->freelist = v; - s->ref--; - } else { - // Someone else owns this span. Add to free queue. - runtime_MCache_Free(c, v, sizeclass, size); - } - } - m->mallocing = 0; -} - int32 runtime_mlookup(void *v, byte **base, uintptr *size, MSpan **sp) { @@ -628,9 +526,6 @@ runtime_mallocinit(void) // Initialize the rest of the allocator. runtime_MHeap_Init(&runtime_mheap); runtime_m()->mcache = runtime_allocmcache(); - - // See if it works. - runtime_free(runtime_malloc(TinySize)); } void* diff --git a/libgo/runtime/mgc0.c b/libgo/runtime/mgc0.c index aa8404e..5d6275a 100644 --- a/libgo/runtime/mgc0.c +++ b/libgo/runtime/mgc0.c @@ -1279,7 +1279,6 @@ markroot(ParFor *desc, uint32 i) // For gccgo we use this for all the other global roots. enqueue1(&wbuf, (Obj){(byte*)&runtime_m0, sizeof runtime_m0, 0}); enqueue1(&wbuf, (Obj){(byte*)&runtime_g0, sizeof runtime_g0, 0}); - enqueue1(&wbuf, (Obj){(byte*)&runtime_allg, sizeof runtime_allg, 0}); enqueue1(&wbuf, (Obj){(byte*)&runtime_allm, sizeof runtime_allm, 0}); enqueue1(&wbuf, (Obj){(byte*)&runtime_allp, sizeof runtime_allp, 0}); enqueue1(&wbuf, (Obj){(byte*)&work, sizeof work, 0}); @@ -1334,9 +1333,9 @@ markroot(ParFor *desc, uint32 i) default: // the rest is scanning goroutine stacks - if(i - RootCount >= runtime_allglen) + if(i - RootCount >= runtime_getallglen()) runtime_throw("markroot: bad index"); - gp = runtime_allg[i - RootCount]; + gp = runtime_getallg(i - RootCount); // remember when we've first observed the G blocked // needed only to output in traceback if((gp->atomicstatus == _Gwaiting || gp->atomicstatus == _Gsyscall) && gp->waitsince == 0) @@ -2243,7 +2242,7 @@ gc(struct gc_args *args) work.nwait = 0; work.ndone = 0; work.nproc = runtime_gcprocs(); - runtime_parforsetup(work.markfor, work.nproc, RootCount + runtime_allglen, false, &markroot_funcval); + runtime_parforsetup(work.markfor, work.nproc, RootCount + runtime_getallglen(), false, &markroot_funcval); if(work.nproc > 1) { runtime_noteclear(&work.alldone); runtime_helpgc(work.nproc); diff --git a/libgo/runtime/parfor.c b/libgo/runtime/parfor.c index ede921b..c2f10b9 100644 --- a/libgo/runtime/parfor.c +++ b/libgo/runtime/parfor.c @@ -5,6 +5,7 @@ // Parallel for algorithm. #include "runtime.h" +#include "malloc.h" #include "arch.h" struct ParForThread @@ -27,7 +28,7 @@ runtime_parforalloc(uint32 nthrmax) // The ParFor object is followed by CacheLineSize padding // and then nthrmax ParForThread. - desc = (ParFor*)runtime_malloc(sizeof(ParFor) + CacheLineSize + nthrmax * sizeof(ParForThread)); + desc = (ParFor*)runtime_mallocgc(sizeof(ParFor) + CacheLineSize + nthrmax * sizeof(ParForThread), 0, FlagNoInvokeGC); desc->thr = (ParForThread*)((byte*)(desc+1) + CacheLineSize); desc->nthrmax = nthrmax; return desc; diff --git a/libgo/runtime/proc.c b/libgo/runtime/proc.c index 586a632..8a7a2d7 100644 --- a/libgo/runtime/proc.c +++ b/libgo/runtime/proc.c @@ -361,6 +361,10 @@ enum extern Sched* runtime_getsched() __asm__ (GOSYM_PREFIX "runtime.getsched"); extern bool* runtime_getCgoHasExtraM() __asm__ (GOSYM_PREFIX "runtime.getCgoHasExtraM"); +extern P** runtime_getAllP() + __asm__ (GOSYM_PREFIX "runtime.getAllP"); +extern G* allocg(void) + __asm__ (GOSYM_PREFIX "runtime.allocg"); Sched* runtime_sched; int32 runtime_gomaxprocs; @@ -374,11 +378,6 @@ int32 runtime_ncpu; bool runtime_precisestack; static int32 newprocs; -static Lock allglock; // the following vars are protected by this lock or by stoptheworld -G** runtime_allg; -uintptr runtime_allglen; -static uintptr allgcap; - bool runtime_isarchive; void* runtime_mstart(void*); @@ -403,7 +402,6 @@ static void startlockedm(G*); static void sysmon(void); static uint32 retake(int64); static void incidlelocked(int32); -static void checkdead(void); static void exitsyscall0(G*); static void park0(G*); static void goexit0(G*); @@ -421,6 +419,8 @@ static bool exitsyscallfast(void); void allgadd(G*) __asm__(GOSYM_PREFIX "runtime.allgadd"); +void checkdead(void) + __asm__(GOSYM_PREFIX "runtime.checkdead"); bool runtime_isstarted; @@ -482,7 +482,7 @@ runtime_schedinit(void) n = _MaxGomaxprocs; procs = n; } - runtime_allp = runtime_malloc((_MaxGomaxprocs+1)*sizeof(runtime_allp[0])); + runtime_allp = runtime_getAllP(); procresize(procs); // Can not enable GC until all roots are registered. @@ -586,85 +586,25 @@ runtime_main(void* dummy __attribute__((unused))) *(int32*)0 = 0; } -void -runtime_tracebackothers(G * volatile me) -{ - G * volatile gp; - Traceback tb; - int32 traceback; - Slice slice; - volatile uintptr i; - - tb.gp = me; - traceback = runtime_gotraceback(nil); - - // Show the current goroutine first, if we haven't already. - if((gp = g->m->curg) != nil && gp != me) { - runtime_printf("\n"); - runtime_goroutineheader(gp); - gp->traceback = &tb; - -#ifdef USING_SPLIT_STACK - __splitstack_getcontext(&me->stackcontext[0]); -#endif - getcontext(ucontext_arg(&me->context[0])); - - if(gp->traceback != nil) { - runtime_gogo(gp); - } - - slice.__values = &tb.locbuf[0]; - slice.__count = tb.c; - slice.__capacity = tb.c; - runtime_printtrace(slice, nil); - runtime_printcreatedby(gp); - } - - runtime_lock(&allglock); - for(i = 0; i < runtime_allglen; i++) { - gp = runtime_allg[i]; - if(gp == me || gp == g->m->curg || gp->atomicstatus == _Gdead) - continue; - if(gp->issystem && traceback < 2) - continue; - runtime_printf("\n"); - runtime_goroutineheader(gp); - - // Our only mechanism for doing a stack trace is - // _Unwind_Backtrace. And that only works for the - // current thread, not for other random goroutines. - // So we need to switch context to the goroutine, get - // the backtrace, and then switch back. - - // This means that if g is running or in a syscall, we - // can't reliably print a stack trace. FIXME. - - if(gp->atomicstatus == _Grunning) { - runtime_printf("\tgoroutine running on other thread; stack unavailable\n"); - runtime_printcreatedby(gp); - } else if(gp->atomicstatus == _Gsyscall) { - runtime_printf("\tgoroutine in C code; stack unavailable\n"); - runtime_printcreatedby(gp); - } else { - gp->traceback = &tb; +void getTraceback(G*, G*) __asm__(GOSYM_PREFIX "runtime.getTraceback"); +// getTraceback stores a traceback of gp in the g's traceback field +// and then returns to me. We expect that gp's traceback is not nil. +// It works by saving me's current context, and checking gp's traceback field. +// If gp's traceback field is not nil, it starts running gp. +// In places where we call getcontext, we check the traceback field. +// If it is not nil, we collect a traceback, and then return to the +// goroutine stored in the traceback field, which is me. +void getTraceback(G* me, G* gp) +{ #ifdef USING_SPLIT_STACK - __splitstack_getcontext(&me->stackcontext[0]); + __splitstack_getcontext(&me->stackcontext[0]); #endif - getcontext(ucontext_arg(&me->context[0])); + getcontext(ucontext_arg(&me->stackcontext[0])); - if(gp->traceback != nil) { - runtime_gogo(gp); - } - - slice.__values = &tb.locbuf[0]; - slice.__count = tb.c; - slice.__capacity = tb.c; - runtime_printtrace(slice, nil); - runtime_printcreatedby(gp); - } + if (gp->traceback != nil) { + runtime_gogo(gp); } - runtime_unlock(&allglock); } static void @@ -1067,22 +1007,6 @@ runtime_allocm(P *p, bool allocatestack, byte** ret_g0_stack, uintptr* ret_g0_st return mp; } -static G* -allocg(void) -{ - G *gp; - // static Type *gtype; - - // if(gtype == nil) { - // Eface e; - // runtime_gc_g_ptr(&e); - // gtype = ((PtrType*)e.__type_descriptor)->__element_type; - // } - // gp = runtime_cnew(gtype); - gp = runtime_malloc(sizeof(G)); - return gp; -} - void setGContext(void) __asm__ (GOSYM_PREFIX "runtime.setGContext"); // setGContext sets up a new goroutine context for the current g. @@ -2129,6 +2053,7 @@ __go_go(void (*fn)(void*), void* arg) newg = runtime_malg(true, false, &sp, &malsize); spsize = (size_t)malsize; + newg->atomicstatus = _Gdead; allgadd(newg); } @@ -2152,31 +2077,6 @@ __go_go(void (*fn)(void*), void* arg) return newg; } -void -allgadd(G *gp) -{ - G **new; - uintptr cap; - - runtime_lock(&allglock); - if(runtime_allglen >= allgcap) { - cap = 4096/sizeof(new[0]); - if(cap < 2*allgcap) - cap = 2*allgcap; - new = runtime_malloc(cap*sizeof(new[0])); - if(new == nil) - runtime_throw("runtime: cannot allocate memory"); - if(runtime_allg != nil) { - runtime_memmove(new, runtime_allg, runtime_allglen*sizeof(new[0])); - runtime_free(runtime_allg); - } - runtime_allg = new; - allgcap = cap; - } - runtime_allg[runtime_allglen++] = gp; - runtime_unlock(&allglock); -} - // Put on gfree list. // If local list is too long, transfer a batch to the global list. static void @@ -2352,29 +2252,6 @@ runtime_lockedOSThread(void) } int32 -runtime_gcount(void) -{ - G *gp; - int32 n, s; - uintptr i; - - n = 0; - runtime_lock(&allglock); - // TODO(dvyukov): runtime.NumGoroutine() is O(N). - // We do not want to increment/decrement centralized counter in newproc/goexit, - // just to make runtime.NumGoroutine() faster. - // Compromise solution is to introduce per-P counters of active goroutines. - for(i = 0; i < runtime_allglen; i++) { - gp = runtime_allg[i]; - s = gp->atomicstatus; - if(s == _Grunnable || s == _Grunning || s == _Gsyscall || s == _Gwaiting) - n++; - } - runtime_unlock(&allglock); - return n; -} - -int32 runtime_mcount(void) { return runtime_sched->mcount; @@ -2638,59 +2515,6 @@ incidlelocked(int32 v) runtime_unlock(&runtime_sched->lock); } -// Check for deadlock situation. -// The check is based on number of running M's, if 0 -> deadlock. -static void -checkdead(void) -{ - G *gp; - int32 run, grunning, s; - uintptr i; - - // For -buildmode=c-shared or -buildmode=c-archive it's OK if - // there are no running goroutines. The calling program is - // assumed to be running. - if(runtime_isarchive) { - return; - } - - // -1 for sysmon - run = runtime_sched->mcount - runtime_sched->nmidle - runtime_sched->nmidlelocked - 1; - if(run > 0) - return; - // If we are dying because of a signal caught on an already idle thread, - // freezetheworld will cause all running threads to block. - // And runtime will essentially enter into deadlock state, - // except that there is a thread that will call runtime_exit soon. - if(runtime_panicking() > 0) - return; - if(run < 0) { - runtime_printf("runtime: checkdead: nmidle=%d nmidlelocked=%d mcount=%d\n", - runtime_sched->nmidle, runtime_sched->nmidlelocked, runtime_sched->mcount); - runtime_throw("checkdead: inconsistent counts"); - } - grunning = 0; - runtime_lock(&allglock); - for(i = 0; i < runtime_allglen; i++) { - gp = runtime_allg[i]; - if(gp->isbackground) - continue; - s = gp->atomicstatus; - if(s == _Gwaiting) - grunning++; - else if(s == _Grunnable || s == _Grunning || s == _Gsyscall) { - runtime_unlock(&allglock); - runtime_printf("runtime: checkdead: find g %D in status %d\n", gp->goid, s); - runtime_throw("checkdead: runnable g"); - } - } - runtime_unlock(&allglock); - if(grunning == 0) // possible if main goroutine calls runtime_Goexit() - runtime_throw("no goroutines (main called runtime.Goexit) - deadlock!"); - g->m->throwing = -1; // do not dump full stacks - runtime_throw("all goroutines are asleep - deadlock!"); -} - static void sysmon(void) { @@ -2832,94 +2656,6 @@ preemptall(void) return false; } -void -runtime_schedtrace(bool detailed) -{ - static int64 starttime; - int64 now; - int64 id1, id2, id3; - int32 i, t, h; - uintptr gi; - const char *fmt; - M *mp, *lockedm; - G *gp, *lockedg; - P *p; - - now = runtime_nanotime(); - if(starttime == 0) - starttime = now; - - runtime_lock(&runtime_sched->lock); - runtime_printf("SCHED %Dms: gomaxprocs=%d idleprocs=%d threads=%d idlethreads=%d runqueue=%d", - (now-starttime)/1000000, runtime_gomaxprocs, runtime_sched->npidle, runtime_sched->mcount, - runtime_sched->nmidle, runtime_sched->runqsize); - if(detailed) { - runtime_printf(" gcwaiting=%d nmidlelocked=%d nmspinning=%d stopwait=%d sysmonwait=%d\n", - runtime_sched->gcwaiting, runtime_sched->nmidlelocked, runtime_sched->nmspinning, - runtime_sched->stopwait, runtime_sched->sysmonwait); - } - // We must be careful while reading data from P's, M's and G's. - // Even if we hold schedlock, most data can be changed concurrently. - // E.g. (p->m ? p->m->id : -1) can crash if p->m changes from non-nil to nil. - for(i = 0; i < runtime_gomaxprocs; i++) { - p = runtime_allp[i]; - if(p == nil) - continue; - mp = (M*)p->m; - h = runtime_atomicload(&p->runqhead); - t = runtime_atomicload(&p->runqtail); - if(detailed) - runtime_printf(" P%d: status=%d schedtick=%d syscalltick=%d m=%d runqsize=%d gfreecnt=%d\n", - i, p->status, p->schedtick, p->syscalltick, mp ? mp->id : -1, t-h, p->gfreecnt); - else { - // In non-detailed mode format lengths of per-P run queues as: - // [len1 len2 len3 len4] - fmt = " %d"; - if(runtime_gomaxprocs == 1) - fmt = " [%d]\n"; - else if(i == 0) - fmt = " [%d"; - else if(i == runtime_gomaxprocs-1) - fmt = " %d]\n"; - runtime_printf(fmt, t-h); - } - } - if(!detailed) { - runtime_unlock(&runtime_sched->lock); - return; - } - for(mp = runtime_allm; mp; mp = mp->alllink) { - p = (P*)mp->p; - gp = mp->curg; - lockedg = mp->lockedg; - id1 = -1; - if(p) - id1 = p->id; - id2 = -1; - if(gp) - id2 = gp->goid; - id3 = -1; - if(lockedg) - id3 = lockedg->goid; - runtime_printf(" M%d: p=%D curg=%D mallocing=%d throwing=%d gcing=%d" - " locks=%d dying=%d helpgc=%d spinning=%d blocked=%d lockedg=%D\n", - mp->id, id1, id2, - mp->mallocing, mp->throwing, mp->gcing, mp->locks, mp->dying, mp->helpgc, - mp->spinning, mp->blocked, id3); - } - runtime_lock(&allglock); - for(gi = 0; gi < runtime_allglen; gi++) { - gp = runtime_allg[gi]; - mp = gp->m; - lockedm = gp->lockedm; - runtime_printf(" G%D: status=%d(%S) m=%d lockedm=%d\n", - gp->goid, gp->atomicstatus, gp->waitreason, mp ? mp->id : -1, - lockedm ? lockedm->id : -1); - } - runtime_unlock(&allglock); - runtime_unlock(&runtime_sched->lock); -} - // Put mp on midle list. // Sched must be locked. static void @@ -3357,20 +3093,6 @@ runtime_go_allm() return &runtime_allm; } -extern Slice runtime_go_allgs(void) - __asm__ (GOSYM_PREFIX "runtime.allgs"); - -Slice -runtime_go_allgs() -{ - Slice s; - - s.__values = runtime_allg; - s.__count = runtime_allglen; - s.__capacity = allgcap; - return s; -} - intgo NumCPU(void) __asm__ (GOSYM_PREFIX "runtime.NumCPU"); intgo diff --git a/libgo/runtime/runtime.h b/libgo/runtime/runtime.h index 54bdcf8..c8f490f 100644 --- a/libgo/runtime/runtime.h +++ b/libgo/runtime/runtime.h @@ -7,6 +7,7 @@ #include "go-assert.h" #include <complex.h> #include <signal.h> +#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -22,8 +23,6 @@ #include <sys/mman.h> #endif -#include "go-alloc.h" - #define _STRINGIFY2_(x) #x #define _STRINGIFY_(x) _STRINGIFY2_(x) #define GOSYM_PREFIX _STRINGIFY_(__USER_LABEL_PREFIX__) @@ -233,8 +232,10 @@ enum */ extern uintptr* runtime_getZerobase(void) __asm__(GOSYM_PREFIX "runtime.getZerobase"); -extern G** runtime_allg; -extern uintptr runtime_allglen; +extern G* runtime_getallg(intgo) + __asm__(GOSYM_PREFIX "runtime.getallg"); +extern uintptr runtime_getallglen(void) + __asm__(GOSYM_PREFIX "runtime.getallglen"); extern G* runtime_lastg; extern M* runtime_allm; extern P** runtime_allp; @@ -309,13 +310,9 @@ MCache* runtime_allocmcache(void) void runtime_freemcache(MCache*); void runtime_mallocinit(void); void runtime_mprofinit(void); -#define runtime_malloc(s) __go_alloc(s) -#define runtime_free(p) __go_free(p) #define runtime_getcallersp(p) __builtin_frame_address(0) int32 runtime_mcount(void) __asm__ (GOSYM_PREFIX "runtime.mcount"); -int32 runtime_gcount(void) - __asm__ (GOSYM_PREFIX "runtime.gcount"); void runtime_mcall(void(*)(G*)); uint32 runtime_fastrand1(void) __asm__ (GOSYM_PREFIX "runtime.fastrand1"); int32 runtime_timediv(int64, int32, int32*) diff --git a/libgo/runtime/runtime_c.c b/libgo/runtime/runtime_c.c index 4645312..67d5ee2 100644 --- a/libgo/runtime/runtime_c.c +++ b/libgo/runtime/runtime_c.c @@ -25,7 +25,8 @@ extern volatile intgo runtime_MemProfileRate struct gotraceback_ret { int32 level; - bool crash; + bool all; + bool crash; }; extern struct gotraceback_ret gotraceback(void) |