diff options
author | Nathan Rossi <nathan@nathanrossi.com> | 2019-09-05 13:44:15 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2019-09-06 08:15:45 +0100 |
commit | 4364a26db198870b12749f04da2ed0f95a105ab0 (patch) | |
tree | 575887548845b50fce15dd837d1118a3c693f146 /scripts/lib | |
parent | ecfa7aaea3e1c227704583347555e0b68de63104 (diff) | |
download | poky-4364a26db198870b12749f04da2ed0f95a105ab0.tar.gz |
oe-selftest: Implement console 'keepalive' output
Similar to bitbake, implement a 'keepalive' output to the console to
ensure CI systems do not kill the process. The default timeout for
bitbake is 5000s.
(From OE-Core rev: 77939cca96fa5467c88eafa3ac0db2db4aef09d6)
Signed-off-by: Nathan Rossi <nathan@nathanrossi.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/lib')
-rw-r--r-- | scripts/lib/scriptutils.py | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/scripts/lib/scriptutils.py b/scripts/lib/scriptutils.py index e7e7021c24..c573dc7f67 100644 --- a/scripts/lib/scriptutils.py +++ b/scripts/lib/scriptutils.py | |||
@@ -16,12 +16,51 @@ import string | |||
16 | import subprocess | 16 | import subprocess |
17 | import sys | 17 | import sys |
18 | import tempfile | 18 | import tempfile |
19 | import threading | ||
19 | import importlib | 20 | import importlib |
20 | from importlib import machinery | 21 | from importlib import machinery |
21 | 22 | ||
22 | def logger_create(name, stream=None): | 23 | class KeepAliveStreamHandler(logging.StreamHandler): |
24 | def __init__(self, keepalive=True, **kwargs): | ||
25 | super().__init__(**kwargs) | ||
26 | if keepalive is True: | ||
27 | keepalive = 5000 # default timeout | ||
28 | self._timeout = threading.Condition() | ||
29 | self._stop = False | ||
30 | |||
31 | # background thread waits on condition, if the condition does not | ||
32 | # happen emit a keep alive message | ||
33 | def thread(): | ||
34 | while not self._stop: | ||
35 | with self._timeout: | ||
36 | if not self._timeout.wait(keepalive): | ||
37 | self.emit(logging.LogRecord("keepalive", logging.INFO, | ||
38 | None, None, "Keepalive message", None, None)) | ||
39 | |||
40 | self._thread = threading.Thread(target = thread, daemon = True) | ||
41 | self._thread.start() | ||
42 | |||
43 | def close(self): | ||
44 | # mark the thread to stop and notify it | ||
45 | self._stop = True | ||
46 | with self._timeout: | ||
47 | self._timeout.notify() | ||
48 | # wait for it to join | ||
49 | self._thread.join() | ||
50 | super().close() | ||
51 | |||
52 | def emit(self, record): | ||
53 | super().emit(record) | ||
54 | # trigger timer reset | ||
55 | with self._timeout: | ||
56 | self._timeout.notify() | ||
57 | |||
58 | def logger_create(name, stream=None, keepalive=None): | ||
23 | logger = logging.getLogger(name) | 59 | logger = logging.getLogger(name) |
24 | loggerhandler = logging.StreamHandler(stream=stream) | 60 | if keepalive is not None: |
61 | loggerhandler = KeepAliveStreamHandler(stream=stream, keepalive=keepalive) | ||
62 | else: | ||
63 | loggerhandler = logging.StreamHandler(stream=stream) | ||
25 | loggerhandler.setFormatter(logging.Formatter("%(levelname)s: %(message)s")) | 64 | loggerhandler.setFormatter(logging.Formatter("%(levelname)s: %(message)s")) |
26 | logger.addHandler(loggerhandler) | 65 | logger.addHandler(loggerhandler) |
27 | logger.setLevel(logging.INFO) | 66 | logger.setLevel(logging.INFO) |