summaryrefslogtreecommitdiffstats
path: root/llgo/libgo-noext.diff
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2014-11-27 00:06:42 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2014-11-27 00:06:42 +0000
commitad9841e8ac74bfcb1814b728a143408e87dd00a7 (patch)
treea36b962fece0b5b9676f26c1af90b43388069284 /llgo/libgo-noext.diff
parent5468e86469f716eb40b1b39dfd9fd92e4f35df9e (diff)
downloadbcm5719-llvm-ad9841e8ac74bfcb1814b728a143408e87dd00a7.tar.gz
bcm5719-llvm-ad9841e8ac74bfcb1814b728a143408e87dd00a7.zip
Initial commit of llgo.
llvm-svn: 222857
Diffstat (limited to 'llgo/libgo-noext.diff')
-rw-r--r--llgo/libgo-noext.diff1788
1 files changed, 1788 insertions, 0 deletions
diff --git a/llgo/libgo-noext.diff b/llgo/libgo-noext.diff
new file mode 100644
index 00000000000..2277270dd81
--- /dev/null
+++ b/llgo/libgo-noext.diff
@@ -0,0 +1,1788 @@
+diff -r 225a208260a6 libgo/runtime/chan.goc
+--- a/libgo/runtime/chan.goc Mon Sep 22 14:14:24 2014 -0700
++++ b/libgo/runtime/chan.goc Tue Sep 23 15:59:57 2014 -0700
+@@ -115,7 +115,7 @@
+ mysg.releasetime = -1;
+ }
+
+- runtime_lock(c);
++ runtime_lock(&c->lock);
+ if(raceenabled)
+ runtime_racereadpc(c, pc, chansend);
+ if(c->closed)
+@@ -128,7 +128,7 @@
+ if(sg != nil) {
+ if(raceenabled)
+ racesync(c, sg);
+- runtime_unlock(c);
++ runtime_unlock(&c->lock);
+
+ gp = sg->g;
+ gp->param = sg;
+@@ -141,7 +141,7 @@
+ }
+
+ if(!block) {
+- runtime_unlock(c);
++ runtime_unlock(&c->lock);
+ return false;
+ }
+
+@@ -150,10 +150,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;
+@@ -170,16 +170,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;
+ }
+
+@@ -196,18 +196,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
+ }
+@@ -247,7 +247,7 @@
+ mysg.releasetime = -1;
+ }
+
+- runtime_lock(c);
++ runtime_lock(&c->lock);
+ if(c->dataqsiz > 0)
+ goto asynch;
+
+@@ -258,7 +258,7 @@
+ if(sg != nil) {
+ if(raceenabled)
+ racesync(c, sg);
+- runtime_unlock(c);
++ runtime_unlock(&c->lock);
+
+ if(ep != nil)
+ runtime_memmove(ep, sg->elem, c->elemsize);
+@@ -274,7 +274,7 @@
+ }
+
+ if(!block) {
+- runtime_unlock(c);
++ runtime_unlock(&c->lock);
+ return false;
+ }
+
+@@ -283,10 +283,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;
+@@ -304,7 +304,7 @@
+ goto closed;
+
+ if(!block) {
+- runtime_unlock(c);
++ runtime_unlock(&c->lock);
+ if(received != nil)
+ *received = false;
+ return false;
+@@ -313,9 +313,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;
+ }
+
+@@ -334,12 +334,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;
+@@ -354,7 +354,7 @@
+ *received = false;
+ if(raceenabled)
+ runtime_raceacquire(c);
+- runtime_unlock(c);
++ runtime_unlock(&c->lock);
+ if(mysg.releasetime > 0)
+ runtime_blockevent(mysg.releasetime - t0, 2);
+ return true;
+@@ -628,7 +628,7 @@
+ c0 = sel->lockorder[i];
+ if(c0 && c0 != c) {
+ c = sel->lockorder[i];
+- runtime_lock(c);
++ runtime_lock(&c->lock);
+ }
+ }
+ }
+@@ -656,7 +656,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);
+ }
+ }
+
+@@ -1071,9 +1071,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");
+ }
+
+@@ -1108,7 +1108,7 @@
+ runtime_ready(gp);
+ }
+
+- runtime_unlock(c);
++ runtime_unlock(&c->lock);
+ }
+
+ void
+diff -r 225a208260a6 libgo/runtime/chan.h
+--- a/libgo/runtime/chan.h Mon Sep 22 14:14:24 2014 -0700
++++ b/libgo/runtime/chan.h Tue Sep 23 15:59:57 2014 -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 225a208260a6 libgo/runtime/heapdump.c
+--- a/libgo/runtime/heapdump.c Mon Sep 22 14:14:24 2014 -0700
++++ b/libgo/runtime/heapdump.c Tue Sep 23 15:59:57 2014 -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 225a208260a6 libgo/runtime/malloc.goc
+--- a/libgo/runtime/malloc.goc Mon Sep 22 14:14:24 2014 -0700
++++ b/libgo/runtime/malloc.goc Tue Sep 23 15:59:57 2014 -0700
+@@ -440,9 +440,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);
+@@ -743,7 +743,7 @@
+
+ static struct
+ {
+- Lock;
++ Lock lock;
+ byte* pos;
+ byte* end;
+ } persistent;
+@@ -772,19 +772,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 225a208260a6 libgo/runtime/malloc.h
+--- a/libgo/runtime/malloc.h Mon Sep 22 14:14:24 2014 -0700
++++ b/libgo/runtime/malloc.h Tue Sep 23 15:59:57 2014 -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 225a208260a6 libgo/runtime/mcache.c
+--- a/libgo/runtime/mcache.c Mon Sep 22 14:14:24 2014 -0700
++++ b/libgo/runtime/mcache.c Tue Sep 23 15:59:57 2014 -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]<<PageShift)/size) {
+- 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;
+ }
+@@ -118,12 +118,12 @@
+ for(i=0; i<NumSizeClasses; i++) {
+ s = c->alloc[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 225a208260a6 libgo/runtime/mcentral.c
+--- a/libgo/runtime/mcentral.c Mon Sep 22 14:14:24 2014 -0700
++++ b/libgo/runtime/mcentral.c Tue Sep 23 15:59:57 2014 -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<<PageShift), size, n, size*n < (s->npages<<PageShift));
+
+- runtime_lock(c);
++ runtime_lock(&c->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<<PageShift), s->npages<<PageShift);
+ runtime_MHeap_Free(&runtime_mheap, s, 0);
+ }
+diff -r 225a208260a6 libgo/runtime/mgc0.c
+--- a/libgo/runtime/mgc0.c Mon Sep 22 14:14:24 2014 -0700
++++ b/libgo/runtime/mgc0.c Tue Sep 23 15:59:57 2014 -0700
+@@ -225,7 +225,7 @@
+ Note alldone;
+ ParFor *markfor;
+
+- Lock;
++ Lock lock;
+ byte *chunk;
+ uintptr nchunk;
+ } work __attribute__((aligned(8)));
+@@ -1337,7 +1337,7 @@
+ // retain everything it points to.
+ spf = (SpecialFinalizer*)sp;
+ // A finalizer can be set for an inner byte of an object, find object beginning.
+- p = (void*)((s->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;
+@@ -2421,7 +2421,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);
+@@ -2436,7 +2436,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;
+ }
+
+@@ -2444,14 +2444,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 225a208260a6 libgo/runtime/mheap.c
+--- a/libgo/runtime/mheap.c Mon Sep 22 14:14:24 2014 -0700
++++ b/libgo/runtime/mheap.c Tue Sep 23 15:59:57 2014 -0700
+@@ -70,7 +70,7 @@
+ runtime_MSpanList_Init(&h->freelarge);
+ runtime_MSpanList_Init(&h->busylarge);
+ for(i=0; i<nelem(h->central); 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<<PageShift), s->npages<<PageShift);
+@@ -386,7 +386,7 @@
+ void
+ runtime_MHeap_Free(MHeap *h, MSpan *s, int32 acct)
+ {
+- runtime_lock(h);
++ runtime_lock(&h->lock);
+ mstats.heap_alloc += runtime_m()->mcache->local_cachealloc;
+ runtime_m()->mcache->local_cachealloc = 0;
+ mstats.heap_inuse -= s->npages<<PageShift;
+@@ -395,7 +395,7 @@
+ mstats.heap_objects--;
+ }
+ MHeap_FreeLocked(h, s);
+- runtime_unlock(h);
++ runtime_unlock(&h->lock);
+ }
+
+ static void
+@@ -548,10 +548,10 @@
+ runtime_noteclear(&note);
+ runtime_notetsleepg(&note, 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(&note, -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 225a208260a6 libgo/runtime/netpoll.goc
+--- a/libgo/runtime/netpoll.goc Mon Sep 22 14:14:24 2014 -0700
++++ b/libgo/runtime/netpoll.goc Tue Sep 23 15:59:57 2014 -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
+@@ -223,7 +223,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)
+@@ -233,7 +233,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;
+@@ -249,7 +249,7 @@
+ runtime_deltimer(&pd->wt);
+ pd->wt.fv = nil;
+ }
+- runtime_unlock(pd);
++ runtime_unlock(&pd->lock);
+ if(rg)
+ runtime_ready(rg);
+ if(wg)
+@@ -277,13 +277,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
+@@ -401,10 +401,10 @@
+ // If it's stale, ignore the timer event.
+ seq = (uintptr)arg.type;
+ rg = wg = nil;
+- runtime_lock(pd);
++ runtime_lock(&pd->lock);
+ 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 225a208260a6 libgo/runtime/proc.c
+--- a/libgo/runtime/proc.c Mon Sep 22 14:14:24 2014 -0700
++++ b/libgo/runtime/proc.c Tue Sep 23 15:59:57 2014 -0700
+@@ -357,7 +357,7 @@
+
+ typedef struct Sched Sched;
+ struct Sched {
+- Lock;
++ Lock lock;
+
+ uint64 goidgen;
+ M* midle; // idle m's waiting for work
+@@ -770,7 +770,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);
+@@ -781,7 +781,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.
+@@ -808,7 +808,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;
+@@ -816,7 +816,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;
+ }
+
+@@ -825,14 +825,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;
+ }
+
+@@ -842,7 +842,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)
+@@ -855,7 +855,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.
+@@ -894,7 +894,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();
+@@ -914,7 +914,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) {
+@@ -948,7 +948,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;
+@@ -972,7 +972,7 @@
+ runtime_sched.sysmonwait = false;
+ runtime_notewakeup(&runtime_sched.sysmonnote);
+ }
+- runtime_unlock(&runtime_sched);
++ runtime_unlock(&runtime_sched.lock);
+
+ while(p1) {
+ p = p1;
+@@ -1404,9 +1404,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) {
+@@ -1433,18 +1433,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)
+@@ -1477,28 +1477,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.
+@@ -1570,11 +1570,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();
+ }
+
+@@ -1625,9 +1625,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;
+ }
+@@ -1661,19 +1661,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);
+@@ -1682,9 +1682,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;
+@@ -1701,9 +1701,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);
+@@ -1746,14 +1746,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);
+@@ -1784,9 +1784,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();
+ }
+@@ -1880,9 +1880,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.
+@@ -1985,24 +1985,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--;
+@@ -2113,13 +2113,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;
+@@ -2138,7 +2138,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);
+@@ -2146,7 +2146,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.
+@@ -2425,13 +2425,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;
+@@ -2536,7 +2536,7 @@
+ }
+
+ static struct {
+- Lock;
++ Lock lock;
+ void (*fn)(uintptr*, int32);
+ int32 hz;
+ uintptr pcbuf[TracebackMaxFrames];
+@@ -2568,9 +2568,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;
+ }
+@@ -2598,7 +2598,7 @@
+ prof.pcbuf[1] = (uintptr)System;
+ }
+ prof.fn(prof.pcbuf, n);
+- runtime_unlock(&prof);
++ runtime_unlock(&prof.lock);
+ mp->mallocing--;
+ }
+
+@@ -2623,13 +2623,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);
+@@ -2767,11 +2767,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.
+@@ -2840,16 +2840,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);
+@@ -2978,7 +2978,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);
+@@ -3014,7 +3014,7 @@
+ }
+ }
+ if(!detailed) {
+- runtime_unlock(&runtime_sched);
++ runtime_unlock(&runtime_sched.lock);
+ return;
+ }
+ for(mp = runtime_allm; mp; mp = mp->alllink) {
+@@ -3046,7 +3046,7 @@
+ lockedm ? lockedm->id : -1);
+ }
+ runtime_unlock(&allglock);
+- runtime_unlock(&runtime_sched);
++ runtime_unlock(&runtime_sched.lock);
+ }
+
+ // Put mp on midle list.
+@@ -3202,9 +3202,9 @@
+ for(i=0; i<n; i++)
+ batch[i]->schedlink = 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;
+ }
+
+@@ -3356,11 +3356,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 225a208260a6 libgo/runtime/runtime.h
+--- a/libgo/runtime/runtime.h Mon Sep 22 14:14:24 2014 -0700
++++ b/libgo/runtime/runtime.h Tue Sep 23 15:59:57 2014 -0700
+@@ -286,7 +286,7 @@
+
+ struct P
+ {
+- Lock;
++ Lock lock;
+
+ int32 id;
+ uint32 status; // one of Pidle/Prunning/...
+@@ -384,7 +384,7 @@
+
+ struct Timers
+ {
+- Lock;
++ Lock lock;
+ G *timerproc;
+ bool sleeping;
+ bool rescheduling;
+diff -r 225a208260a6 libgo/runtime/sema.goc
+--- a/libgo/runtime/sema.goc Mon Sep 22 14:14:24 2014 -0700
++++ b/libgo/runtime/sema.goc Tue Sep 23 15:59:57 2014 -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 225a208260a6 libgo/runtime/sigqueue.goc
+--- a/libgo/runtime/sigqueue.goc Mon Sep 22 14:14:24 2014 -0700
++++ b/libgo/runtime/sigqueue.goc Tue Sep 23 15:59:57 2014 -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 225a208260a6 libgo/runtime/time.goc
+--- a/libgo/runtime/time.goc Mon Sep 22 14:14:24 2014 -0700
++++ b/libgo/runtime/time.goc Tue Sep 23 15:59:57 2014 -0700
+@@ -94,17 +94,17 @@
+ t.period = 0;
+ t.fv = &readyv;
+ t.arg.__object = g;
+- 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
+@@ -169,14 +169,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;
+ }
+
+@@ -192,7 +192,7 @@
+ }
+ if(debug)
+ dumptimers("deltimer");
+- runtime_unlock(&timers);
++ runtime_unlock(&timers.lock);
+ return true;
+ }
+
+@@ -210,7 +210,7 @@
+ Eface arg;
+
+ for(;;) {
+- runtime_lock(&timers);
++ runtime_lock(&timers.lock);
+ timers.sleeping = false;
+ now = runtime_nanotime();
+ for(;;) {
+@@ -236,7 +236,7 @@
+ fv = t->fv;
+ f = (void*)t->fv->fn;
+ arg = t->arg;
+- runtime_unlock(&timers);
++ runtime_unlock(&timers.lock);
+ if(raceenabled)
+ runtime_raceacquire(t);
+ __go_set_closure(fv);
+@@ -249,20 +249,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);
+ }
+ }
OpenPOWER on IntegriCloud