Skip to content

Commit d30d61d

Browse files
committed
Try to avoid server hangs.
It seems that the most common cause (if not the only cause) of the dictation server hangs is natlink.natConnect() hanging. Previously, in an effort to coalesce multiple connections to natlink across a single server session, we always connected to natlink upon connection to the server. This was hanging, and in most cases, we did not even need to use natlink in that server session. So, instead, connect lazily to natlink.
1 parent ce7ae4f commit d30d61d

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

dictation_server.pyw

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,20 +62,31 @@ def set_taskbar_autohide(on):
6262
CLIPBOARD_RTF = win32clipboard.RegisterClipboardFormat('Rich Text Format')
6363

6464
class DragonService(rpyc.Service):
65+
__slots__ = ('natlink_connected',)
66+
6567
should_keep_serving = True
6668

6769
def on_connect(self):
68-
natlink.natConnect(True)
70+
self.natlink_connected = False
6971

7072
def on_disconnect(self):
71-
natlink.natDisconnect()
73+
if self.natlink_connected:
74+
natlink.natDisconnect()
75+
76+
def natlink(self):
77+
if not self.natlink_connected:
78+
logging.info('connecting...')
79+
natlink.natConnect(True)
80+
logging.info('connected')
81+
self.natlink_connected = True
82+
return natlink
7283

7384
def exposed_get_mic_state(self):
74-
return natlink.getMicState()
85+
return self.natlink().getMicState()
7586

7687
def exposed_set_mic_state(self, state):
7788
try:
78-
natlink.setMicState(state)
89+
self.natlink().setMicState(state)
7990
except natlink.NatError:
8091
if state != 'on':
8192
raise

0 commit comments

Comments
 (0)