diff options
| author | Theodore Dubois <tbodt@google.com> | 2020-03-12 01:06:57 +0000 |
|---|---|---|
| committer | Theodore Dubois <tbodt@google.com> | 2020-03-13 17:45:36 +0000 |
| commit | 23d7dafd10e382f42c34618f7c86b3ff1c9d4245 (patch) | |
| tree | 4e1214edd3fe0de53af09bd3e0e25745c3e64ff3 | |
| parent | 8b40c00eab2a08e99eb27f21ef286dd0af155a4a (diff) | |
| download | git-repo-23d7dafd10e382f42c34618f7c86b3ff1c9d4245.tar.gz | |
Reland "Port _FileDescriptorStreamsNonBlocking to use poll()"
Now that repo 2 requires Python 3, we can reland this.
This reverts commit 91d9587e45608a5f95cd842426b43452a60abb5e.
Change-Id: Id5b178ebb53bdba04bfa79cbb5c698ae5080c957
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/258672
Reviewed-by: Mike Frysinger <vapier@google.com>
Tested-by: Theodore Dubois <tbodt@google.com>
| -rw-r--r-- | platform_utils.py | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/platform_utils.py b/platform_utils.py index f1da75eb..d10e888d 100644 --- a/platform_utils.py +++ b/platform_utils.py | |||
| @@ -90,6 +90,11 @@ class _FileDescriptorStreamsNonBlocking(FileDescriptorStreams): | |||
| 90 | """ Implementation of FileDescriptorStreams for platforms that support | 90 | """ Implementation of FileDescriptorStreams for platforms that support |
| 91 | non blocking I/O. | 91 | non blocking I/O. |
| 92 | """ | 92 | """ |
| 93 | def __init__(self): | ||
| 94 | super(_FileDescriptorStreamsNonBlocking, self).__init__() | ||
| 95 | self._poll = select.poll() | ||
| 96 | self._fd_to_stream = {} | ||
| 97 | |||
| 93 | class Stream(object): | 98 | class Stream(object): |
| 94 | """ Encapsulates a file descriptor """ | 99 | """ Encapsulates a file descriptor """ |
| 95 | 100 | ||
| @@ -114,11 +119,18 @@ class _FileDescriptorStreamsNonBlocking(FileDescriptorStreams): | |||
| 114 | self.fd.close() | 119 | self.fd.close() |
| 115 | 120 | ||
| 116 | def _create_stream(self, fd, dest, std_name): | 121 | def _create_stream(self, fd, dest, std_name): |
| 117 | return self.Stream(fd, dest, std_name) | 122 | stream = self.Stream(fd, dest, std_name) |
| 123 | self._fd_to_stream[stream.fileno()] = stream | ||
| 124 | self._poll.register(stream, select.POLLIN) | ||
| 125 | return stream | ||
| 126 | |||
| 127 | def remove(self, stream): | ||
| 128 | self._poll.unregister(stream) | ||
| 129 | del self._fd_to_stream[stream.fileno()] | ||
| 130 | super(_FileDescriptorStreamsNonBlocking, self).remove(stream) | ||
| 118 | 131 | ||
| 119 | def select(self): | 132 | def select(self): |
| 120 | ready_streams, _, _ = select.select(self.streams, [], []) | 133 | return [self._fd_to_stream[fd] for fd, _ in self._poll.poll()] |
| 121 | return ready_streams | ||
| 122 | 134 | ||
| 123 | 135 | ||
| 124 | class _FileDescriptorStreamsThreads(FileDescriptorStreams): | 136 | class _FileDescriptorStreamsThreads(FileDescriptorStreams): |
