diff options
Diffstat (limited to 'src/runtime/mcache.go')
-rw-r--r-- | src/runtime/mcache.go | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/runtime/mcache.go b/src/runtime/mcache.go index d3afef6be..f8389c5cb 100644 --- a/src/runtime/mcache.go +++ b/src/runtime/mcache.go @@ -38,7 +38,12 @@ func freemcache(c *mcache) { systemstack(func() { mCache_ReleaseAll(c) stackcache_clear(c) - gcworkbuffree(c.gcworkbuf) + + // NOTE(rsc,rlh): If gcworkbuffree comes back, we need to coordinate + // with the stealing of gcworkbufs during garbage collection to avoid + // a race where the workbuf is double-freed. + // gcworkbuffree(c.gcworkbuf) + lock(&mheap_.lock) purgecachedstats(c) fixAlloc_Free(&mheap_.cachealloc, unsafe.Pointer(c)) @@ -54,7 +59,7 @@ func mCache_Refill(c *mcache, sizeclass int32) *mspan { _g_.m.locks++ // Return the current cached span to the central lists. s := c.alloc[sizeclass] - if s.freelist != nil { + if s.freelist.ptr() != nil { gothrow("refill on a nonempty span") } if s != &emptymspan { @@ -66,7 +71,7 @@ func mCache_Refill(c *mcache, sizeclass int32) *mspan { if s == nil { gothrow("out of memory") } - if s.freelist == nil { + if s.freelist.ptr() == nil { println(s.ref, (s.npages<<_PageShift)/s.elemsize) gothrow("empty span") } |