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);
 	}
 }
