diff options
author | Christian Pointner <equinox@helsinki.at> | 2016-07-14 22:15:55 (GMT) |
---|---|---|
committer | Christian Pointner <equinox@helsinki.at> | 2016-07-14 22:15:55 (GMT) |
commit | 79dfe23a8cfabe4688a3b05998178a11ea51150c (patch) | |
tree | 9bab4e5317ea4efcd19f32113f3ec861b7b0603a /rhimport/converter.go | |
parent | 09d298877fdf473ebe5a997b20a42b4e69355c67 (diff) |
improved canceling
Diffstat (limited to 'rhimport/converter.go')
-rw-r--r-- | rhimport/converter.go | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/rhimport/converter.go b/rhimport/converter.go index 0546b97..7c35c07 100644 --- a/rhimport/converter.go +++ b/rhimport/converter.go @@ -29,6 +29,7 @@ import ( "errors" "fmt" "io" + "net/http" "os" "os/exec" "path/filepath" @@ -133,9 +134,16 @@ func (ff *FFMpegFetchConverter) Close() (err error) { func (ff *FFMpegFetchConverter) GetResult(ctx *Context, res *Result) (result string, err error) { if ff.result != nil { - r := <-ff.result - ctx.LoudnessCorr = r.loudnessCorr - return r.output, r.err + select { + case r := <-ff.result: + ctx.LoudnessCorr = r.loudnessCorr + return r.output, r.err + case <-ctx.Cancel: + ff.cmd.Process.Kill() + res.ResponseCode = http.StatusNoContent + res.ErrorString = "canceled" + return "", errors.New("canceled") + } } return "", nil } @@ -201,9 +209,16 @@ func (bs *BS1770FetchConverter) Close() (err error) { func (bs *BS1770FetchConverter) GetResult(ctx *Context, res *Result) (result string, err error) { if bs.result != nil { - r := <-bs.result - ctx.LoudnessCorr = r.loudnessCorr - return r.output, r.err + select { + case r := <-bs.result: + ctx.LoudnessCorr = r.loudnessCorr + return r.output, r.err + case <-ctx.Cancel: + bs.cmd.Process.Kill() + res.ResponseCode = http.StatusNoContent + res.ErrorString = "canceled" + return "", errors.New("canceled") + } } return "", nil } @@ -284,13 +299,29 @@ func (ff *FFMpegBS1770FetchConverter) Close() (err error) { } func (ff *FFMpegBS1770FetchConverter) GetResult(ctx *Context, res *Result) (result string, err error) { - var rff, rbs FetchConverterResult - if ff.resultFF != nil { - rff = <-ff.resultFF + if ff.resultFF == nil || ff.resultBS == nil { + return "", nil } - if ff.resultBS != nil { - rbs = <-ff.resultBS + + var rff, rbs *FetchConverterResult + for { + select { + case r := <-ff.resultFF: + rff = &r + case r := <-ff.resultBS: + rbs = &r + case <-ctx.Cancel: + ff.ffmpeg.Process.Kill() + ff.bs1770.Process.Kill() + res.ResponseCode = http.StatusNoContent + res.ErrorString = "canceled" + return "", errors.New("canceled") + } + if rff != nil && rbs != nil { + break + } } + if rff.err != nil { return rff.output, fmt.Errorf("ffmpeg: %v", rff.err) } |