Code cleanup, make sure race conditions can't happen, at least in theory.

This commit is contained in:
Storm Dragon 2025-06-20 03:10:07 -04:00
parent f4ed8da4c3
commit 64e79f6945
3 changed files with 36 additions and 24 deletions

View File

@ -45,10 +45,14 @@ class driver(remoteDriver):
continue continue
if self.fenrirSock in r: if self.fenrirSock in r:
client_sock, client_addr = self.fenrirSock.accept() client_sock, client_addr = self.fenrirSock.accept()
# Ensure client socket is always closed to prevent resource leaks
try:
try: try:
rawdata = client_sock.recv(8129) rawdata = client_sock.recv(8129)
except Exception as e: except Exception as e:
self.env['runtime']['debug'].writeDebugOut('unixDriver watchDog: Error receiving data from client: ' + str(e), debug.debugLevel.ERROR) self.env['runtime']['debug'].writeDebugOut('unixDriver watchDog: Error receiving data from client: ' + str(e), debug.debugLevel.ERROR)
rawdata = b'' # Set default empty data if recv fails
try: try:
data = rawdata.decode("utf-8").rstrip().lstrip() data = rawdata.decode("utf-8").rstrip().lstrip()
eventQueue.put({"Type":fenrirEventType.RemoteIncomming, eventQueue.put({"Type":fenrirEventType.RemoteIncomming,
@ -56,6 +60,8 @@ class driver(remoteDriver):
}) })
except Exception as e: except Exception as e:
self.env['runtime']['debug'].writeDebugOut('unixDriver watchDog: Error decoding/queuing data: ' + str(e), debug.debugLevel.ERROR) self.env['runtime']['debug'].writeDebugOut('unixDriver watchDog: Error decoding/queuing data: ' + str(e), debug.debugLevel.ERROR)
finally:
# Always close client socket, even if data processing fails
try: try:
client_sock.close() client_sock.close()
except Exception as e: except Exception as e:

View File

@ -57,6 +57,9 @@ class driver(soundDriver):
return return
self.cancel() self.cancel()
self.mainloop.quit() self.mainloop.quit()
# Wait for the GLib MainLoop thread to finish to prevent shutdown races
if hasattr(self, 'thread') and self.thread.is_alive():
self.thread.join(timeout=2.0) # 2 second timeout to prevent hanging
def _onPlayerMessage(self, bus, message): def _onPlayerMessage(self, bus, message):
if not self._initialized: if not self._initialized:

View File

@ -73,6 +73,7 @@ class driver(speechDriver):
return return
self.clear_buffer() self.clear_buffer()
self.lock.acquire(True) self.lock.acquire(True)
try:
if self.proc: if self.proc:
try: try:
self.proc.terminate() self.proc.terminate()
@ -83,6 +84,8 @@ class driver(speechDriver):
except Exception as e: except Exception as e:
self.env['runtime']['debug'].writeDebugOut('speechDriver:Cancel:self.proc.kill():' + str(e),debug.debugLevel.WARNING) self.env['runtime']['debug'].writeDebugOut('speechDriver:Cancel:self.proc.kill():' + str(e),debug.debugLevel.WARNING)
self.proc = None self.proc = None
finally:
# Ensure lock is always released, even if process termination fails
self.lock.release() self.lock.release()
def setCallback(self, callback): def setCallback(self, callback):
print('SpeechDummyDriver: setCallback') print('SpeechDummyDriver: setCallback')