Blame SOURCES/db-5.3.28-condition-variable-ppc.patch

b1d0b3
diff -up db-5.3.28/src/dbinc_auto/int_def.in.pthreads_ppc db-5.3.28/src/dbinc_auto/int_def.in
b1d0b3
--- db-5.3.28/src/dbinc_auto/int_def.in.pthreads_ppc	2017-06-26 15:06:09.282020804 +0200
b1d0b3
+++ db-5.3.28/src/dbinc_auto/int_def.in	2017-06-26 15:06:22.238771039 +0200
b1d0b3
@@ -1572,6 +1572,7 @@
b1d0b3
 #define	__os_strerror __os_strerror@DB_VERSION_UNIQUE_NAME@
b1d0b3
 #define	__os_posix_err __os_posix_err@DB_VERSION_UNIQUE_NAME@
b1d0b3
 #define	__os_fileid __os_fileid@DB_VERSION_UNIQUE_NAME@
b1d0b3
+#define	__check_lock_fn __check_lock_fn@DB_VERSION_UNIQUE_NAME@
b1d0b3
 #define	__os_fdlock __os_fdlock@DB_VERSION_UNIQUE_NAME@
b1d0b3
 #define	__os_fsync __os_fsync@DB_VERSION_UNIQUE_NAME@
b1d0b3
 #define	__os_getenv __os_getenv@DB_VERSION_UNIQUE_NAME@
b1d0b3
diff -up db-5.3.28/src/dbinc_auto/os_ext.h.pthreads_ppc db-5.3.28/src/dbinc_auto/os_ext.h
b1d0b3
--- db-5.3.28/src/dbinc_auto/os_ext.h.pthreads_ppc	2017-06-26 15:05:23.792897700 +0200
b1d0b3
+++ db-5.3.28/src/dbinc_auto/os_ext.h	2017-06-26 15:06:22.172772311 +0200
b1d0b3
@@ -41,6 +41,7 @@ void __os_set_errno __P((int));
b1d0b3
 char *__os_strerror __P((int, char *, size_t));
b1d0b3
 int __os_posix_err __P((int));
b1d0b3
 int __os_fileid __P((ENV *, const char *, int, u_int8_t *));
b1d0b3
+int __check_lock_fn __P((char *, pid_t));
b1d0b3
 int __os_fdlock __P((ENV *, DB_FH *, off_t, db_lockmode_t, int));
b1d0b3
 int __os_fsync __P((ENV *, DB_FH *));
b1d0b3
 int __os_getenv __P((ENV *, const char *, char **, size_t));
b1d0b3
diff -up db-5.3.28/src/env/env_region.c.pthreads_ppc db-5.3.28/src/env/env_region.c
b1d0b3
--- db-5.3.28/src/env/env_region.c.pthreads_ppc	2017-06-26 15:04:40.805726365 +0200
b1d0b3
+++ db-5.3.28/src/env/env_region.c	2017-06-26 15:04:40.807726326 +0200
b1d0b3
@@ -305,14 +305,6 @@ user_map_functions:
b1d0b3
 		goto creation;
b1d0b3
 	}
b1d0b3
 
b1d0b3
-    /* We have an old environment but cannot rebuild it safely. */
b1d0b3
-    if (ret == DB_OLD_VERSION) {
b1d0b3
- 		__db_errx(env, DB_STR("1539",
b1d0b3
-		    "Build signature doesn't match environment"));
b1d0b3
-		ret = DB_VERSION_MISMATCH;
b1d0b3
-        goto err;
b1d0b3
-    }
b1d0b3
-
b1d0b3
 	if (renv->majver != DB_VERSION_MAJOR ||
b1d0b3
 	    renv->minver != DB_VERSION_MINOR) {
b1d0b3
 		/*
b1d0b3
@@ -337,6 +329,20 @@ user_map_functions:
b1d0b3
 		goto err;
b1d0b3
 	}
b1d0b3
 
b1d0b3
+    /*
b1d0b3
+     * We have an old environment but cannot rebuild it safely.
b1d0b3
+     * The environment might still be readable by the current process
b1d0b3
+     * (only the libpthread timestamp changed) if this process is the one
b1d0b3
+     * that is holding the lock on the region file as we can be sure
b1d0b3
+     * the environment did not get rebuilt under our feet.
b1d0b3
+     */
b1d0b3
+    if (ret == DB_OLD_VERSION && __check_lock_fn(env->lockfhp->name, getpid()) ) {
b1d0b3
+       __db_errx(env, DB_STR("1539",
b1d0b3
+           "Build signature doesn't match environment"));
b1d0b3
+       ret = DB_VERSION_MISMATCH;
b1d0b3
+        goto err;
b1d0b3
+    }
b1d0b3
+
b1d0b3
 	/*
b1d0b3
 	 * Check if the environment has had a catastrophic failure.
b1d0b3
 	 *
b1d0b3
diff -up db-5.3.28/src/os/os_flock.c.pthreads_ppc db-5.3.28/src/os/os_flock.c
b1d0b3
--- db-5.3.28/src/os/os_flock.c.pthreads_ppc	2017-06-26 15:04:40.806726346 +0200
b1d0b3
+++ db-5.3.28/src/os/os_flock.c	2017-06-26 15:04:40.807726326 +0200
b1d0b3
@@ -15,6 +15,70 @@ static int __os_filelocking_notsup __P((
b1d0b3
 #endif
b1d0b3
 
b1d0b3
 /*
b1d0b3
+ * __check_lock_fn --
b1d0b3
+ * Parse /proc/locks to see if the file described by 'fn' is locked.
b1d0b3
+ * Additionally (if 'pid' is not 0) check if the process holding
b1d0b3
+ * the lock has the same pid value as 'pid'.
b1d0b3
+ *
b1d0b3
+ * Returns 0 if a lock on fn is found, 1 if it is not found and -1 on error.
b1d0b3
+ * PUBLIC: int __check_lock_fn __P((char *, pid_t));
b1d0b3
+ */
b1d0b3
+
b1d0b3
+int __check_lock_fn(fn, pid)
b1d0b3
+    char *fn;
b1d0b3
+    pid_t pid;
b1d0b3
+{
b1d0b3
+    FILE* fp;
b1d0b3
+    char buffer[PATH_MAX];
b1d0b3
+    char *token;
b1d0b3
+    int i, inode;
b1d0b3
+    struct stat st;
b1d0b3
+    pid_t lpid = 0;
b1d0b3
+
b1d0b3
+    if (!fn)
b1d0b3
+       return -1;
b1d0b3
+
b1d0b3
+    fp = fopen("/proc/locks", "r");
b1d0b3
+    if (!fp)
b1d0b3
+        return -1;
b1d0b3
+
b1d0b3
+    /* Get the file's inode */
b1d0b3
+    if (stat(fn, &st)) {
b1d0b3
+        fclose(fp);
b1d0b3
+        return -1;
b1d0b3
+    }
b1d0b3
+
b1d0b3
+    while (fgets(buffer, sizeof(buffer), fp))
b1d0b3
+        for (token = strtok(buffer, " "), i = 0; token; token = strtok(NULL, " "), i++) {
b1d0b3
+            /* Do not parse any other fields */
b1d0b3
+            if (i > 5)
b1d0b3
+                break;
b1d0b3
+            /* Save the PID */
b1d0b3
+            if (i == 4)
b1d0b3
+                lpid = atoi(token);
b1d0b3
+            /* Check the inode */
b1d0b3
+            else if (i == 5) {
b1d0b3
+                inode = 0;
b1d0b3
+                sscanf(token, "%*02x:%*02x:%d", &inode;;
b1d0b3
+                /* Not the inode we are looking for */
b1d0b3
+                if (inode != st.st_ino)
b1d0b3
+                    continue;
b1d0b3
+                /*
b1d0b3
+                 * We have the correct file.
b1d0b3
+                 * We are either looking for a specific process or we do not care at all.
b1d0b3
+                 */
b1d0b3
+                if (!pid || lpid == pid) {
b1d0b3
+                    fclose(fp);
b1d0b3
+                    return 0;
b1d0b3
+                }
b1d0b3
+                /* Not the lock we are looking for */
b1d0b3
+            }
b1d0b3
+        }
b1d0b3
+    fclose(fp);
b1d0b3
+    return 1;
b1d0b3
+}
b1d0b3
+
b1d0b3
+/*
b1d0b3
  * __os_fdlock --
b1d0b3
  *	Acquire/release a lock on a byte in a file.
b1d0b3
  *