]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/runtime/mgc0.go
[dev.garbage] all: merge dev.cc (493ad916c3b1) into dev.garbage
[gostls13.git] / src / runtime / mgc0.go
index 00e64c0fff2940062c285fc7d0e1d987b4920e35..7797894fc5fbb9b50135a5a94e0f517d535278be 100644 (file)
@@ -51,10 +51,26 @@ func clearpools() {
                if c := p.mcache; c != nil {
                        c.tiny = nil
                        c.tinysize = 0
+
+                       // disconnect cached list before dropping it on the floor,
+                       // so that a dangling ref to one entry does not pin all of them.
+                       var sg, sgnext *sudog
+                       for sg = c.sudogcache; sg != nil; sg = sgnext {
+                               sgnext = sg.next
+                               sg.next = nil
+                       }
                        c.sudogcache = nil
                }
+
                // clear defer pools
                for i := range p.deferpool {
+                       // disconnect cached list before dropping it on the floor,
+                       // so that a dangling ref to one entry does not pin all of them.
+                       var d, dlink *_defer
+                       for d = p.deferpool[i]; d != nil; d = dlink {
+                               dlink = d.link
+                               d.link = nil
+                       }
                        p.deferpool[i] = nil
                }
        }