mirror of
https://github.com/yusing/godoxy.git
synced 2025-05-20 12:42:34 +02:00
fix shutdown stuck or panic
This commit is contained in:
parent
9f71fc2dd5
commit
ba8705fb84
3 changed files with 12 additions and 8 deletions
|
@ -12,6 +12,8 @@ func (t *Task) addCallback(about string, fn func(), waitSubTasks bool) {
|
|||
defer t.mu.Unlock()
|
||||
if t.callbacks == nil {
|
||||
t.callbacks = make(map[*Callback]struct{})
|
||||
}
|
||||
if t.callbacksDone == nil {
|
||||
t.callbacksDone = make(chan struct{})
|
||||
}
|
||||
t.callbacks[&Callback{fn, about, waitSubTasks}] = struct{}{}
|
||||
|
@ -28,14 +30,15 @@ func (t *Task) addChildCount() {
|
|||
}
|
||||
|
||||
func (t *Task) subChildCount() {
|
||||
if atomic.AddUint32(&t.children, ^uint32(0)) == 0 {
|
||||
switch atomic.AddUint32(&t.children, ^uint32(0)) {
|
||||
case 0:
|
||||
close(t.childrenDone)
|
||||
case ^uint32(0):
|
||||
panic("negative child count")
|
||||
}
|
||||
}
|
||||
|
||||
func (t *Task) runCallbacks() {
|
||||
t.mu.Lock()
|
||||
defer t.mu.Unlock()
|
||||
if len(t.callbacks) == 0 {
|
||||
return
|
||||
}
|
||||
|
|
|
@ -117,9 +117,7 @@ func (t *Task) finish(reason any) {
|
|||
Strs("callbacks", t.listCallbacks()).
|
||||
Msg("Timeout waiting for callbacks to finish")
|
||||
}
|
||||
if t.finished != nil {
|
||||
close(t.finished)
|
||||
}
|
||||
close(t.finished)
|
||||
if t == root {
|
||||
return
|
||||
}
|
||||
|
|
|
@ -30,9 +30,12 @@ func RootTask(name string, needFinish ...bool) *Task {
|
|||
}
|
||||
|
||||
func newRoot() *Task {
|
||||
t := &Task{name: "root"}
|
||||
t := &Task{
|
||||
name: "root",
|
||||
childrenDone: make(chan struct{}),
|
||||
finished: make(chan struct{}),
|
||||
}
|
||||
t.ctx, t.cancel = context.WithCancelCause(context.Background())
|
||||
t.callbacks = make(map[*Callback]struct{})
|
||||
return t
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue