diff options
author | Sage Weil <sage@inktank.com> | 2013-06-15 08:14:40 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-06-15 20:48:05 -0700 |
commit | 7e7ff7532d343c473178799e37f4b83cf29c4eee (patch) | |
tree | 891623e7f53a3a757034a8777ba1246b33412ed1 | |
parent | f25f212027294e5107fc9938e67d31879c171088 (diff) | |
download | ceph-7e7ff7532d343c473178799e37f4b83cf29c4eee.tar.gz |
common/Preforker: fix broken recursion on exit(3)
If we exit via preforker, call exit(3) and not recursively back into
Preforker::exit(r). Otherwise you get a hang with the child blocked
at:
Thread 1 (Thread 0x7fa08962e7c0 (LWP 5419)):
#0 0x000000309860e0cd in write () from /lib64/libpthread.so.0
#1 0x00000000005cc906 in Preforker::exit(int) ()
#2 0x00000000005c8dfb in main ()
and the parent at
#0 0x000000309860eba7 in waitpid () from /lib64/libpthread.so.0
#1 0x00000000005cc87a in Preforker::parent_wait() ()
#2 0x00000000005c75ae in main ()
Backport: cuttlefish
Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r-- | src/common/Preforker.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/common/Preforker.h b/src/common/Preforker.h index 20e8b00be15..2c1d4fd6795 100644 --- a/src/common/Preforker.h +++ b/src/common/Preforker.h @@ -79,13 +79,13 @@ public: int signal_exit(int r) { if (forked) { // tell parent - (void)::write(fd[1], &r, sizeof(r)); + (void)safe_write(fd[1], &r, sizeof(r)); } return r; } void exit(int r) { signal_exit(r); - exit(r); + ::exit(r); } void daemonize() { |