Skip to content

Commit 936b3a0

Browse files
committed
Fix exec deadlock when emitter is not Typer intf
1 parent 4ade007 commit 936b3a0

File tree

1 file changed

+34
-20
lines changed

1 file changed

+34
-20
lines changed

executor.go

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -50,32 +50,46 @@ func (x *executor) Execute(req *Request, re ResponseEmitter, env Environment) er
5050
return err
5151
}
5252
}
53+
maybeStartPostRun := func(formatters PostRunMap) <-chan error {
54+
var (
55+
postRun func(Response, ResponseEmitter) error
56+
postRunCh = make(chan error)
57+
)
5358

54-
// contains the error returned by PostRun
55-
errCh := make(chan error, 1)
56-
if cmd.PostRun != nil {
57-
if typer, ok := re.(interface {
58-
Type() PostRunType
59-
}); ok && cmd.PostRun[typer.Type()] != nil {
60-
var (
61-
res Response
62-
lower = re
63-
)
64-
65-
re, res = NewChanResponsePair(req)
59+
if postRun == nil {
60+
close(postRunCh)
61+
return postRunCh
62+
}
6663

67-
go func() {
68-
defer close(errCh)
69-
errCh <- lower.CloseWithError(cmd.PostRun[typer.Type()](res, lower))
70-
}()
64+
// check if we have a formatter for this emitter type
65+
typer, isTyper := re.(interface {
66+
Type() PostRunType
67+
})
68+
if isTyper &&
69+
formatters[typer.Type()] != nil {
70+
postRun = formatters[typer.Type()]
71+
} else {
72+
close(postRunCh)
73+
return postRunCh
7174
}
72-
} else {
73-
// not using this channel today
74-
close(errCh)
75+
76+
// redirect emitter to us
77+
// and start waiting for emissions
78+
var (
79+
postRes Response
80+
postEmitter = re
81+
)
82+
re, postRes = NewChanResponsePair(req)
83+
go func() {
84+
defer close(postRunCh)
85+
postRunCh <- postEmitter.CloseWithError(postRun(postRes, postEmitter))
86+
}()
87+
return postRunCh
7588
}
7689

90+
postRunCh := maybeStartPostRun(cmd.PostRun)
7791
runCloseErr := re.CloseWithError(cmd.Run(req, re, env))
78-
postCloseErr := <-errCh
92+
postCloseErr := <-postRunCh
7993
switch runCloseErr {
8094
case ErrClosingClosedEmitter, nil:
8195
default:

0 commit comments

Comments
 (0)