1 |
Author: zmedico |
2 |
Date: 2008-07-02 11:33:55 +0000 (Wed, 02 Jul 2008) |
3 |
New Revision: 10894 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/_emerge/__init__.py |
7 |
Log: |
8 |
Handle missing select.poll on interix by using select() to emulate a poll |
9 |
object. |
10 |
|
11 |
|
12 |
Modified: main/trunk/pym/_emerge/__init__.py |
13 |
=================================================================== |
14 |
--- main/trunk/pym/_emerge/__init__.py 2008-07-02 10:49:22 UTC (rev 10893) |
15 |
+++ main/trunk/pym/_emerge/__init__.py 2008-07-02 11:33:55 UTC (rev 10894) |
16 |
@@ -6813,6 +6813,61 @@ |
17 |
(self.blocks - self.blocks_satisfied)) |
18 |
return "".join(myoutput) |
19 |
|
20 |
+class PollSelectFallback(object): |
21 |
+ |
22 |
+ """ |
23 |
+ Use select to emulate a poll object, for |
24 |
+ systems that don't support poll(). |
25 |
+ """ |
26 |
+ |
27 |
+ def __init__(self): |
28 |
+ self._registered = {} |
29 |
+ self._select_args = [[], [], []] |
30 |
+ |
31 |
+ def register(self, fd, *args): |
32 |
+ """ |
33 |
+ Only select.POLLIN is currently supported! |
34 |
+ """ |
35 |
+ if len(args) > 1: |
36 |
+ raise TypeError( |
37 |
+ "register expected at most 2 arguments, got " + \ |
38 |
+ repr(1 + len(args))) |
39 |
+ |
40 |
+ eventmask = select.POLLIN | select.POLLPRI | select.POLLOUT |
41 |
+ if args: |
42 |
+ eventmask = args[0] |
43 |
+ |
44 |
+ self._registered[fd] = eventmask |
45 |
+ self._select_args = None |
46 |
+ |
47 |
+ def unregister(self, fd): |
48 |
+ self._select_args = None |
49 |
+ del self._registered[fd] |
50 |
+ |
51 |
+ def poll(self, *args): |
52 |
+ if len(args) > 1: |
53 |
+ raise TypeError( |
54 |
+ "poll expected at most 2 arguments, got " + \ |
55 |
+ repr(1 + len(args))) |
56 |
+ |
57 |
+ timeout = None |
58 |
+ if args: |
59 |
+ timeout = args[0] |
60 |
+ |
61 |
+ select_args = self._select_args |
62 |
+ if select_args is None: |
63 |
+ select_args = [self._registered.keys(), [], []] |
64 |
+ |
65 |
+ if timeout is not None: |
66 |
+ select_args = select_args[:] |
67 |
+ select_args.append(timeout) |
68 |
+ |
69 |
+ select_events = select.select(*select_args) |
70 |
+ poll_events = [] |
71 |
+ for fd in select_events[0]: |
72 |
+ poll_events.append((fd, select.POLLIN)) |
73 |
+ return poll_events |
74 |
+ |
75 |
class Scheduler(object): |
76 |
|
77 |
_opts_ignore_blockers = \ |
78 |
@@ -6873,7 +6928,12 @@ |
79 |
register=self._register, schedule=self._schedule, |
80 |
unregister=self._unregister) |
81 |
self._poll_event_handlers = {} |
82 |
- self._poll = select.poll() |
83 |
+ |
84 |
+ try: |
85 |
+ self._poll = select.poll() |
86 |
+ except AttributeError: |
87 |
+ self._poll = PollSelectFallback() |
88 |
+ |
89 |
from collections import deque |
90 |
self._task_queue = deque() |
91 |
self._running_tasks = set() |
92 |
|
93 |
-- |
94 |
gentoo-commits@l.g.o mailing list |