@@ -41,6 +41,15 @@ def __key_check_fn(k):
4141 key_check_fn = __key_check_fn )
4242
4343
44+ def retry_intr (fn , * args , ** kwargs ):
45+ while True :
46+ res = fn (* args , ** kwargs )
47+ if res < 0 and ffi .errno == errno .EINTR :
48+ continue
49+ break
50+ return res
51+
52+
4453class error (IOError ):
4554 def __init__ (self , prefix ):
4655 self .prefix = prefix
@@ -206,12 +215,8 @@ def bind(self, address):
206215 def accept (self ):
207216 addr , addrlen_p = _gen_empty_sockaddr (AF_INET6 )
208217 sockaddr = ffi .cast ("struct linux_sockaddr*" , addr )
209- while True :
210- fd = lib .ff_accept (self .fd , sockaddr , addrlen_p )
211- if fd >= 0 :
212- break
213- if ffi .errno == errno .EINTR :
214- continue
218+ fd = retry_intr (lib .ff_accept , self .fd , sockaddr , addrlen_p )
219+ if fd < 0 :
215220 raise error ("accept:" )
216221 sock = socket (self .family , self .type , self .proto , fd )
217222 address = _parse_sockaddr (sockaddr , addrlen_p )
@@ -259,7 +264,7 @@ def recv(self, bufsize, flags=0):
259264 if bufsize < 0 :
260265 raise ValueError ("negative buffersize in recv" )
261266 cbuf = ffi .new ("char[]" , bufsize )
262- n = lib .ff_recv ( self .fd , cbuf , bufsize , flags )
267+ n = retry_intr ( lib .ff_recv , self .fd , cbuf , bufsize , flags )
263268 if n < 0 :
264269 raise error ("recv: " )
265270 buf = ffi .buffer (cbuf , n )
@@ -269,7 +274,8 @@ def recv_into(self, buf, nbytes=0, flags=0):
269274 if nbytes == 0 :
270275 nbytes = len (buf )
271276 cbuf = ffi .from_buffer (buf )
272- n = lib .ff_recv (self .fd , cbuf , nbytes , flags )
277+
278+ n = retry_intr (lib .ff_recv , self .fd , cbuf , nbytes , flags )
273279 if n < 0 :
274280 raise error ("recv: " )
275281 return n
@@ -281,7 +287,8 @@ def recvfrom(self, bufsize, flags=0):
281287 sockaddr = ffi .cast ("struct linux_sockaddr*" , addr )
282288 cbuf = ffi .new ("char[]" , bufsize )
283289
284- n = lib .ff_recvfrom (self .fd , cbuf , bufsize , flags , sockaddr , addrlen_p )
290+ n = retry_intr (lib .ff_recvfrom , self .fd , cbuf , bufsize ,
291+ flags , sockaddr , addrlen_p )
285292 if n < 0 :
286293 raise error ("recvfrom: " )
287294 buf = ffi .buffer (cbuf , n )
@@ -298,7 +305,8 @@ def recvfrom_into(self, buf, nbytes=0, flags=0):
298305 addr , addrlen_p = _gen_empty_sockaddr (AF_INET6 )
299306 sockaddr = ffi .cast ("struct linux_sockaddr*" , addr )
300307
301- n = lib .ff_recvfrom (self .fd , cbuf , nbytes , flags , sockaddr , addrlen_p )
308+ n = retry_intr (lib .ff_recvfrom , self .fd , cbuf , nbytes ,
309+ flags , sockaddr , addrlen_p )
302310 if n < 0 :
303311 raise error ("recvfrom: " )
304312 address = _parse_sockaddr (sockaddr , addrlen_p )
@@ -319,8 +327,8 @@ def recvmsg(self, bufsize, ancbufsize=0, flags=0):
319327 c_ancbuf = ffi .NULL
320328 c_ancbuf_len = ffi .new ("int*" , ancbufsize )
321329 c_flags = ffi .new ("int*" , flags )
322- n = lib .py_recvmsg ( self .fd , cbuf , bufsize , c_ancbuf ,
323- c_ancbuf_len , c_flags , sockaddr , addrlen_p )
330+ n = retry_intr ( lib .py_recvmsg , self .fd , cbuf , bufsize , c_ancbuf ,
331+ c_ancbuf_len , c_flags , sockaddr , addrlen_p )
324332 if n < 0 :
325333 raise error ("recvmsg:" )
326334 address = _parse_sockaddr (sockaddr , addrlen_p )
@@ -331,7 +339,7 @@ def recvmsg(self, bufsize, ancbufsize=0, flags=0):
331339 return bytes (buf ), ancdata , flags , address
332340
333341 def send (self , data , flags = 0 ):
334- n = lib .ff_send ( self .fd , data , len (data ), flags )
342+ n = retry_intr ( lib .ff_send , self .fd , data , len (data ), flags )
335343 if n < 0 :
336344 raise error ("send: " )
337345 return n
@@ -348,7 +356,8 @@ def sendto(self, data, *args):
348356 (len (args ) + 1 ))
349357 addr , addrlen = _gen_sockaddr (self .family , address )
350358 sockaddr = ffi .cast ("struct linux_sockaddr*" , addr )
351- n = lib .ff_send (self .fd , data , len (data ), flags , sockaddr , addrlen )
359+ n = retry_intr (lib .ff_send , self .fd , data , len (data ),
360+ flags , sockaddr , addrlen )
352361 if n < 0 :
353362 raise error ("sendto: " )
354363 return n
@@ -366,8 +375,8 @@ def sendmsg(self, buffers, ancdata=0, flags=0, address=None):
366375 else :
367376 addr , addrlen = _gen_sockaddr (self .family , address )
368377 sockaddr = ffi .cast ("struct linux_sockaddr*" , addr )
369- res = lib .py_sendmsg ( self .fd , c_bufv , c_lenarr , nbuffers ,
370- c_ancbuf , len (ancbuf ), flags , sockaddr , addrlen )
378+ res = retry_intr ( lib .py_sendmsg , self .fd , c_bufv , c_lenarr , nbuffers ,
379+ c_ancbuf , len (ancbuf ), flags , sockaddr , addrlen )
371380 if res < 0 :
372381 raise error ("sendmsg: " )
373382 return res
0 commit comments