Update
This commit is contained in:
1 parent
3530afb854
commit
6903fcff27
2146 files changed
+112256
-190703
No files matched your search
+31
-1
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// Copyright (c) Tailscale Inc & contributors
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
// Package execqueue implements an ordered asynchronous queue for executing functions.
|
||||
@@ -88,6 +88,36 @@ func (q *ExecQueue) Shutdown() {
|
||||
}
|
||||
}
|
||||
|
||||
// ShutdownAndWait signals the queue to stop, discards any queued
|
||||
// functions that have not started, and waits for the currently
|
||||
// executing function, if any, to complete or ctx to expire.
|
||||
//
|
||||
// It must not be called while holding a lock that a queued function
|
||||
// may acquire, or it will not return until ctx expires.
|
||||
func (q *ExecQueue) ShutdownAndWait(ctx context.Context) error {
|
||||
q.mu.Lock()
|
||||
q.closed = true
|
||||
if q.cancel != nil {
|
||||
q.cancel()
|
||||
}
|
||||
waitCh := q.doneWaiter
|
||||
if q.inFlight && waitCh == nil {
|
||||
waitCh = make(chan struct{})
|
||||
q.doneWaiter = waitCh
|
||||
}
|
||||
q.mu.Unlock()
|
||||
|
||||
if waitCh == nil {
|
||||
return nil
|
||||
}
|
||||
select {
|
||||
case <-waitCh:
|
||||
return nil
|
||||
case <-ctx.Done():
|
||||
return ctx.Err()
|
||||
}
|
||||
}
|
||||
|
||||
func (q *ExecQueue) initCtxLocked() {
|
||||
if q.ctx == nil {
|
||||
q.ctx, q.cancel = context.WithCancel(context.Background())
|
||||
|
||||
Reference in new issue
Block a user