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:24 -0700 |
commit | 08304a7c46da7517319b7db0b64d1c4f54771472 (patch) | |
tree | b6dfd11f3cf432901857f4313c2fce33e7f349d6 | |
parent | f202d332dc86844caa9076c7866cc009d87f76b6 (diff) | |
download | ceph-08304a7c46da7517319b7db0b64d1c4f54771472.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>
(cherry picked from commit 7e7ff7532d343c473178799e37f4b83cf29c4eee)
-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() { |