From c85ef4e40b6488b6a79c7c2538e8f8ed914eb7e7 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sun, 9 May 2021 18:30:46 +0900 Subject: [PATCH] audio/internal/readerdriver: Bug fix: Deadlock at resuming --- audio/internal/readerdriver/driver_darwin.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/audio/internal/readerdriver/driver_darwin.go b/audio/internal/readerdriver/driver_darwin.go index 45cf11c43..0df88db0d 100644 --- a/audio/internal/readerdriver/driver_darwin.go +++ b/audio/internal/readerdriver/driver_darwin.go @@ -259,15 +259,20 @@ func (p *players) suspend() error { } func (p *players) resume() error { + // playerImpl's Play can touch p. Avoid the deadlock. p.m.Lock() - defer p.m.Unlock() - + players := map[*playerImpl]struct{}{} for pl := range p.toResume { + players[pl] = struct{}{} + delete(p.toResume, pl) + } + p.m.Unlock() + + for pl := range players { pl.Play() if err := pl.Err(); err != nil { return err } - delete(p.toResume, pl) } return nil }