summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-06-15 08:14:40 -0700
committerSage Weil <sage@inktank.com>2013-06-15 20:48:24 -0700
commit08304a7c46da7517319b7db0b64d1c4f54771472 (patch)
treeb6dfd11f3cf432901857f4313c2fce33e7f349d6
parentf202d332dc86844caa9076c7866cc009d87f76b6 (diff)
downloadceph-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.h4
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() {