]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: eliminate gosweepone
authorAustin Clements <austin@google.com>
Tue, 25 Sep 2018 21:32:03 +0000 (17:32 -0400)
committerAustin Clements <austin@google.com>
Tue, 9 Oct 2018 18:20:40 +0000 (18:20 +0000)
gosweepone just switches to the system stack and calls sweepone.
sweepone doesn't need to run on the system stack, so this is pretty
pointless.

Historically, this was necessary because the sweeper was written in C
and hence needed to run on the system stack. gosweepone was the
function that Go code (specifically, bgsweep) used to call into the C
sweeper implementation. This probably became unnecessary in 2014 with
CL golang.org/cl/167540043, which ported the sweeper to Go.

This CL changes all callers of gosweepone to call sweepone and
eliminates gosweepone.

Change-Id: I26b8ef0c7d060b4c0c5dedbb25ecfc936acc7269
Reviewed-on: https://go-review.googlesource.com/c/138657
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/runtime/mgc.go
src/runtime/mgcsweep.go

index 2c6af43da56376d6717adcb91f6227f129c32224..9a35c7671f2b3d0037d958a9444c8bbb80f8fca2 100644 (file)
@@ -1061,7 +1061,7 @@ func GC() {
        // complete the cycle and because runtime.GC() is often used
        // as part of tests and benchmarks to get the system into a
        // relatively stable and isolated state.
-       for atomic.Load(&work.cycles) == n+1 && gosweepone() != ^uintptr(0) {
+       for atomic.Load(&work.cycles) == n+1 && sweepone() != ^uintptr(0) {
                sweep.nbgsweep++
                Gosched()
        }
@@ -1219,7 +1219,7 @@ func gcStart(trigger gcTrigger) {
        //
        // We check the transition condition continuously here in case
        // this G gets delayed in to the next GC cycle.
-       for trigger.test() && gosweepone() != ^uintptr(0) {
+       for trigger.test() && sweepone() != ^uintptr(0) {
                sweep.nbgsweep++
        }
 
index b7528ab68f1bbcf01d0c19b3953f9662e9755841..35b717ca9b807bbc37c59e69f89648e12336a5cc 100644 (file)
@@ -52,7 +52,7 @@ func bgsweep(c chan int) {
        goparkunlock(&sweep.lock, waitReasonGCSweepWait, traceEvGoBlock, 1)
 
        for {
-               for gosweepone() != ^uintptr(0) {
+               for sweepone() != ^uintptr(0) {
                        sweep.nbgsweep++
                        Gosched()
                }
@@ -72,9 +72,8 @@ func bgsweep(c chan int) {
        }
 }
 
-// sweeps one span
-// returns number of pages returned to heap, or ^uintptr(0) if there is nothing to sweep
-//go:nowritebarrier
+// sweepone sweeps one span and returns the number of pages returned
+// to the heap, or ^uintptr(0) if there was nothing to sweep.
 func sweepone() uintptr {
        _g_ := getg()
        sweepRatio := mheap_.sweepPagesPerByte // For debugging
@@ -135,15 +134,6 @@ func sweepone() uintptr {
        return npages
 }
 
-//go:nowritebarrier
-func gosweepone() uintptr {
-       var ret uintptr
-       systemstack(func() {
-               ret = sweepone()
-       })
-       return ret
-}
-
 //go:nowritebarrier
 func gosweepdone() bool {
        return mheap_.sweepdone != 0
@@ -414,7 +404,7 @@ retry:
        newHeapLive := uintptr(atomic.Load64(&memstats.heap_live)-mheap_.sweepHeapLiveBasis) + spanBytes
        pagesTarget := int64(mheap_.sweepPagesPerByte*float64(newHeapLive)) - int64(callerSweepPages)
        for pagesTarget > int64(atomic.Load64(&mheap_.pagesSwept)-sweptBasis) {
-               if gosweepone() == ^uintptr(0) {
+               if sweepone() == ^uintptr(0) {
                        mheap_.sweepPagesPerByte = 0
                        break
                }