]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: document that runtime.GC() blocks until GC is complete
authorAustin Clements <austin@google.com>
Fri, 29 May 2015 16:13:50 +0000 (12:13 -0400)
committerAustin Clements <austin@google.com>
Mon, 1 Jun 2015 14:51:12 +0000 (14:51 +0000)
runtime.GC() is intentionally very weakly specified. However, it is so
weakly specified that it's difficult to know that it's being used
correctly for its one intended use case: to ensure garbage collection
has run in a test that is garbage-sensitive. In particular, it is
unclear whether it is synchronous or asynchronous. In the old STW
collector this was essentially self-evident; short of queuing up a
garbage collection to run later, it had to be synchronous. However,
with the concurrent collector, there's evidence that people are
inferring that it may be asynchronous (e.g., issue #10986), as this is
both unclear in the documentation and possible in the implementation.

In fact, runtime.GC() runs a fully synchronous STW collection. We
probably don't want to commit to this exact behavior. But we can
commit to the essential property that tests rely on: that runtime.GC()
does not return until the GC has finished.

Change-Id: Ifc3045a505e1898ecdbe32c1f7e80e2e9ffacb5b
Reviewed-on: https://go-review.googlesource.com/10488
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Rick Hudson <rlh@golang.org>
src/runtime/mgc.go

index db5b2dcd363626166b5e76e66c1bd327e3fbc02a..5b5891a5796ade8f900abaf26d1230ab9662f173 100644 (file)
@@ -693,7 +693,8 @@ var work struct {
        initialHeapLive uint64
 }
 
-// GC runs a garbage collection.
+// GC runs a garbage collection and blocks until the garbage
+// collection is complete.
 func GC() {
        startGC(gcForceBlockMode)
 }