diff -r bb70e852004f libgo/runtime/chan.goc --- a/libgo/runtime/chan.goc Fri Jan 16 13:28:21 2015 -0800 +++ b/libgo/runtime/chan.goc Fri Apr 03 17:31:02 2015 -0700 @@ -111,7 +111,7 @@ mysg.releasetime = -1; } - runtime_lock(c); + runtime_lock(&c->lock); if(c->closed) goto closed; @@ -120,7 +120,7 @@ sg = dequeue(&c->recvq); if(sg != nil) { - runtime_unlock(c); + runtime_unlock(&c->lock); gp = sg->g; gp->param = sg; @@ -133,7 +133,7 @@ } if(!block) { - runtime_unlock(c); + runtime_unlock(&c->lock); return false; } @@ -142,10 +142,10 @@ mysg.selectdone = nil; g->param = nil; enqueue(&c->sendq, &mysg); - runtime_parkunlock(c, "chan send"); + runtime_parkunlock(&c->lock, "chan send"); if(g->param == nil) { - runtime_lock(c); + runtime_lock(&c->lock); if(!c->closed) runtime_throw("chansend: spurious wakeup"); goto closed; @@ -162,16 +162,16 @@ if(c->qcount >= c->dataqsiz) { if(!block) { - runtime_unlock(c); + runtime_unlock(&c->lock); return false; } mysg.g = g; mysg.elem = nil; mysg.selectdone = nil; enqueue(&c->sendq, &mysg); - runtime_parkunlock(c, "chan send"); + runtime_parkunlock(&c->lock, "chan send"); - runtime_lock(c); + runtime_lock(&c->lock); goto asynch; } @@ -183,18 +183,18 @@ sg = dequeue(&c->recvq); if(sg != nil) { gp = sg->g; - runtime_unlock(c); + runtime_unlock(&c->lock); if(sg->releasetime) sg->releasetime = runtime_cputicks(); runtime_ready(gp); } else - runtime_unlock(c); + runtime_unlock(&c->lock); if(mysg.releasetime > 0) runtime_blockevent(mysg.releasetime - t0, 2); return true; closed: - runtime_unlock(c); + runtime_unlock(&c->lock); runtime_panicstring("send on closed channel"); return false; // not reached } @@ -232,7 +232,7 @@ mysg.releasetime = -1; } - runtime_lock(c); + runtime_lock(&c->lock); if(c->dataqsiz > 0) goto asynch; @@ -241,7 +241,7 @@ sg = dequeue(&c->sendq); if(sg != nil) { - runtime_unlock(c); + runtime_unlock(&c->lock); if(ep != nil) runtime_memmove(ep, sg->elem, c->elemsize); @@ -257,7 +257,7 @@ } if(!block) { - runtime_unlock(c); + runtime_unlock(&c->lock); return false; } @@ -266,10 +266,10 @@ mysg.selectdone = nil; g->param = nil; enqueue(&c->recvq, &mysg); - runtime_parkunlock(c, "chan receive"); + runtime_parkunlock(&c->lock, "chan receive"); if(g->param == nil) { - runtime_lock(c); + runtime_lock(&c->lock); if(!c->closed) runtime_throw("chanrecv: spurious wakeup"); goto closed; @@ -287,7 +287,7 @@ goto closed; if(!block) { - runtime_unlock(c); + runtime_unlock(&c->lock); if(received != nil) *received = false; return false; @@ -296,9 +296,9 @@ mysg.elem = nil; mysg.selectdone = nil; enqueue(&c->recvq, &mysg); - runtime_parkunlock(c, "chan receive"); + runtime_parkunlock(&c->lock, "chan receive"); - runtime_lock(c); + runtime_lock(&c->lock); goto asynch; } @@ -312,12 +312,12 @@ sg = dequeue(&c->sendq); if(sg != nil) { gp = sg->g; - runtime_unlock(c); + runtime_unlock(&c->lock); if(sg->releasetime) sg->releasetime = runtime_cputicks(); runtime_ready(gp); } else - runtime_unlock(c); + runtime_unlock(&c->lock); if(received != nil) *received = true; @@ -330,7 +330,7 @@ runtime_memclr(ep, c->elemsize); if(received != nil) *received = false; - runtime_unlock(c); + runtime_unlock(&c->lock); if(mysg.releasetime > 0) runtime_blockevent(mysg.releasetime - t0, 2); return true; @@ -604,7 +604,7 @@ c0 = sel->lockorder[i]; if(c0 && c0 != c) { c = sel->lockorder[i]; - runtime_lock(c); + runtime_lock(&c->lock); } } } @@ -632,7 +632,7 @@ c = sel->lockorder[i]; if(i>0 && sel->lockorder[i-1] == c) continue; // will unlock it on the next iteration - runtime_unlock(c); + runtime_unlock(&c->lock); } } @@ -1017,9 +1017,9 @@ if(runtime_gcwaiting()) runtime_gosched(); - runtime_lock(c); + runtime_lock(&c->lock); if(c->closed) { - runtime_unlock(c); + runtime_unlock(&c->lock); runtime_panicstring("close of closed channel"); } c->closed = true; @@ -1048,7 +1048,7 @@ runtime_ready(gp); } - runtime_unlock(c); + runtime_unlock(&c->lock); } void diff -r bb70e852004f libgo/runtime/chan.h --- a/libgo/runtime/chan.h Fri Jan 16 13:28:21 2015 -0800 +++ b/libgo/runtime/chan.h Fri Apr 03 17:31:02 2015 -0700 @@ -39,7 +39,7 @@ uintgo recvx; // receive index WaitQ recvq; // list of recv waiters WaitQ sendq; // list of send waiters - Lock; + Lock lock; }; // Buffer follows Hchan immediately in memory. diff -r bb70e852004f libgo/runtime/heapdump.c --- a/libgo/runtime/heapdump.c Fri Jan 16 13:28:21 2015 -0800 +++ b/libgo/runtime/heapdump.c Fri Apr 03 17:31:02 2015 -0700 @@ -387,7 +387,7 @@ if(sp->kind != KindSpecialFinalizer) continue; spf = (SpecialFinalizer*)sp; - p = (byte*)((s->start << PageShift) + spf->offset); + p = (byte*)((s->start << PageShift) + spf->special.offset); dumpfinalizer(p, spf->fn, spf->ft, spf->ot); } } @@ -566,7 +566,7 @@ if(sp->kind != KindSpecialProfile) continue; spp = (SpecialProfile*)sp; - p = (byte*)((s->start << PageShift) + spp->offset); + p = (byte*)((s->start << PageShift) + spp->special.offset); dumpint(TagAllocSample); dumpint((uintptr)p); dumpint((uintptr)spp->b); diff -r bb70e852004f libgo/runtime/malloc.goc --- a/libgo/runtime/malloc.goc Fri Jan 16 13:28:21 2015 -0800 +++ b/libgo/runtime/malloc.goc Fri Apr 03 17:31:02 2015 -0700 @@ -429,9 +429,9 @@ m->mcache->local_nlookup++; if (sizeof(void*) == 4 && m->mcache->local_nlookup >= (1<<30)) { // purge cache stats to prevent overflow - runtime_lock(&runtime_mheap); + runtime_lock(&runtime_mheap.lock); runtime_purgecachedstats(m->mcache); - runtime_unlock(&runtime_mheap); + runtime_unlock(&runtime_mheap.lock); } s = runtime_MHeap_LookupMaybe(&runtime_mheap, v); @@ -728,7 +728,7 @@ static struct { - Lock; + Lock lock; byte* pos; byte* end; } persistent; @@ -757,19 +757,19 @@ align = 8; if(size >= PersistentAllocMaxBlock) return runtime_SysAlloc(size, stat); - runtime_lock(&persistent); + runtime_lock(&persistent.lock); persistent.pos = (byte*)ROUND((uintptr)persistent.pos, align); if(persistent.pos + size > persistent.end) { persistent.pos = runtime_SysAlloc(PersistentAllocChunk, &mstats.other_sys); if(persistent.pos == nil) { - runtime_unlock(&persistent); + runtime_unlock(&persistent.lock); runtime_throw("runtime: cannot allocate memory"); } persistent.end = persistent.pos + PersistentAllocChunk; } p = persistent.pos; persistent.pos += size; - runtime_unlock(&persistent); + runtime_unlock(&persistent.lock); if(stat != &mstats.other_sys) { // reaccount the allocation against provided stat runtime_xadd64(stat, size); diff -r bb70e852004f libgo/runtime/malloc.h --- a/libgo/runtime/malloc.h Fri Jan 16 13:28:21 2015 -0800 +++ b/libgo/runtime/malloc.h Fri Apr 03 17:31:02 2015 -0700 @@ -390,7 +390,7 @@ typedef struct SpecialFinalizer SpecialFinalizer; struct SpecialFinalizer { - Special; + Special special; FuncVal* fn; const FuncType* ft; const PtrType* ot; @@ -401,7 +401,7 @@ typedef struct SpecialProfile SpecialProfile; struct SpecialProfile { - Special; + Special special; Bucket* b; }; @@ -458,7 +458,7 @@ // Central list of free objects of a given size. struct MCentral { - Lock; + Lock lock; int32 sizeclass; MSpan nonempty; // list of spans with a free object MSpan empty; // list of spans with no free objects (or cached in an MCache) @@ -476,7 +476,7 @@ // but all the other global data is here too. struct MHeap { - Lock; + Lock lock; MSpan free[MaxMHeapList]; // free lists of given length MSpan freelarge; // free lists length >= MaxMHeapList MSpan busy[MaxMHeapList]; // busy lists of large objects of given length @@ -505,7 +505,7 @@ // spaced CacheLineSize bytes apart, so that each MCentral.Lock // gets its own cache line. struct { - MCentral; + MCentral mcentral; byte pad[64]; } central[NumSizeClasses]; diff -r bb70e852004f libgo/runtime/mcache.c --- a/libgo/runtime/mcache.c Fri Jan 16 13:28:21 2015 -0800 +++ b/libgo/runtime/mcache.c Fri Apr 03 17:31:02 2015 -0700 @@ -23,9 +23,9 @@ MCache *c; int32 i; - runtime_lock(&runtime_mheap); + runtime_lock(&runtime_mheap.lock); c = runtime_FixAlloc_Alloc(&runtime_mheap.cachealloc); - runtime_unlock(&runtime_mheap); + runtime_unlock(&runtime_mheap.lock); runtime_memclr((byte*)c, sizeof(*c)); for(i = 0; i < NumSizeClasses; i++) c->alloc[i] = &emptymspan; @@ -44,10 +44,10 @@ runtime_freemcache(MCache *c) { runtime_MCache_ReleaseAll(c); - runtime_lock(&runtime_mheap); + runtime_lock(&runtime_mheap.lock); runtime_purgecachedstats(c); runtime_FixAlloc_Free(&runtime_mheap.cachealloc, c); - runtime_unlock(&runtime_mheap); + runtime_unlock(&runtime_mheap.lock); } // Gets a span that has a free object in it and assigns it @@ -64,19 +64,19 @@ if(s->freelist != nil) runtime_throw("refill on a nonempty span"); if(s != &emptymspan) - runtime_MCentral_UncacheSpan(&runtime_mheap.central[sizeclass], s); + runtime_MCentral_UncacheSpan(&runtime_mheap.central[sizeclass].mcentral, s); // Push any explicitly freed objects to the central lists. // Not required, but it seems like a good time to do it. l = &c->free[sizeclass]; if(l->nlist > 0) { - runtime_MCentral_FreeList(&runtime_mheap.central[sizeclass], l->list); + runtime_MCentral_FreeList(&runtime_mheap.central[sizeclass].mcentral, l->list); l->list = nil; l->nlist = 0; } // Get a new cached span from the central lists. - s = runtime_MCentral_CacheSpan(&runtime_mheap.central[sizeclass]); + s = runtime_MCentral_CacheSpan(&runtime_mheap.central[sizeclass].mcentral); if(s == nil) runtime_throw("out of memory"); if(s->freelist == nil) { @@ -102,7 +102,7 @@ // We transfer a span at a time from MCentral to MCache, // so we'll do the same in the other direction. if(l->nlist >= (runtime_class_to_allocnpages[sizeclass]<list); + runtime_MCentral_FreeList(&runtime_mheap.central[sizeclass].mcentral, l->list); l->list = nil; l->nlist = 0; } @@ -118,12 +118,12 @@ for(i=0; ialloc[i]; if(s != &emptymspan) { - runtime_MCentral_UncacheSpan(&runtime_mheap.central[i], s); + runtime_MCentral_UncacheSpan(&runtime_mheap.central[i].mcentral, s); c->alloc[i] = &emptymspan; } l = &c->free[i]; if(l->nlist > 0) { - runtime_MCentral_FreeList(&runtime_mheap.central[i], l->list); + runtime_MCentral_FreeList(&runtime_mheap.central[i].mcentral, l->list); l->list = nil; l->nlist = 0; } diff -r bb70e852004f libgo/runtime/mcentral.c --- a/libgo/runtime/mcentral.c Fri Jan 16 13:28:21 2015 -0800 +++ b/libgo/runtime/mcentral.c Fri Apr 03 17:31:02 2015 -0700 @@ -39,14 +39,14 @@ int32 cap, n; uint32 sg; - runtime_lock(c); + runtime_lock(&c->lock); sg = runtime_mheap.sweepgen; retry: for(s = c->nonempty.next; s != &c->nonempty; s = s->next) { if(s->sweepgen == sg-2 && runtime_cas(&s->sweepgen, sg-2, sg-1)) { - runtime_unlock(c); + runtime_unlock(&c->lock); runtime_MSpan_Sweep(s); - runtime_lock(c); + runtime_lock(&c->lock); // the span could have been moved to heap, retry goto retry; } @@ -65,9 +65,9 @@ runtime_MSpanList_Remove(s); // swept spans are at the end of the list runtime_MSpanList_InsertBack(&c->empty, s); - runtime_unlock(c); + runtime_unlock(&c->lock); runtime_MSpan_Sweep(s); - runtime_lock(c); + runtime_lock(&c->lock); // the span could be moved to nonempty or heap, retry goto retry; } @@ -82,7 +82,7 @@ // Replenish central list if empty. if(!MCentral_Grow(c)) { - runtime_unlock(c); + runtime_unlock(&c->lock); return nil; } goto retry; @@ -98,7 +98,7 @@ runtime_MSpanList_Remove(s); runtime_MSpanList_InsertBack(&c->empty, s); s->incache = true; - runtime_unlock(c); + runtime_unlock(&c->lock); return s; } @@ -109,7 +109,7 @@ MLink *v; int32 cap, n; - runtime_lock(c); + runtime_lock(&c->lock); s->incache = false; @@ -135,7 +135,7 @@ runtime_MSpanList_Remove(s); runtime_MSpanList_Insert(&c->nonempty, s); } - runtime_unlock(c); + runtime_unlock(&c->lock); } // Free the list of objects back into the central free list c. @@ -145,12 +145,12 @@ { MLink *next; - runtime_lock(c); + runtime_lock(&c->lock); for(; start != nil; start = next) { next = start->next; MCentral_Free(c, start); } - runtime_unlock(c); + runtime_unlock(&c->lock); } // Helper: free one object back into the central free list. @@ -193,7 +193,7 @@ // If s is completely freed, return it to the heap. if(s->ref == 0) { MCentral_ReturnToHeap(c, s); // unlocks c - runtime_lock(c); + runtime_lock(&c->lock); } } @@ -206,7 +206,7 @@ { if(s->incache) runtime_throw("freespan into cached span"); - runtime_lock(c); + runtime_lock(&c->lock); // Move to nonempty if necessary. if(s->freelist == nil) { @@ -227,7 +227,7 @@ runtime_atomicstore(&s->sweepgen, runtime_mheap.sweepgen); if(s->ref != 0) { - runtime_unlock(c); + runtime_unlock(&c->lock); return false; } @@ -260,12 +260,12 @@ byte *p; MSpan *s; - runtime_unlock(c); + runtime_unlock(&c->lock); runtime_MGetSizeClassInfo(c->sizeclass, &size, &npages, &n); s = runtime_MHeap_Alloc(&runtime_mheap, npages, c->sizeclass, 0, 1); if(s == nil) { // TODO(rsc): Log out of memory - runtime_lock(c); + runtime_lock(&c->lock); return false; } @@ -282,7 +282,7 @@ *tailp = nil; runtime_markspan((byte*)(s->start<npages<lock); c->nfree += n; runtime_MSpanList_Insert(&c->nonempty, s); return true; @@ -301,7 +301,7 @@ if(s->ref != 0) runtime_throw("ref wrong"); c->nfree -= (s->npages << PageShift) / size; - runtime_unlock(c); + runtime_unlock(&c->lock); runtime_unmarkspan((byte*)(s->start<npages<start << PageShift) + spf->offset/s->elemsize*s->elemsize); + p = (void*)((s->start << PageShift) + spf->special.offset/s->elemsize*s->elemsize); enqueue1(&wbuf, (Obj){p, s->elemsize, 0}); enqueue1(&wbuf, (Obj){(void*)&spf->fn, PtrSize, 0}); enqueue1(&wbuf, (Obj){(void*)&spf->ft, PtrSize, 0}); @@ -1378,7 +1378,7 @@ b = (Workbuf*)runtime_lfstackpop(&work.empty); if(b == nil) { // Need to allocate. - runtime_lock(&work); + runtime_lock(&work.lock); if(work.nchunk < sizeof *b) { work.nchunk = 1<<20; work.chunk = runtime_SysAlloc(work.nchunk, &mstats.gc_sys); @@ -1388,7 +1388,7 @@ b = (Workbuf*)work.chunk; work.chunk += sizeof *b; work.nchunk -= sizeof *b; - runtime_unlock(&work); + runtime_unlock(&work.lock); } b->nobj = 0; return b; @@ -1802,7 +1802,7 @@ c->local_nsmallfree[cl] += nfree; c->local_cachealloc -= nfree * size; runtime_xadd64(&mstats.next_gc, -(uint64)(nfree * size * (gcpercent + 100)/100)); - res = runtime_MCentral_FreeSpan(&runtime_mheap.central[cl], s, nfree, head.next, end); + res = runtime_MCentral_FreeSpan(&runtime_mheap.central[cl].mcentral, s, nfree, head.next, end); //MCentral_FreeSpan updates sweepgen } return res; @@ -2147,10 +2147,10 @@ return; if(gcpercent == GcpercentUnknown) { // first time through - runtime_lock(&runtime_mheap); + runtime_lock(&runtime_mheap.lock); if(gcpercent == GcpercentUnknown) gcpercent = readgogc(); - runtime_unlock(&runtime_mheap); + runtime_unlock(&runtime_mheap.lock); } if(gcpercent < 0) return; @@ -2423,7 +2423,7 @@ // Pass back: pauses, last gc (absolute time), number of gc, total pause ns. p = (uint64*)pauses->array; - runtime_lock(&runtime_mheap); + runtime_lock(&runtime_mheap.lock); n = mstats.numgc; if(n > nelem(mstats.pause_ns)) n = nelem(mstats.pause_ns); @@ -2438,7 +2438,7 @@ p[n] = mstats.last_gc; p[n+1] = mstats.numgc; p[n+2] = mstats.pause_total_ns; - runtime_unlock(&runtime_mheap); + runtime_unlock(&runtime_mheap.lock); pauses->__count = n+3; } @@ -2446,14 +2446,14 @@ runtime_setgcpercent(int32 in) { int32 out; - runtime_lock(&runtime_mheap); + runtime_lock(&runtime_mheap.lock); if(gcpercent == GcpercentUnknown) gcpercent = readgogc(); out = gcpercent; if(in < 0) in = -1; gcpercent = in; - runtime_unlock(&runtime_mheap); + runtime_unlock(&runtime_mheap.lock); return out; } diff -r bb70e852004f libgo/runtime/mheap.c --- a/libgo/runtime/mheap.c Fri Jan 16 13:28:21 2015 -0800 +++ b/libgo/runtime/mheap.c Fri Apr 03 17:31:02 2015 -0700 @@ -70,7 +70,7 @@ runtime_MSpanList_Init(&h->freelarge); runtime_MSpanList_Init(&h->busylarge); for(i=0; icentral); i++) - runtime_MCentral_Init(&h->central[i], i); + runtime_MCentral_Init(&h->central[i].mcentral, i); } void @@ -109,9 +109,9 @@ runtime_MSpanList_Remove(s); // swept spans are at the end of the list runtime_MSpanList_InsertBack(list, s); - runtime_unlock(h); + runtime_unlock(&h->lock); n += runtime_MSpan_Sweep(s); - runtime_lock(h); + runtime_lock(&h->lock); if(n >= npages) return n; // the span could have been moved elsewhere @@ -156,7 +156,7 @@ } // Now sweep everything that is not yet swept. - runtime_unlock(h); + runtime_unlock(&h->lock); for(;;) { n = runtime_sweepone(); if(n == (uintptr)-1) // all spans are swept @@ -165,7 +165,7 @@ if(reclaimed >= npage) break; } - runtime_lock(h); + runtime_lock(&h->lock); } // Allocate a new span of npage pages from the heap @@ -175,7 +175,7 @@ { MSpan *s; - runtime_lock(h); + runtime_lock(&h->lock); mstats.heap_alloc += runtime_m()->mcache->local_cachealloc; runtime_m()->mcache->local_cachealloc = 0; s = MHeap_AllocLocked(h, npage, sizeclass); @@ -191,7 +191,7 @@ runtime_MSpanList_InsertBack(&h->busylarge, s); } } - runtime_unlock(h); + runtime_unlock(&h->lock); if(s != nil) { if(needzero && s->needzero) runtime_memclr((byte*)(s->start<npages<lock); mstats.heap_alloc += runtime_m()->mcache->local_cachealloc; runtime_m()->mcache->local_cachealloc = 0; mstats.heap_inuse -= s->npages<lock); } static void @@ -548,10 +548,10 @@ runtime_noteclear(¬e); runtime_notetsleepg(¬e, tick); - runtime_lock(h); + runtime_lock(&h->lock); unixnow = runtime_unixnanotime(); if(unixnow - mstats.last_gc > forcegc) { - runtime_unlock(h); + runtime_unlock(&h->lock); // The scavenger can not block other goroutines, // otherwise deadlock detector can fire spuriously. // GC blocks other goroutines via the runtime_worldsema. @@ -561,11 +561,11 @@ runtime_notetsleepg(¬e, -1); if(runtime_debug.gctrace > 0) runtime_printf("scvg%d: GC forced\n", k); - runtime_lock(h); + runtime_lock(&h->lock); } now = runtime_nanotime(); scavenge(k, now, limit); - runtime_unlock(h); + runtime_unlock(&h->lock); } } @@ -575,9 +575,9 @@ runtime_debug_freeOSMemory(void) { runtime_gc(2); // force GC and do eager sweep - runtime_lock(&runtime_mheap); + runtime_lock(&runtime_mheap.lock); scavenge(-1, ~(uintptr)0, 0); - runtime_unlock(&runtime_mheap); + runtime_unlock(&runtime_mheap.lock); } // Initialize a new span with the given start and npages. @@ -752,11 +752,11 @@ runtime_lock(&runtime_mheap.speciallock); s = runtime_FixAlloc_Alloc(&runtime_mheap.specialfinalizeralloc); runtime_unlock(&runtime_mheap.speciallock); - s->kind = KindSpecialFinalizer; + s->special.kind = KindSpecialFinalizer; s->fn = f; s->ft = ft; s->ot = ot; - if(addspecial(p, s)) + if(addspecial(p, &s->special)) return true; // There was an old finalizer @@ -789,9 +789,9 @@ runtime_lock(&runtime_mheap.speciallock); s = runtime_FixAlloc_Alloc(&runtime_mheap.specialprofilealloc); runtime_unlock(&runtime_mheap.speciallock); - s->kind = KindSpecialProfile; + s->special.kind = KindSpecialProfile; s->b = b; - if(!addspecial(p, s)) + if(!addspecial(p, &s->special)) runtime_throw("setprofilebucket: profile already set"); } @@ -879,14 +879,14 @@ // remove the span from whatever list it is in now if(s->sizeclass > 0) { // must be in h->central[x].empty - c = &h->central[s->sizeclass]; - runtime_lock(c); + c = &h->central[s->sizeclass].mcentral; + runtime_lock(&c->lock); runtime_MSpanList_Remove(s); - runtime_unlock(c); - runtime_lock(h); + runtime_unlock(&c->lock); + runtime_lock(&h->lock); } else { // must be in h->busy/busylarge - runtime_lock(h); + runtime_lock(&h->lock); runtime_MSpanList_Remove(s); } // heap is locked now @@ -933,18 +933,18 @@ // place the span into a new list if(s->sizeclass > 0) { - runtime_unlock(h); - c = &h->central[s->sizeclass]; - runtime_lock(c); + runtime_unlock(&h->lock); + c = &h->central[s->sizeclass].mcentral; + runtime_lock(&c->lock); // swept spans are at the end of the list runtime_MSpanList_InsertBack(&c->empty, s); - runtime_unlock(c); + runtime_unlock(&c->lock); } else { // Swept spans are at the end of lists. if(s->npages < nelem(h->free)) runtime_MSpanList_InsertBack(&h->busy[s->npages], s); else runtime_MSpanList_InsertBack(&h->busylarge, s); - runtime_unlock(h); + runtime_unlock(&h->lock); } } diff -r bb70e852004f libgo/runtime/netpoll.goc --- a/libgo/runtime/netpoll.goc Fri Jan 16 13:28:21 2015 -0800 +++ b/libgo/runtime/netpoll.goc Fri Apr 03 17:31:02 2015 -0700 @@ -53,7 +53,7 @@ // pollReset, pollWait, pollWaitCanceled and runtime_netpollready (IO rediness notification) // proceed w/o taking the lock. So closing, rg, rd, wg and wd are manipulated // in a lock-free way by all operations. - Lock; // protectes the following fields + Lock lock; // protectes the following fields uintptr fd; bool closing; uintptr seq; // protects from stale timers and ready notifications @@ -68,7 +68,7 @@ static struct { - Lock; + Lock lock; PollDesc* first; // PollDesc objects must be type-stable, // because we can get ready notification from epoll/kqueue @@ -100,7 +100,7 @@ func runtime_pollOpen(fd uintptr) (pd *PollDesc, errno int) { pd = allocPollDesc(); - runtime_lock(pd); + runtime_lock(&pd->lock); if(pd->wg != nil && pd->wg != READY) runtime_throw("runtime_pollOpen: blocked write on free descriptor"); if(pd->rg != nil && pd->rg != READY) @@ -112,7 +112,7 @@ pd->rd = 0; pd->wg = nil; pd->wd = 0; - runtime_unlock(pd); + runtime_unlock(&pd->lock); errno = runtime_netpollopen(fd, pd); } @@ -125,10 +125,10 @@ if(pd->rg != nil && pd->rg != READY) runtime_throw("runtime_pollClose: blocked read on closing descriptor"); runtime_netpollclose(pd->fd); - runtime_lock(&pollcache); + runtime_lock(&pollcache.lock); pd->link = pollcache.first; pollcache.first = pd; - runtime_unlock(&pollcache); + runtime_unlock(&pollcache.lock); } func runtime_pollReset(pd *PollDesc, mode int) (err int) { @@ -169,9 +169,9 @@ func runtime_pollSetDeadline(pd *PollDesc, d int64, mode int) { G *rg, *wg; - runtime_lock(pd); + runtime_lock(&pd->lock); if(pd->closing) { - runtime_unlock(pd); + runtime_unlock(&pd->lock); return; } pd->seq++; // invalidate current timers @@ -226,7 +226,7 @@ rg = netpollunblock(pd, 'r', false); if(pd->wd < 0) wg = netpollunblock(pd, 'w', false); - runtime_unlock(pd); + runtime_unlock(&pd->lock); if(rg) runtime_ready(rg); if(wg) @@ -236,7 +236,7 @@ func runtime_pollUnblock(pd *PollDesc) { G *rg, *wg; - runtime_lock(pd); + runtime_lock(&pd->lock); if(pd->closing) runtime_throw("runtime_pollUnblock: already closing"); pd->closing = true; @@ -252,7 +252,7 @@ runtime_deltimer(&pd->wt); pd->wt.fv = nil; } - runtime_unlock(pd); + runtime_unlock(&pd->lock); if(rg) runtime_ready(rg); if(wg) @@ -280,13 +280,13 @@ void runtime_netpolllock(PollDesc *pd) { - runtime_lock(pd); + runtime_lock(&pd->lock); } void runtime_netpollunlock(PollDesc *pd) { - runtime_unlock(pd); + runtime_unlock(&pd->lock); } // make pd ready, newly runnable goroutines (if any) are enqueued info gpp list @@ -399,12 +399,12 @@ pd = (PollDesc*)arg.data; rg = wg = nil; - runtime_lock(pd); + runtime_lock(&pd->lock); // Seq arg is seq when the timer was set. // If it's stale, ignore the timer event. if(seq != pd->seq) { // The descriptor was reused or timers were reset. - runtime_unlock(pd); + runtime_unlock(&pd->lock); return; } if(read) { @@ -421,7 +421,7 @@ runtime_atomicstorep(&pd->wt.fv, nil); // full memory barrier between store to wd and load of wg in netpollunblock wg = netpollunblock(pd, 'w', false); } - runtime_unlock(pd); + runtime_unlock(&pd->lock); if(rg) runtime_ready(rg); if(wg) @@ -452,7 +452,7 @@ PollDesc *pd; uint32 i, n; - runtime_lock(&pollcache); + runtime_lock(&pollcache.lock); if(pollcache.first == nil) { n = PollBlockSize/sizeof(*pd); if(n == 0) @@ -467,6 +467,6 @@ } pd = pollcache.first; pollcache.first = pd->link; - runtime_unlock(&pollcache); + runtime_unlock(&pollcache.lock); return pd; } diff -r bb70e852004f libgo/runtime/proc.c --- a/libgo/runtime/proc.c Fri Jan 16 13:28:21 2015 -0800 +++ b/libgo/runtime/proc.c Fri Apr 03 17:31:02 2015 -0700 @@ -302,7 +302,7 @@ typedef struct Sched Sched; struct Sched { - Lock; + Lock lock; uint64 goidgen; M* midle; // idle m's waiting for work @@ -709,7 +709,7 @@ mp->fastrand = 0x49f6428aUL + mp->id + runtime_cputicks(); - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); mp->id = runtime_sched.mcount++; checkmcount(); runtime_mpreinit(mp); @@ -720,7 +720,7 @@ // runtime_NumCgoCall() iterates over allm w/o schedlock, // so we need to publish it safely. runtime_atomicstorep(&runtime_allm, mp); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); } // Mark gp ready to run. @@ -747,7 +747,7 @@ // Figure out how many CPUs to use during GC. // Limited by gomaxprocs, number of actual CPUs, and MaxGcproc. - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); n = runtime_gomaxprocs; if(n > runtime_ncpu) n = runtime_ncpu > 0 ? runtime_ncpu : 1; @@ -755,7 +755,7 @@ n = MaxGcproc; if(n > runtime_sched.nmidle+1) // one M is currently running n = runtime_sched.nmidle+1; - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); return n; } @@ -764,14 +764,14 @@ { int32 n; - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); n = runtime_gomaxprocs; if(n > runtime_ncpu) n = runtime_ncpu; if(n > MaxGcproc) n = MaxGcproc; n -= runtime_sched.nmidle+1; // one M is currently running - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); return n > 0; } @@ -781,7 +781,7 @@ M *mp; int32 n, pos; - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); pos = 0; for(n = 1; n < nproc; n++) { // one M is currently running if(runtime_allp[pos]->mcache == m->mcache) @@ -794,7 +794,7 @@ pos++; runtime_notewakeup(&mp->park); } - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); } // Similar to stoptheworld but best-effort and can be called several times. @@ -833,7 +833,7 @@ P *p; bool wait; - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); runtime_sched.stopwait = runtime_gomaxprocs; runtime_atomicstore((uint32*)&runtime_sched.gcwaiting, 1); preemptall(); @@ -853,7 +853,7 @@ runtime_sched.stopwait--; } wait = runtime_sched.stopwait > 0; - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); // wait for remaining P's to stop voluntarily if(wait) { @@ -887,7 +887,7 @@ gp = runtime_netpoll(false); // non-blocking injectglist(gp); add = needaddgcproc(); - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); if(newprocs) { procresize(newprocs); newprocs = 0; @@ -911,7 +911,7 @@ runtime_sched.sysmonwait = false; runtime_notewakeup(&runtime_sched.sysmonnote); } - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); while(p1) { p = p1; @@ -1346,9 +1346,9 @@ } retry: - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); mput(m); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); runtime_notesleep(&m->park); runtime_noteclear(&m->park); if(m->helpgc) { @@ -1375,18 +1375,18 @@ M *mp; void (*fn)(void); - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); if(p == nil) { p = pidleget(); if(p == nil) { - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); if(spinning) runtime_xadd(&runtime_sched.nmspinning, -1); return; } } mp = mget(); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); if(mp == nil) { fn = nil; if(spinning) @@ -1419,28 +1419,28 @@ startm(p, true); return; } - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); if(runtime_sched.gcwaiting) { p->status = Pgcstop; if(--runtime_sched.stopwait == 0) runtime_notewakeup(&runtime_sched.stopnote); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); return; } if(runtime_sched.runqsize) { - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); startm(p, false); return; } // If this is the last running P and nobody is polling network, // need to wakeup another M to poll network. if(runtime_sched.npidle == (uint32)runtime_gomaxprocs-1 && runtime_atomicload64(&runtime_sched.lastpoll) != 0) { - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); startm(p, false); return; } pidleput(p); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); } // Tries to add one more P to execute G's. @@ -1512,11 +1512,11 @@ runtime_xadd(&runtime_sched.nmspinning, -1); } p = releasep(); - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); p->status = Pgcstop; if(--runtime_sched.stopwait == 0) runtime_notewakeup(&runtime_sched.stopnote); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); stopm(); } @@ -1567,9 +1567,9 @@ return gp; // global runq if(runtime_sched.runqsize) { - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); gp = globrunqget(m->p, 0); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); if(gp) return gp; } @@ -1603,19 +1603,19 @@ } stop: // return P and block - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); if(runtime_sched.gcwaiting) { - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); goto top; } if(runtime_sched.runqsize) { gp = globrunqget(m->p, 0); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); return gp; } p = releasep(); pidleput(p); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); if(m->spinning) { m->spinning = false; runtime_xadd(&runtime_sched.nmspinning, -1); @@ -1624,9 +1624,9 @@ for(i = 0; i < runtime_gomaxprocs; i++) { p = runtime_allp[i]; if(p && p->runqhead != p->runqtail) { - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); p = pidleget(); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); if(p) { acquirep(p); goto top; @@ -1643,9 +1643,9 @@ gp = runtime_netpoll(true); // block until new work is available runtime_atomicstore64(&runtime_sched.lastpoll, runtime_nanotime()); if(gp) { - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); p = pidleget(); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); if(p) { acquirep(p); injectglist(gp->schedlink); @@ -1688,14 +1688,14 @@ if(glist == nil) return; - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); for(n = 0; glist; n++) { gp = glist; glist = gp->schedlink; gp->status = Grunnable; globrunqput(gp); } - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); for(; n && runtime_sched.npidle; n--) startm(nil, false); @@ -1726,9 +1726,9 @@ // This is a fancy way to say tick%61==0, // it uses 2 MUL instructions instead of a single DIV and so is faster on modern processors. if(tick - (((uint64)tick*0x4325c53fu)>>36)*61 == 0 && runtime_sched.runqsize > 0) { - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); gp = globrunqget(m->p, 1); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); if(gp) resetspinning(); } @@ -1822,9 +1822,9 @@ gp->status = Grunnable; gp->m = nil; m->curg = nil; - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); globrunqput(gp); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); if(m->lockedg) { stoplockedm(); execute(gp); // Never returns. @@ -1925,24 +1925,24 @@ g->status = Gsyscall; if(runtime_atomicload(&runtime_sched.sysmonwait)) { // TODO: fast atomic - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); if(runtime_atomicload(&runtime_sched.sysmonwait)) { runtime_atomicstore(&runtime_sched.sysmonwait, 0); runtime_notewakeup(&runtime_sched.sysmonnote); } - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); } m->mcache = nil; m->p->m = nil; runtime_atomicstore(&m->p->status, Psyscall); if(runtime_sched.gcwaiting) { - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); if (runtime_sched.stopwait > 0 && runtime_cas(&m->p->status, Psyscall, Pgcstop)) { if(--runtime_sched.stopwait == 0) runtime_notewakeup(&runtime_sched.stopnote); } - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); } m->locks--; @@ -2053,13 +2053,13 @@ // Try to get any other idle P. m->p = nil; if(runtime_sched.pidle) { - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); p = pidleget(); if(p && runtime_atomicload(&runtime_sched.sysmonwait)) { runtime_atomicstore(&runtime_sched.sysmonwait, 0); runtime_notewakeup(&runtime_sched.sysmonnote); } - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); if(p) { acquirep(p); return true; @@ -2078,7 +2078,7 @@ gp->status = Grunnable; gp->m = nil; m->curg = nil; - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); p = pidleget(); if(p == nil) globrunqput(gp); @@ -2086,7 +2086,7 @@ runtime_atomicstore(&runtime_sched.sysmonwait, 0); runtime_notewakeup(&runtime_sched.sysmonnote); } - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); if(p) { acquirep(p); execute(gp); // Never returns. @@ -2365,13 +2365,13 @@ if(n > MaxGomaxprocs) n = MaxGomaxprocs; - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); ret = runtime_gomaxprocs; if(n <= 0 || n == ret) { - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); return ret; } - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); runtime_semacquire(&runtime_worldsema, false); m->gcing = 1; @@ -2476,7 +2476,7 @@ } static struct { - Lock; + Lock lock; void (*fn)(uintptr*, int32); int32 hz; uintptr pcbuf[TracebackMaxFrames]; @@ -2508,9 +2508,9 @@ if(mp->mcache == nil) traceback = false; - runtime_lock(&prof); + runtime_lock(&prof.lock); if(prof.fn == nil) { - runtime_unlock(&prof); + runtime_unlock(&prof.lock); mp->mallocing--; return; } @@ -2538,7 +2538,7 @@ prof.pcbuf[1] = (uintptr)System; } prof.fn(prof.pcbuf, n); - runtime_unlock(&prof); + runtime_unlock(&prof.lock); mp->mallocing--; } @@ -2563,13 +2563,13 @@ // it would deadlock. runtime_resetcpuprofiler(0); - runtime_lock(&prof); + runtime_lock(&prof.lock); prof.fn = fn; prof.hz = hz; - runtime_unlock(&prof); - runtime_lock(&runtime_sched); + runtime_unlock(&prof.lock); + runtime_lock(&runtime_sched.lock); runtime_sched.profilehz = hz; - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); if(hz != 0) runtime_resetcpuprofiler(hz); @@ -2707,11 +2707,11 @@ static void incidlelocked(int32 v) { - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); runtime_sched.nmidlelocked += v; if(v > 0) checkdead(); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); } // Check for deadlock situation. @@ -2780,16 +2780,16 @@ runtime_usleep(delay); if(runtime_debug.schedtrace <= 0 && (runtime_sched.gcwaiting || runtime_atomicload(&runtime_sched.npidle) == (uint32)runtime_gomaxprocs)) { // TODO: fast atomic - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); if(runtime_atomicload(&runtime_sched.gcwaiting) || runtime_atomicload(&runtime_sched.npidle) == (uint32)runtime_gomaxprocs) { runtime_atomicstore(&runtime_sched.sysmonwait, 1); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); runtime_notesleep(&runtime_sched.sysmonnote); runtime_noteclear(&runtime_sched.sysmonnote); idle = 0; delay = 20; } else - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); } // poll network if not polled for more than 10ms lastpoll = runtime_atomicload64(&runtime_sched.lastpoll); @@ -2918,7 +2918,7 @@ if(starttime == 0) starttime = now; - runtime_lock(&runtime_sched); + 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); @@ -2954,7 +2954,7 @@ } } if(!detailed) { - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); return; } for(mp = runtime_allm; mp; mp = mp->alllink) { @@ -2986,7 +2986,7 @@ lockedm ? lockedm->id : -1); } runtime_unlock(&allglock); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); } // Put mp on midle list. @@ -3142,9 +3142,9 @@ for(i=0; ischedlink = batch[i+1]; // Now put the batch on global queue. - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); globrunqputbatch(batch[0], batch[n], n+1); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); return true; } @@ -3296,11 +3296,11 @@ { int32 out; - runtime_lock(&runtime_sched); + runtime_lock(&runtime_sched.lock); out = runtime_sched.maxmcount; runtime_sched.maxmcount = in; checkmcount(); - runtime_unlock(&runtime_sched); + runtime_unlock(&runtime_sched.lock); return out; } diff -r bb70e852004f libgo/runtime/runtime.h --- a/libgo/runtime/runtime.h Fri Jan 16 13:28:21 2015 -0800 +++ b/libgo/runtime/runtime.h Fri Apr 03 17:31:02 2015 -0700 @@ -285,7 +285,7 @@ struct P { - Lock; + Lock lock; int32 id; uint32 status; // one of Pidle/Prunning/... @@ -383,7 +383,7 @@ struct Timers { - Lock; + Lock lock; G *timerproc; bool sleeping; bool rescheduling; diff -r bb70e852004f libgo/runtime/sema.goc --- a/libgo/runtime/sema.goc Fri Jan 16 13:28:21 2015 -0800 +++ b/libgo/runtime/sema.goc Fri Apr 03 17:31:02 2015 -0700 @@ -35,7 +35,7 @@ typedef struct SemaRoot SemaRoot; struct SemaRoot { - Lock; + Lock lock; SemaWaiter* head; SemaWaiter* tail; // Number of waiters. Read w/o the lock. @@ -47,7 +47,7 @@ struct semtable { - SemaRoot; + SemaRoot root; uint8 pad[CacheLineSize-sizeof(SemaRoot)]; }; static struct semtable semtable[SEMTABLESZ]; @@ -55,7 +55,7 @@ static SemaRoot* semroot(uint32 volatile *addr) { - return &semtable[((uintptr)addr >> 3) % SEMTABLESZ]; + return &semtable[((uintptr)addr >> 3) % SEMTABLESZ].root; } static void @@ -124,19 +124,19 @@ } for(;;) { - runtime_lock(root); + runtime_lock(&root->lock); // Add ourselves to nwait to disable "easy case" in semrelease. runtime_xadd(&root->nwait, 1); // Check cansemacquire to avoid missed wakeup. if(cansemacquire(addr)) { runtime_xadd(&root->nwait, -1); - runtime_unlock(root); + runtime_unlock(&root->lock); return; } // Any semrelease after the cansemacquire knows we're waiting // (we set nwait above), so go to sleep. semqueue(root, addr, &s); - runtime_parkunlock(root, "semacquire"); + runtime_parkunlock(&root->lock, "semacquire"); if(cansemacquire(addr)) { if(t0) runtime_blockevent(s.releasetime - t0, 3); @@ -161,11 +161,11 @@ return; // Harder case: search for a waiter and wake it. - runtime_lock(root); + runtime_lock(&root->lock); if(runtime_atomicload(&root->nwait) == 0) { // The count is already consumed by another goroutine, // so no need to wake up another goroutine. - runtime_unlock(root); + runtime_unlock(&root->lock); return; } for(s = root->head; s; s = s->next) { @@ -175,7 +175,7 @@ break; } } - runtime_unlock(root); + runtime_unlock(&root->lock); if(s) { if(s->releasetime) s->releasetime = runtime_cputicks(); @@ -211,7 +211,7 @@ typedef struct SyncSema SyncSema; struct SyncSema { - Lock; + Lock lock; SemaWaiter* head; SemaWaiter* tail; }; @@ -238,7 +238,7 @@ w.releasetime = -1; } - runtime_lock(s); + runtime_lock(&s->lock); if(s->head && s->head->nrelease > 0) { // have pending release, consume it wake = nil; @@ -249,7 +249,7 @@ if(s->head == nil) s->tail = nil; } - runtime_unlock(s); + runtime_unlock(&s->lock); if(wake) runtime_ready(wake->g); } else { @@ -259,7 +259,7 @@ else s->tail->next = &w; s->tail = &w; - runtime_parkunlock(s, "semacquire"); + runtime_parkunlock(&s->lock, "semacquire"); if(t0) runtime_blockevent(w.releasetime - t0, 2); } @@ -274,7 +274,7 @@ w.next = nil; w.releasetime = 0; - runtime_lock(s); + runtime_lock(&s->lock); while(w.nrelease > 0 && s->head && s->head->nrelease < 0) { // have pending acquire, satisfy it wake = s->head; @@ -293,7 +293,7 @@ else s->tail->next = &w; s->tail = &w; - runtime_parkunlock(s, "semarelease"); + runtime_parkunlock(&s->lock, "semarelease"); } else - runtime_unlock(s); + runtime_unlock(&s->lock); } diff -r bb70e852004f libgo/runtime/sigqueue.goc --- a/libgo/runtime/sigqueue.goc Fri Jan 16 13:28:21 2015 -0800 +++ b/libgo/runtime/sigqueue.goc Fri Apr 03 17:31:02 2015 -0700 @@ -32,7 +32,7 @@ #include "defs.h" static struct { - Note; + Note note; uint32 mask[(NSIG+31)/32]; uint32 wanted[(NSIG+31)/32]; uint32 state; @@ -70,7 +70,7 @@ new = HASSIGNAL; if(runtime_cas(&sig.state, old, new)) { if (old == HASWAITER) - runtime_notewakeup(&sig); + runtime_notewakeup(&sig.note); break; } } @@ -107,8 +107,8 @@ new = HASWAITER; if(runtime_cas(&sig.state, old, new)) { if (new == HASWAITER) { - runtime_notetsleepg(&sig, -1); - runtime_noteclear(&sig); + runtime_notetsleepg(&sig.note, -1); + runtime_noteclear(&sig.note); } break; } @@ -138,7 +138,7 @@ // to use for initialization. It does not pass // signal information in m. sig.inuse = true; // enable reception of signals; cannot disable - runtime_noteclear(&sig); + runtime_noteclear(&sig.note); return; } diff -r bb70e852004f libgo/runtime/time.goc --- a/libgo/runtime/time.goc Fri Jan 16 13:28:21 2015 -0800 +++ b/libgo/runtime/time.goc Fri Apr 03 17:31:02 2015 -0700 @@ -92,17 +92,17 @@ t.fv = &readyv; t.arg.__object = g; t.seq = 0; - runtime_lock(&timers); + runtime_lock(&timers.lock); addtimer(&t); - runtime_parkunlock(&timers, reason); + runtime_parkunlock(&timers.lock, reason); } void runtime_addtimer(Timer *t) { - runtime_lock(&timers); + runtime_lock(&timers.lock); addtimer(t); - runtime_unlock(&timers); + runtime_unlock(&timers.lock); } // Add a timer to the heap and start or kick the timer proc @@ -167,14 +167,14 @@ i = t->i; gi = i; - runtime_lock(&timers); + runtime_lock(&timers.lock); // t may not be registered anymore and may have // a bogus i (typically 0, if generated by Go). // Verify it before proceeding. i = t->i; if(i < 0 || i >= timers.len || timers.t[i] != t) { - runtime_unlock(&timers); + runtime_unlock(&timers.lock); return false; } @@ -190,7 +190,7 @@ } if(debug) dumptimers("deltimer"); - runtime_unlock(&timers); + runtime_unlock(&timers.lock); return true; } @@ -209,7 +209,7 @@ uintptr seq; for(;;) { - runtime_lock(&timers); + runtime_lock(&timers.lock); timers.sleeping = false; now = runtime_nanotime(); for(;;) { @@ -236,7 +236,7 @@ f = (void*)t->fv->fn; arg = t->arg; seq = t->seq; - runtime_unlock(&timers); + runtime_unlock(&timers.lock); __builtin_call_with_static_chain(f(arg, seq), fv); // clear f and arg to avoid leak while sleeping for next timer @@ -246,20 +246,20 @@ arg.__object = nil; USED(&arg); - runtime_lock(&timers); + runtime_lock(&timers.lock); } if(delta < 0) { // No timers left - put goroutine to sleep. timers.rescheduling = true; runtime_g()->isbackground = true; - runtime_parkunlock(&timers, "timer goroutine (idle)"); + runtime_parkunlock(&timers.lock, "timer goroutine (idle)"); runtime_g()->isbackground = false; continue; } // At least one timer pending. Sleep until then. timers.sleeping = true; runtime_noteclear(&timers.waitnote); - runtime_unlock(&timers); + runtime_unlock(&timers.lock); runtime_notetsleepg(&timers.waitnote, delta); } }