gcController.markStartTime = now
// Concurrent mark.
- systemstack(startTheWorldWithSema)
- now = nanotime()
+ systemstack(func() {
+ now = startTheWorldWithSema()
+ })
work.pauseNS += now - work.pauseStart
work.tMark = now
} else {
// so events don't leak into the wrong cycle.
mProf_NextCycle()
- systemstack(startTheWorldWithSema)
+ systemstack(func() { startTheWorldWithSema() })
// Flush the heap profile so we can start a new cycle next GC.
// This is relatively expensive, so we don't do it with the
// startTheWorld undoes the effects of stopTheWorld.
func startTheWorld() {
- systemstack(startTheWorldWithSema)
+ systemstack(func() { startTheWorldWithSema() })
// worldsema must be held over startTheWorldWithSema to ensure
// gomaxprocs cannot change while worldsema is held.
semrelease(&worldsema)
_g_.m.helpgc = -1
}
-func startTheWorldWithSema() {
+func startTheWorldWithSema() int64 {
_g_ := getg()
_g_.m.locks++ // disable preemption because it can be holding p in a local var
}
}
+ // Capture start-the-world time before doing clean-up tasks.
+ startTime := nanotime()
+
// Wakeup an additional proc in case we have excessive runnable goroutines
// in local queues or in the global queue. If we don't, the proc will park itself.
// If we have lots of excessive work, resetspinning will unpark additional procs as necessary.
if _g_.m.locks == 0 && _g_.preempt { // restore the preemption request in case we've cleared it in newstack
_g_.stackguard0 = stackPreempt
}
+
+ return startTime
}
// Called to start an M.