fix panic when close miner

This commit is contained in:
wanghui 2019-10-30 18:23:13 +08:00
parent d080dbd1ec
commit 03ca08d9bf

View File

@ -137,6 +137,7 @@ func (c *client) makeOutChan(ctx context.Context, ftyp reflect.Type, valOut int)
// unpack chan type to make sure it's reflect.BothDir
ctyp := reflect.ChanOf(reflect.BothDir, ftyp.Out(valOut).Elem())
ch := reflect.MakeChan(ctyp, 0) // todo: buffer?
chCtx, chCancel := context.WithCancel(ctx)
retVal = ch.Convert(ftyp.Out(valOut))
buf := (&list.List{}).Init()
@ -144,6 +145,7 @@ func (c *client) makeOutChan(ctx context.Context, ftyp reflect.Type, valOut int)
return ctx, func(result []byte, ok bool) {
if !ok {
chCancel()
// remote channel closed, close ours too
ch.Close()
return
@ -172,14 +174,18 @@ func (c *client) makeOutChan(ctx context.Context, ftyp reflect.Type, valOut int)
go func() {
for buf.Len() > 0 {
front := buf.Front()
select {
case <- chCtx.Done():
buf.Init()
default:
front := buf.Front()
bufLk.Unlock()
bufLk.Unlock()
ch.Send(front.Value.(reflect.Value).Elem())
ch.Send(front.Value.(reflect.Value).Elem()) // todo: select on ctx is probably a good idea
bufLk.Lock()
buf.Remove(front)
bufLk.Lock()
buf.Remove(front)
}
}
bufLk.Unlock()