| 3149 | self.write_failed = True |
| 3150 | |
| 3151 | def _readline(self): |
| 3152 | if self.sigint_received: |
| 3153 | # There's a pending unhandled SIGINT. Handle it now. |
| 3154 | self.sigint_received = False |
| 3155 | raise KeyboardInterrupt |
| 3156 | |
| 3157 | # Wait for either a SIGINT or a line or EOF from the PDB server. |
| 3158 | selector = selectors.DefaultSelector() |
| 3159 | selector.register(self.signal_read, selectors.EVENT_READ) |
| 3160 | selector.register(self.server_socket, selectors.EVENT_READ) |
| 3161 | |
| 3162 | while b"\n" not in self.read_buf: |
| 3163 | for key, _ in selector.select(): |
| 3164 | if key.fileobj == self.signal_read: |
| 3165 | self.signal_read.recv(1024) |
| 3166 | if self.sigint_received: |
| 3167 | # If not, we're reading wakeup events for sigints that |
| 3168 | # we've previously handled, and can ignore them. |
| 3169 | self.sigint_received = False |
| 3170 | raise KeyboardInterrupt |
| 3171 | elif key.fileobj == self.server_socket: |
| 3172 | data = self.server_socket.recv(16 * 1024) |
| 3173 | self.read_buf += data |
| 3174 | if not data and b"\n" not in self.read_buf: |
| 3175 | # EOF without a full final line. Drop the partial line. |
| 3176 | self.read_buf = b"" |
| 3177 | return b"" |
| 3178 | |
| 3179 | ret, sep, self.read_buf = self.read_buf.partition(b"\n") |
| 3180 | return ret + sep |
| 3181 | |
| 3182 | def read_input(self, prompt, multiline_block): |
| 3183 | self.multiline_block = multiline_block |