From: antirez <antirez@gmail.com>
Date: Sat, 7 Apr 2012 10:11:23 +0000 (+0200)
Subject: For coverage testing use exit() instead of _exit() when termiating saving children.
X-Git-Url: https://git.saurik.com/redis.git/commitdiff_plain/55951f900590cc637c67cc820400fd94e8e5bf7f

For coverage testing use exit() instead of _exit() when termiating saving children.
---

diff --git a/src/Makefile b/src/Makefile
index 11f270b9..8116ee2b 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -263,7 +263,7 @@ gprof:
 	$(MAKE) PROF="-pg"
 
 gcov:
-	$(MAKE) PROF="-fprofile-arcs -ftest-coverage"
+	$(MAKE) PROF="-fprofile-arcs -ftest-coverage -DCOVERAGE_TEST"
 
 noopt:
 	$(MAKE) OPTIMIZATION=""
diff --git a/src/aof.c b/src/aof.c
index 3f7cd10f..115da29b 100644
--- a/src/aof.c
+++ b/src/aof.c
@@ -803,9 +803,9 @@ int rewriteAppendOnlyFileBackground(void) {
         if (server.sofd > 0) close(server.sofd);
         snprintf(tmpfile,256,"temp-rewriteaof-bg-%d.aof", (int) getpid());
         if (rewriteAppendOnlyFile(tmpfile) == REDIS_OK) {
-            _exit(0);
+            exitFromChild(0);
         } else {
-            _exit(1);
+            exitFromChild(1);
         }
     } else {
         /* Parent */
diff --git a/src/rdb.c b/src/rdb.c
index 6736d8fc..abb966e0 100644
--- a/src/rdb.c
+++ b/src/rdb.c
@@ -686,7 +686,7 @@ int rdbSaveBackground(char *filename) {
         if (server.ipfd > 0) close(server.ipfd);
         if (server.sofd > 0) close(server.sofd);
         retval = rdbSave(filename);
-        _exit((retval == REDIS_OK) ? 0 : 1);
+        exitFromChild((retval == REDIS_OK) ? 0 : 1);
     } else {
         /* Parent */
         server.stat_fork_time = ustime()-start;
diff --git a/src/redis.c b/src/redis.c
index 14812cf0..c79f49d4 100644
--- a/src/redis.c
+++ b/src/redis.c
@@ -354,6 +354,18 @@ long long mstime(void) {
     return ustime()/1000;
 }
 
+/* After an RDB dump or AOF rewrite we exit from children using _exit() instead of
+ * exit(), because the latter may interact with the same file objects used by
+ * the parent process. However if we are testing the coverage normal exit() is
+ * used in order to obtain the right coverage information. */
+void exitFromChild(int retcode) {
+#ifdef COVERAGE_TEST
+    exit(retcode);
+#else
+    _exit(retcode);
+#endif
+}
+
 /*====================== Hash table type implementation  ==================== */
 
 /* This is an hash table type that uses the SDS dynamic strings libary as
diff --git a/src/redis.h b/src/redis.h
index 9d0e19ff..e86823db 100644
--- a/src/redis.h
+++ b/src/redis.h
@@ -694,6 +694,7 @@ long long ustime(void);
 long long mstime(void);
 void getRandomHexChars(char *p, unsigned int len);
 uint64_t crc64(const unsigned char *s, uint64_t l);
+void exitFromChild(int retcode);
 
 /* networking.c -- Networking and Client related operations */
 redisClient *createClient(int fd);