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:05 -0700
commit7e7ff7532d343c473178799e37f4b83cf29c4eee (patch)
tree891623e7f53a3a757034a8777ba1246b33412ed1
parentf25f212027294e5107fc9938e67d31879c171088 (diff)
downloadceph-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.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() {