summaryrefslogtreecommitdiffstats
path: root/platform_utils.py
diff options
context:
space:
mode:
authorTheodore Dubois <tbodt@google.com>2020-03-12 01:06:57 +0000
committerTheodore Dubois <tbodt@google.com>2020-03-13 17:45:36 +0000
commit23d7dafd10e382f42c34618f7c86b3ff1c9d4245 (patch)
tree4e1214edd3fe0de53af09bd3e0e25745c3e64ff3 /platform_utils.py
parent8b40c00eab2a08e99eb27f21ef286dd0af155a4a (diff)
downloadgit-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>
Diffstat (limited to 'platform_utils.py')
-rw-r--r--platform_utils.py18
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
124class _FileDescriptorStreamsThreads(FileDescriptorStreams): 136class _FileDescriptorStreamsThreads(FileDescriptorStreams):