diff options
author | Zac Medico <zmedico@gentoo.org> | 2011-12-16 13:56:03 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2011-12-16 13:56:03 -0800 |
commit | 47247149a48d8b4267ad849ff10924e7b6a6f3e2 (patch) | |
tree | 1f3338f3f3fa395075f7edc1cefd4491fde08cc4 /pym/_emerge/PipeReader.py | |
parent | d33a45eba7c2ee8dab019908593d213e9c727314 (diff) | |
download | portage-47247149a48d8b4267ad849ff10924e7b6a6f3e2.tar.gz portage-47247149a48d8b4267ad849ff10924e7b6a6f3e2.tar.bz2 portage-47247149a48d8b4267ad849ff10924e7b6a6f3e2.zip |
test_poll: fix array test
Since SpawnProcess no longer uses array, add conditional array support
to PipeReader and use that for tests.
Diffstat (limited to 'pym/_emerge/PipeReader.py')
-rw-r--r-- | pym/_emerge/PipeReader.py | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/pym/_emerge/PipeReader.py b/pym/_emerge/PipeReader.py index 9fedbff6f..b162fe5cc 100644 --- a/pym/_emerge/PipeReader.py +++ b/pym/_emerge/PipeReader.py @@ -15,16 +15,22 @@ class PipeReader(AbstractPollTask): """ __slots__ = ("input_files",) + \ - ("_read_data", "_reg_ids") + ("_read_data", "_reg_ids", "_use_array") def _start(self): self._reg_ids = set() self._read_data = [] + + if self._use_array: + output_handler = self._array_output_handler + else: + output_handler = self._output_handler + for k, f in self.input_files.items(): fcntl.fcntl(f.fileno(), fcntl.F_SETFL, fcntl.fcntl(f.fileno(), fcntl.F_GETFL) | os.O_NONBLOCK) self._reg_ids.add(self.scheduler.register(f.fileno(), - self._registered_events, self._output_handler)) + self._registered_events, output_handler)) self._registered = True def isAlive(self): @@ -68,6 +74,25 @@ class PipeReader(AbstractPollTask): self._unregister_if_appropriate(event) + def _array_output_handler(self, fd, event): + + for f in self.input_files.values(): + if f.fileno() == fd: + break + + while True: + data = self._read_array(f, event) + if data is None: + break + if data: + self._read_data.append(data) + else: + self._unregister() + self.wait() + break + + self._unregister_if_appropriate(event) + def _unregister(self): """ Unregister from the scheduler and close open files. |