Skip to content

Commit 307aa87

Browse files
more care taken with wakeup_read_fd on non-main threads
1 parent a6019a4 commit 307aa87

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

curtsies/input.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ def __init__(
7878
self.sigint_event = sigint_event
7979
self.disable_terminal_start_stop = disable_terminal_start_stop
8080
self.sigints: List[events.SigIntEvent] = []
81+
self.wakeup_read_fd: Optional[int] = None
8182

8283
self.readers: List[int] = []
8384
self.queued_interrupting_events: List[Union[events.Event, str]] = []
@@ -110,12 +111,14 @@ def __enter__(self) -> "Input":
110111
self.orig_sigint_handler = signal.getsignal(signal.SIGINT)
111112
signal.signal(signal.SIGINT, self.sigint_handler)
112113

113-
self.wakeup_read_fd, wfd = os.pipe()
114-
os.set_blocking(wfd, False)
115-
if sys.version_info[0] == 3 and 5 <= sys.version_info[1] < 7:
116-
signal.set_wakeup_fd(wfd)
117-
elif sys.version_info[0] == 3 and 7 <= sys.version_info[1]:
118-
signal.set_wakeup_fd(wfd, warn_on_full_buffer=False)
114+
# Non-main threads don't receive signals
115+
if threading.current_thread() is threading.main_thread():
116+
self.wakeup_read_fd, wfd = os.pipe()
117+
os.set_blocking(wfd, False)
118+
if sys.version_info[0] == 3 and 5 <= sys.version_info[1] < 7:
119+
signal.set_wakeup_fd(wfd)
120+
elif sys.version_info[0] == 3 and 7 <= sys.version_info[1]:
121+
signal.set_wakeup_fd(wfd, warn_on_full_buffer=False)
119122

120123
return self
121124

@@ -168,10 +171,8 @@ def _wait_for_read_ready_or_timeout(
168171
while True:
169172
try:
170173
(rs, _, _) = select.select(
171-
[
172-
self.in_stream.fileno(),
173-
self.wakeup_read_fd,
174-
]
174+
[self.in_stream.fileno()]
175+
+ ([] if self.wakeup_read_fd is None else [self.wakeup_read_fd])
175176
+ self.readers,
176177
[],
177178
[],

0 commit comments

Comments
 (0)