mirror of
https://github.com/ankitects/anki.git
synced 2025-09-20 23:12:21 -04:00
move to a thread event to fix race condition
The old conditional objects had a problem where the calling code was notifyAll()ing before the helper threads had started waiting.
This commit is contained in:
parent
3a7f8fdc7a
commit
d717be8849
1 changed files with 9 additions and 14 deletions
|
@ -122,7 +122,7 @@ else:
|
|||
mplayerQueue = []
|
||||
mplayerManager = None
|
||||
mplayerReader = None
|
||||
mplayerCond = threading.Condition()
|
||||
mplayerEvt = threading.Event()
|
||||
mplayerClear = False
|
||||
|
||||
class MplayerReader(threading.Thread):
|
||||
|
@ -130,9 +130,7 @@ class MplayerReader(threading.Thread):
|
|||
|
||||
def run(self):
|
||||
while 1:
|
||||
mplayerCond.acquire()
|
||||
mplayerCond.wait()
|
||||
mplayerCond.release()
|
||||
mplayerEvt.wait()
|
||||
try:
|
||||
mplayerManager.mplayer.stdout.read()
|
||||
except:
|
||||
|
@ -145,8 +143,7 @@ class MplayerMonitor(threading.Thread):
|
|||
self.mplayer = None
|
||||
self.deadPlayers = []
|
||||
while 1:
|
||||
mplayerCond.acquire()
|
||||
mplayerCond.wait()
|
||||
mplayerEvt.wait()
|
||||
if mplayerQueue:
|
||||
# ensure started
|
||||
if not self.mplayer:
|
||||
|
@ -170,7 +167,7 @@ class MplayerMonitor(threading.Thread):
|
|||
else:
|
||||
return True
|
||||
self.deadPlayers = [pl for pl in self.deadPlayers if clean(pl)]
|
||||
mplayerCond.release()
|
||||
mplayerEvt.clear()
|
||||
|
||||
def kill(self):
|
||||
if not self.mplayer:
|
||||
|
@ -189,24 +186,22 @@ class MplayerMonitor(threading.Thread):
|
|||
cmd, startupinfo=si, stdin=subprocess.PIPE,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||
except OSError:
|
||||
mplayerCond.release()
|
||||
mplayerEvt.clear()
|
||||
raise Exception("Audio player not found")
|
||||
|
||||
def queueMplayer(path):
|
||||
ensureMplayerThreads()
|
||||
while mplayerEvt.isSet():
|
||||
time.sleep(0.1)
|
||||
path = path.encode(sys.getfilesystemencoding())
|
||||
mplayerCond.acquire()
|
||||
mplayerQueue.append(path)
|
||||
mplayerCond.notifyAll()
|
||||
mplayerCond.release()
|
||||
mplayerEvt.set()
|
||||
runHook("soundQueued")
|
||||
|
||||
def clearMplayerQueue():
|
||||
global mplayerClear
|
||||
mplayerCond.acquire()
|
||||
mplayerClear = True
|
||||
mplayerCond.notifyAll()
|
||||
mplayerCond.release()
|
||||
mplayerEvt.set()
|
||||
|
||||
def ensureMplayerThreads():
|
||||
global mplayerManager, mplayerReader
|
||||
|
|
Loading…
Reference in a new issue