Browse Source

failtest: override getpid() as well.

TDB2 tracks locks using getpid(), and gets upset when we fork behind
its back.
Rusty Russell 15 years ago
parent
commit
371a31d946
3 changed files with 16 additions and 0 deletions
  1. 11 0
      ccan/failtest/failtest.c
  2. 4 0
      ccan/failtest/failtest_override.h
  3. 1 0
      ccan/failtest/failtest_proto.h

+ 11 - 0
ccan/failtest/failtest.c

@@ -58,6 +58,8 @@ static pid_t lock_owner;
 static struct lock_info *locks = NULL;
 static unsigned int lock_num = 0;
 
+static pid_t orig_pid;
+
 static const char info_to_arg[] = "mceoxprwf";
 
 /* Dummy call used for failtest_undo wrappers. */
@@ -1024,10 +1026,19 @@ int failtest_fcntl(int fd, const char *file, unsigned line, int cmd, ...)
 	return p->u.fcntl.ret;
 }
 
+pid_t failtest_getpid(const char *file, unsigned line)
+{
+	/* You must call failtest_init first! */
+	assert(orig_pid);
+	return orig_pid;
+}
+	
 void failtest_init(int argc, char *argv[])
 {
 	unsigned int i;
 
+	orig_pid = getpid();
+		
 	for (i = 1; i < argc; i++) {
 		if (!strncmp(argv[i], "--failpath=", strlen("--failpath="))) {
 			failpath = argv[i] + strlen("--failpath=");

+ 4 - 0
ccan/failtest/failtest_override.h

@@ -58,6 +58,10 @@
 #undef fcntl
 #define fcntl(fd, ...) failtest_fcntl((fd), __FILE__, __LINE__, __VA_ARGS__)
 
+/* Replacement of getpid (since failtest will fork). */
+#undef getpid
+#define getpid() failtest_getpid(__FILE__, __LINE__)
+
 #include <ccan/failtest/failtest_proto.h>
 
 #endif /* CCAN_FAILTEST_OVERRIDE_H */

+ 1 - 0
ccan/failtest/failtest_proto.h

@@ -22,4 +22,5 @@ ssize_t failtest_pwrite(int fd, const void *buf, size_t count, off_t offset,
 			const char *file, unsigned line);
 int failtest_close(int fd, const char *file, unsigned line);
 int failtest_fcntl(int fd, const char *file, unsigned line, int cmd, ...);
+pid_t failtest_getpid(const char *file, unsigned line);
 #endif /* CCAN_FAILTEST_PROTO_H */