mirror of
https://github.com/golang/go
synced 2024-11-17 19:54:45 -07:00
runtime: leave cleantimers early if G is being preempted
The cleantimers can run for a while in some unlikely cases. If the GC is trying to preempt the G, it is forced to wait as the G is holding timersLock. To avoid introducing a GC delay, return from cleantimers if the G has a preemption request. Fixes #37779 Change-Id: Id9a567f991e26668e2292eefc39e2edc56efa4e0 Reviewed-on: https://go-review.googlesource.com/c/go/+/223122 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
29b36a88ab
commit
5d70cb0667
@ -499,10 +499,20 @@ func resettimer(t *timer, when int64) {
|
||||
// slows down addtimer. Reports whether no timer problems were found.
|
||||
// The caller must have locked the timers for pp.
|
||||
func cleantimers(pp *p) {
|
||||
gp := getg()
|
||||
for {
|
||||
if len(pp.timers) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
// This loop can theoretically run for a while, and because
|
||||
// it is holding timersLock it cannot be preempted.
|
||||
// If someone is trying to preempt us, just return.
|
||||
// We can clean the timers later.
|
||||
if gp.preemptStop {
|
||||
return
|
||||
}
|
||||
|
||||
t := pp.timers[0]
|
||||
if t.pp.ptr() != pp {
|
||||
throw("cleantimers: bad p")
|
||||
|
Loading…
Reference in New Issue
Block a user