=== modified file 'Koo/Rpc/tiny_socket.py' --- Koo/Rpc/tiny_socket.py 2009-02-05 00:15:11 +0000 +++ Koo/Rpc/tiny_socket.py 2009-12-29 17:02:40 +0000 @@ -28,6 +28,7 @@ import socket import cPickle import sys +import errno DNS_CACHE = {} @@ -59,33 +60,67 @@ if sys.platform != 'darwin': self.sock.shutdown(socket.SHUT_RDWR) self.sock.close() + def _safe_send(self, data): + """ + Sends data over the socket safely, handling any signal interruption + (EINTR) that may happen on the send call (it will retry the call). + """ + res = None + retry = True + while retry: + retry = False + try: + res = self.sock.send(data) + except socket.error, err: + if err.errno != errno.EINTR: + raise err + else: + retry = True + return res + def _safe_recv(self, size): + """ + Receives data from the socket safely, handling any signal interruption + (EINTR) that may happen on the send call (it will retry the call). + """ + res = None + retry = True + while retry: + retry = False + try: + res = self.sock.recv(size) + except socket.error, err: + if err.errno != errno.EINTR: + raise err + else: + retry = True + return res def mysend(self, msg, exception=False, traceback=None): msg = cPickle.dumps([msg,traceback]) size = len(msg) - self.sock.send('%8d' % size) - self.sock.send(exception and "1" or "0") + self._safe_send('%8d' % size) + self._safe_send(exception and "1" or "0") totalsent = 0 while totalsent < size: - sent = self.sock.send(msg[totalsent:]) + sent = self._safe_send(msg[totalsent:]) if sent == 0: raise RuntimeError, "socket connection broken" totalsent = totalsent + sent def myreceive(self): buf='' while len(buf) < 8: - chunk = self.sock.recv(8 - len(buf)) + chunk = self._safe_recv(8 - len(buf)) if chunk == '': raise RuntimeError, "socket connection broken" buf += chunk size = int(buf) - buf = self.sock.recv(1) + buf = self._safe_recv(1) if buf != "0": exception = buf else: exception = False msg = '' while len(msg) < size: - chunk = self.sock.recv(size-len(msg)) + chunk = self._safe_recv(size-len(msg)) if chunk == '': raise RuntimeError, "socket connection broken" msg = msg + chunk