aboutsummaryrefslogtreecommitdiff
path: root/src/utils
diff options
context:
space:
mode:
authorGravatar jesopo2019-08-30 17:17:03 +0100
committerGravatar jesopo2019-08-30 17:17:03 +0100
commite97e3c8f309c9e3260ceedbf961f80be8f8333ed (patch)
treeb1761571d3a0e92afa3315724d3b07eb21a780bb /src/utils
parentAdd IntRangeSetting, reorder OptionsSetting arg order (diff)
signature
add utils.deadline(func, seconds) to put hard limits on code exec time
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/__init__.py16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/utils/__init__.py b/src/utils/__init__.py
index 2202a3de..35ac23e5 100644
--- a/src/utils/__init__.py
+++ b/src/utils/__init__.py
@@ -1,4 +1,4 @@
-import datetime, decimal, enum, io, ipaddress, re, threading, typing
+import datetime, decimal, enum, io, ipaddress, re, signal, threading, typing
from src.utils import cli, consts, irc, http, parse, security
class Direction(enum.Enum):
@@ -342,3 +342,17 @@ class OptionsSetting(Setting):
options = self._get_options()
options_str = ["'%s'" % option for option in options]
return "Options: %s" % ", ".join(options_str)
+
+class DeadlineExceededException(Exception):
+ pass
+def _raise_deadline():
+ raise DeadlineExceededException()
+
+def deadline(f: typing.Callable[[], typing.Any], seconds: int=10) -> typing.Any:
+ signal.signal(signal.SIGALRM, lambda _1, _2: _raise_deadline())
+ signal.alarm(seconds)
+
+ try:
+ return f()
+ finally:
+ signal.signal(signal.SIGALRM, signal.SIG_IGN)