var gcCPULimiter … type gcCPULimiterState … // limiting returns true if the CPU limiter is currently enabled, meaning the Go GC // should take action to limit CPU utilization. // // It is safe to call concurrently with other operations. func (l *gcCPULimiterState) limiting() bool { … } // startGCTransition notifies the limiter of a GC transition. // // This call takes ownership of the limiter and disables all other means of // updating the limiter. Release ownership by calling finishGCTransition. // // It is safe to call concurrently with other operations. func (l *gcCPULimiterState) startGCTransition(enableGC bool, now int64) { … } // finishGCTransition notifies the limiter that the GC transition is complete // and releases ownership of it. It also accumulates STW time in the bucket. // now must be the timestamp from the end of the STW pause. func (l *gcCPULimiterState) finishGCTransition(now int64) { … } const gcCPULimiterUpdatePeriod … // needUpdate returns true if the limiter's maximum update period has been // exceeded, and so would benefit from an update. func (l *gcCPULimiterState) needUpdate(now int64) bool { … } // addAssistTime notifies the limiter of additional assist time. It will be // included in the next update. func (l *gcCPULimiterState) addAssistTime(t int64) { … } // addIdleTime notifies the limiter of additional time a P spent on the idle list. It will be // subtracted from the total CPU time in the next update. func (l *gcCPULimiterState) addIdleTime(t int64) { … } // update updates the bucket given runtime-specific information. now is the // current monotonic time in nanoseconds. // // This is safe to call concurrently with other operations, except *GCTransition. func (l *gcCPULimiterState) update(now int64) { … } // updateLocked is the implementation of update. l.lock must be held. func (l *gcCPULimiterState) updateLocked(now int64) { … } // accumulate adds time to the bucket and signals whether the limiter is enabled. // // This is an internal function that deals just with the bucket. Prefer update. // l.lock must be held. func (l *gcCPULimiterState) accumulate(mutatorTime, gcTime int64) { … } // tryLock attempts to lock l. Returns true on success. func (l *gcCPULimiterState) tryLock() bool { … } // unlock releases the lock on l. Must be called if tryLock returns true. func (l *gcCPULimiterState) unlock() { … } const capacityPerProc … // resetCapacity updates the capacity based on GOMAXPROCS. Must not be called // while the GC is enabled. // // It is safe to call concurrently with other operations. func (l *gcCPULimiterState) resetCapacity(now int64, nprocs int32) { … } type limiterEventType … const limiterEventNone … const limiterEventIdleMarkWork … const limiterEventMarkAssist … const limiterEventScavengeAssist … const limiterEventIdle … const limiterEventBits … const limiterEventTypeMask … const limiterEventStampNone … type limiterEventStamp … // makeLimiterEventStamp creates a new stamp from the event type and the current timestamp. func makeLimiterEventStamp(typ limiterEventType, now int64) limiterEventStamp { … } // duration computes the difference between now and the start time stored in the stamp. // // Returns 0 if the difference is negative, which may happen if now is stale or if the // before and after timestamps cross a 2^(64-limiterEventBits) boundary. func (s limiterEventStamp) duration(now int64) int64 { … } // type extracts the event type from the stamp. func (s limiterEventStamp) typ() limiterEventType { … } type limiterEvent … // start begins tracking a new limiter event of the current type. If an event // is already in flight, then a new event cannot begin because the current time is // already being attributed to that event. In this case, this function returns false. // Otherwise, it returns true. // // The caller must be non-preemptible until at least stop is called or this function // returns false. Because this is trying to measure "on-CPU" time of some event, getting // scheduled away during it can mean that whatever we're measuring isn't a reflection // of "on-CPU" time. The OS could deschedule us at any time, but we want to maintain as // close of an approximation as we can. func (e *limiterEvent) start(typ limiterEventType, now int64) bool { … } // consume acquires the partial event CPU time from any in-flight event. // It achieves this by storing the current time as the new event time. // // Returns the type of the in-flight event, as well as how long it's currently been // executing for. Returns limiterEventNone if no event is active. func (e *limiterEvent) consume(now int64) (typ limiterEventType, duration int64) { … } // stop stops the active limiter event. Throws if the // // The caller must be non-preemptible across the event. See start as to why. func (e *limiterEvent) stop(typ limiterEventType, now int64) { … }