Index: MythTV/MythBase.py =================================================================== --- MythTV/MythBase.py (revision 24421) +++ MythTV/MythBase.py (working copy) @@ -14,6 +14,7 @@ import sys import locale import weakref +import signal import xml.etree.cElementTree as etree from datetime import datetime from time import sleep, time, mktime @@ -1414,8 +1415,7 @@ # loop until necessary data has been received while size - len(data) > 0: # wait for data on the socket - while len(select([self.socket],[],[], 0.001)[0]) == 0: - pass + select([self.socket],[],[]) # append response to buffer data += self.socket.recv(size-len(data)) return data @@ -1438,13 +1438,19 @@ created. If 'data' is None, the method will return any events in the receive buffer. """ + + def alrm(): + raise MythBEError('Socket Timeout Reached') + # return if not connected if not self.connected: return u'' # pull default timeout if timeout is None: - timeout = self.timeout + timerem = self.timeout + else: + timerem = timeout # send command string if data is not None: @@ -1452,19 +1458,28 @@ # lock socket access with self._socklock: + signal.signal(signal.SIGALRM, alrm) # loop waiting for proper response - while True: + while timerem >= 0: # wait timeout for data to be received on the socket + tic = time() if len(select([self.socket],[],[], timeout)[0]) == 0: # no data, return return u'' + timerem -= time()-tic try: # pull available socket data + signal.alarm(int(timerem)+1) event = self._recv() + signal.alarm(0) except ValueError: - # header read failed + # header read failed, terminate alarm + signal.alarm(0) return u'' + except MythBEError: + # timeout reached, alarm triggered + return u'' # convert to unicode try: