\r
\r
class TimeoutError(Exception):\r
- pass\r
+ def __init__(self):\r
+ super(TimeoutError, self).__init__("Timer expired")\r
\r
\r
-def timeout(seconds=10, error_message=os.strerror(errno.ETIME)):\r
- def decorator(func):\r
- def _handle_timeout(signum, frame):\r
- raise TimeoutError(error_message)\r
+def timeout(func):\r
+ DEFAULT_TIMEOUT = 10\r
\r
- def wrapper(*args, **kwargs):\r
- if hasattr(args[0], '_timeout') is not None:\r
- seconds = args[0]._timeout\r
- signal.signal(signal.SIGALRM, _handle_timeout)\r
- signal.alarm(seconds)\r
- try:\r
- result = func(*args, **kwargs)\r
- finally:\r
- signal.alarm(0)\r
- return result\r
+ def _handle_timeout(signum, frame):\r
+ raise TimeoutError()\r
\r
- return wraps(func)(wrapper)\r
+ @wraps(func)\r
+ def wrapper(self):\r
+ signal.signal(signal.SIGALRM, _handle_timeout)\r
+ signal.alarm(getattr(self, '_timeout', DEFAULT_TIMEOUT))\r
+ try:\r
+ return func(self)\r
+ finally:\r
+ signal.alarm(0)\r
\r
- return decorator\r
+ return wrapper\r
\r
\r
def get_human_readable(size, precision=2):\r