1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 from __future__ import absolute_import
21
22 import errno
23 import socket
24 import select
25 import time
26
27 from ._compat import socket_errno
28
29 PN_INVALID_SOCKET = -1
32
33 @staticmethod
35 s.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, True)
36 s.setblocking(False)
37
38 @staticmethod
41
42 @staticmethod
44 s = socket.socket()
45 IO._setupsocket(s)
46 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
47 s.bind((host, port))
48 s.listen(10)
49 return s
50
51 @staticmethod
53 n = s.accept()
54 IO._setupsocket(n[0])
55 return n
56
57 @staticmethod
59 s = socket.socket(addr[0], addr[1], addr[2])
60 IO._setupsocket(s)
61 try:
62 s.connect(addr[4])
63 except socket.error as e:
64 if socket_errno(e) not in (errno.EINPROGRESS, errno.EWOULDBLOCK, errno.EAGAIN):
65 raise
66 return s
67
68 @staticmethod
71
72 @staticmethod
74 time.sleep(t)
75 return
76
78
80 self._selectables = set()
81 self._reading = set()
82 self._writing = set()
83 self._deadline = None
84
85 - def add(self, selectable):
96
102
103 @property
105 return len(self._selectables)
106
108 for sel in self._selectables:
109 if sel.deadline:
110 if self._deadline is None:
111 self._deadline = sel.deadline
112 else:
113 self._deadline = min(sel.deadline, self._deadline)
114
115 - def update(self, selectable):
123
125
126 def select_inner(timeout):
127
128
129
130 r = self._reading
131 w = self._writing
132
133 now = time.time()
134
135
136 if timeout is None and self._deadline is None:
137 return IO.select(r, w, w)
138
139 if timeout is None:
140 t = max(0, self._deadline - now)
141 return IO.select(r, w, w, t)
142
143 if self._deadline is None:
144 return IO.select(r, w, w, timeout)
145
146 t = max(0, min(timeout, self._deadline - now))
147 if len(r)==0 and len(w)==0:
148 if t > 0: IO.sleep(t)
149 return ([],[],[])
150
151 return IO.select(r, w, w, t)
152
153
154
155
156 try:
157 r, w, ex = select_inner(timeout)
158 except select.error as e:
159 if socket_errno(e) != errno.EINTR:
160 raise
161 r, w, ex = ([], [], [])
162
163
164 w += ex
165
166
167 now = time.time()
168 t = [s for s in self._selectables if s.deadline and now > s.deadline]
169 self._deadline = None
170 self.update_deadline()
171 return r, w, t
172