1
0
mirror of https://github.com/golang/go synced 2024-10-01 18:28:32 -06:00

runtime: start GC background sweep eagerly

Starting it lazily causes a memory allocation (for the goroutine) during GC.

First use of channels for runtime implementation.

Change-Id: I9cd24dcadbbf0ee5070ee6d0ed7ea415504f316c
Reviewed-on: https://go-review.googlesource.com/6960
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
Russ Cox 2015-03-05 16:04:17 -05:00
parent 632217aae4
commit 5789b28525
3 changed files with 19 additions and 6 deletions

View File

@ -176,6 +176,16 @@ func gcinit() {
memstats.next_gc = heapminimum
}
// gcenable is called after the bulk of the runtime initialization,
// just before we're about to start letting user code run.
// It kicks off the background sweeper goroutine and enables GC.
func gcenable() {
c := make(chan int, 1)
go bgsweep(c)
<-c
memstats.enablegc = true // now that runtime is initialized, GC is okay
}
func setGCPercent(in int32) (out int32) {
lock(&mheap_.lock)
out = gcpercent
@ -568,10 +578,7 @@ func gcSweep(mode int) {
// Background sweep.
lock(&sweep.lock)
if !sweep.started {
go bgsweep()
sweep.started = true
} else if sweep.parked {
if sweep.parked {
sweep.parked = false
ready(sweep.g)
}

View File

@ -42,8 +42,14 @@ func finishsweep_m() {
}
}
func bgsweep() {
func bgsweep(c chan int) {
sweep.g = getg()
lock(&sweep.lock)
sweep.parked = true
c <- 1
goparkunlock(&sweep.lock, "GC sweep wait", traceEvGoBlock)
for {
for gosweepone() != ^uintptr(0) {
sweep.nbgsweep++

View File

@ -58,7 +58,7 @@ func main() {
}
}()
memstats.enablegc = true // now that runtime is initialized, GC is okay
gcenable()
if iscgo {
if _cgo_thread_start == nil {