summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/daemonize.py
diff options
context:
space:
mode:
authorJoshua Watt <jpewhacker@gmail.com>2018-08-21 09:04:16 -0500
committerRichard Purdie <richard.purdie@linuxfoundation.org>2018-08-23 08:50:23 +0100
commitcbe2d3cb0af6c7a5cd368e7dc489960a13648bd0 (patch)
treea55e94c273a10f94366511abcedb3277d597b6a9 /bitbake/lib/bb/daemonize.py
parentb6bc5f068a08f35e1408d863d0d1f30a4b431b48 (diff)
downloadpoky-cbe2d3cb0af6c7a5cd368e7dc489960a13648bd0.tar.gz
bitbake: daemonize: Flush stdio on exit
In spite of a comment suggesting otherwise, os._exit() does not flush buffered output from file descriptors before exiting the process like os.exit() does. This means that any un-flushed output is lost in the daemon process, in particular the traceback from any thrown exceptions, making debugging exceptions in the daemon quite difficult. The solution is to flush stdout and stderr before exiting. (Bitbake rev: fcc8e1ff53696f78dd64b4ee32f3c433b7a47df0) Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/daemonize.py')
-rw-r--r--bitbake/lib/bb/daemonize.py9
1 files changed, 7 insertions, 2 deletions
diff --git a/bitbake/lib/bb/daemonize.py b/bitbake/lib/bb/daemonize.py
index 8300d1d0f0..bf16793468 100644
--- a/bitbake/lib/bb/daemonize.py
+++ b/bitbake/lib/bb/daemonize.py
@@ -49,8 +49,8 @@ def createDaemon(function, logfile):
49 # exit() or _exit()? 49 # exit() or _exit()?
50 # _exit is like exit(), but it doesn't call any functions registered 50 # _exit is like exit(), but it doesn't call any functions registered
51 # with atexit (and on_exit) or any registered signal handlers. It also 51 # with atexit (and on_exit) or any registered signal handlers. It also
52 # closes any open file descriptors. Using exit() may cause all stdio 52 # closes any open file descriptors, but doesn't flush any buffered output.
53 # streams to be flushed twice and any temporary files may be unexpectedly 53 # Using exit() may cause all any temporary files to be unexpectedly
54 # removed. It's therefore recommended that child branches of a fork() 54 # removed. It's therefore recommended that child branches of a fork()
55 # and the parent branch(es) of a daemon use _exit(). 55 # and the parent branch(es) of a daemon use _exit().
56 os._exit(0) 56 os._exit(0)
@@ -79,4 +79,9 @@ def createDaemon(function, logfile):
79 traceback.print_exc() 79 traceback.print_exc()
80 finally: 80 finally:
81 bb.event.print_ui_queue() 81 bb.event.print_ui_queue()
82 # os._exit() doesn't flush open files like os.exit() does. Manually flush
83 # stdout and stderr so that any logging output will be seen, particularly
84 # exception tracebacks.
85 sys.stdout.flush()
86 sys.stderr.flush()
82 os._exit(0) 87 os._exit(0)