Skip to content

Commit 27319dd

Browse files
committed
retry when interrupt by signal
1 parent 5645edb commit 27319dd

File tree

1 file changed

+25
-16
lines changed

1 file changed

+25
-16
lines changed

pyfstack/socket.py

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
4453
class 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

Comments
 (0)