]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: assert p.destroy runs with GC not running
authorMichael Pratt <mpratt@google.com>
Mon, 6 Oct 2025 20:38:29 +0000 (16:38 -0400)
committerMichael Pratt <mpratt@google.com>
Tue, 7 Oct 2025 14:33:32 +0000 (07:33 -0700)
This is already guaranteed by stopTheWorldGC prior to procresize. Thus
the cleanup code here is dead, which is a bit confusing.

Replace it with a throw for clarity.

Change-Id: I6a6a636c8ca1487b720c4fab41b2b86c13d1d9e0
Reviewed-on: https://go-review.googlesource.com/c/go/+/709655
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/runtime/proc.go

index e5686705293e8a97f287ff0d27b64992336ee6b5..d36895b046c8c60c9f19c4100d7eda5dea3758d6 100644 (file)
@@ -5818,11 +5818,13 @@ func (pp *p) destroy() {
        // Move all timers to the local P.
        getg().m.p.ptr().timers.take(&pp.timers)
 
-       // Flush p's write barrier buffer.
-       if gcphase != _GCoff {
-               wbBufFlush1(pp)
-               pp.gcw.dispose()
+       // No need to flush p's write barrier buffer or span queue, as Ps
+       // cannot be destroyed during the mark phase.
+       if phase := gcphase; phase != _GCoff {
+               println("runtime: p id", pp.id, "destroyed during GC phase", phase)
+               throw("P destroyed while GC is running")
        }
+
        clear(pp.sudogbuf[:])
        pp.sudogcache = pp.sudogbuf[:0]
        pp.pinnerCache = nil