Fix unblock race condition randomly leading to deadlocks

This commit is contained in:
Kristóf Tóth 2019-05-03 17:31:57 +02:00
parent ca613644ac
commit dbe5b10482
2 changed files with 16 additions and 12 deletions

View File

@ -34,11 +34,13 @@ class PipeReaderThread(Thread):
return open(self._pipe_path, 'rb')
def stop(self):
self.unblock()
self._unblock()
self.join()
def unblock(self):
with suppress(OSError):
fd = osopen(self._pipe_path, O_WRONLY | O_NONBLOCK)
write(fd, self.stop_sequence)
close(fd)
def _unblock(self):
while True:
with suppress(OSError):
fd = osopen(self._pipe_path, O_WRONLY | O_NONBLOCK)
write(fd, self.stop_sequence)
close(fd)
break

View File

@ -39,11 +39,13 @@ class PipeWriterThread(Thread):
return open(self._pipe_path, 'wb')
def stop(self):
self.unblock()
self._unblock()
self.join()
def unblock(self):
self._write_queue.push_front(None)
with suppress(OSError):
fd = osopen(self._pipe_path, O_RDONLY | O_NONBLOCK)
close(fd)
def _unblock(self):
while True:
with suppress(OSError):
fd = osopen(self._pipe_path, O_RDONLY | O_NONBLOCK)
self._write_queue.push_front(None)
close(fd)
break