@@ -41,6 +41,15 @@ def __key_check_fn(k):
41
41
key_check_fn = __key_check_fn )
42
42
43
43
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
+
44
53
class error (IOError ):
45
54
def __init__ (self , prefix ):
46
55
self .prefix = prefix
@@ -206,12 +215,8 @@ def bind(self, address):
206
215
def accept (self ):
207
216
addr , addrlen_p = _gen_empty_sockaddr (AF_INET6 )
208
217
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 :
215
220
raise error ("accept:" )
216
221
sock = socket (self .family , self .type , self .proto , fd )
217
222
address = _parse_sockaddr (sockaddr , addrlen_p )
@@ -259,7 +264,7 @@ def recv(self, bufsize, flags=0):
259
264
if bufsize < 0 :
260
265
raise ValueError ("negative buffersize in recv" )
261
266
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 )
263
268
if n < 0 :
264
269
raise error ("recv: " )
265
270
buf = ffi .buffer (cbuf , n )
@@ -269,7 +274,8 @@ def recv_into(self, buf, nbytes=0, flags=0):
269
274
if nbytes == 0 :
270
275
nbytes = len (buf )
271
276
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 )
273
279
if n < 0 :
274
280
raise error ("recv: " )
275
281
return n
@@ -281,7 +287,8 @@ def recvfrom(self, bufsize, flags=0):
281
287
sockaddr = ffi .cast ("struct linux_sockaddr*" , addr )
282
288
cbuf = ffi .new ("char[]" , bufsize )
283
289
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 )
285
292
if n < 0 :
286
293
raise error ("recvfrom: " )
287
294
buf = ffi .buffer (cbuf , n )
@@ -298,7 +305,8 @@ def recvfrom_into(self, buf, nbytes=0, flags=0):
298
305
addr , addrlen_p = _gen_empty_sockaddr (AF_INET6 )
299
306
sockaddr = ffi .cast ("struct linux_sockaddr*" , addr )
300
307
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 )
302
310
if n < 0 :
303
311
raise error ("recvfrom: " )
304
312
address = _parse_sockaddr (sockaddr , addrlen_p )
@@ -319,8 +327,8 @@ def recvmsg(self, bufsize, ancbufsize=0, flags=0):
319
327
c_ancbuf = ffi .NULL
320
328
c_ancbuf_len = ffi .new ("int*" , ancbufsize )
321
329
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 )
324
332
if n < 0 :
325
333
raise error ("recvmsg:" )
326
334
address = _parse_sockaddr (sockaddr , addrlen_p )
@@ -331,7 +339,7 @@ def recvmsg(self, bufsize, ancbufsize=0, flags=0):
331
339
return bytes (buf ), ancdata , flags , address
332
340
333
341
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 )
335
343
if n < 0 :
336
344
raise error ("send: " )
337
345
return n
@@ -348,7 +356,8 @@ def sendto(self, data, *args):
348
356
(len (args ) + 1 ))
349
357
addr , addrlen = _gen_sockaddr (self .family , address )
350
358
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 )
352
361
if n < 0 :
353
362
raise error ("sendto: " )
354
363
return n
@@ -366,8 +375,8 @@ def sendmsg(self, buffers, ancdata=0, flags=0, address=None):
366
375
else :
367
376
addr , addrlen = _gen_sockaddr (self .family , address )
368
377
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 )
371
380
if res < 0 :
372
381
raise error ("sendmsg: " )
373
382
return res
0 commit comments