diff options
| author | 2019-08-30 17:17:03 +0100 | |
|---|---|---|
| committer | 2019-08-30 17:17:03 +0100 | |
| commit | e97e3c8f309c9e3260ceedbf961f80be8f8333ed (patch) | |
| tree | b1761571d3a0e92afa3315724d3b07eb21a780bb /src/utils/__init__.py | |
| parent | Add 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/__init__.py')
| -rw-r--r-- | src/utils/__init__.py | 16 |
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) |
