- fix dead lock from upstream
authorArkadiusz Miśkiewicz <arekm@maven.pl>
Tue, 20 May 2008 06:59:39 +0000 (06:59 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    patch.4.6.21.1 -> 1.1

patch.4.6.21.1 [new file with mode: 0644]

diff --git a/patch.4.6.21.1 b/patch.4.6.21.1
new file mode 100644 (file)
index 0000000..7fd182f
--- /dev/null
@@ -0,0 +1,90 @@
+*** dbinc/mp.h 2007-09-28 01:28:25.000000000 +1000
+--- dbinc/mp.h 2008-02-14 01:22:09.000000000 +1100
+***************
+*** 639,644 ****
+--- 639,647 ----
+   */
+  #define      MP_TRUNC_RECOVER        0x01
+  
++ /* Private flags to DB_MPOOLFILE->close. */
++ #define      DB_MPOOL_NOLOCK         0x002   /* Already have mpf locked. */
++ 
+  #if defined(__cplusplus)
+  }
+  #endif
+*** mp/mp_fopen.c      2007-05-18 03:18:01.000000000 +1000
+--- mp/mp_fopen.c      2008-02-12 16:09:42.000000000 +1100
+***************
+*** 888,894 ****
+        * when we try to flush them.
+        */
+       deleted = 0;
+!      MUTEX_LOCK(dbenv, mfp->mutex);
+       if (F_ISSET(dbmfp, MP_MULTIVERSION))
+               --mfp->multiversion;
+       if (--mfp->mpf_cnt == 0 || LF_ISSET(DB_MPOOL_DISCARD)) {
+--- 888,895 ----
+        * when we try to flush them.
+        */
+       deleted = 0;
+!      if (!LF_ISSET(DB_MPOOL_NOLOCK))
+!              MUTEX_LOCK(dbenv, mfp->mutex);
+       if (F_ISSET(dbmfp, MP_MULTIVERSION))
+               --mfp->multiversion;
+       if (--mfp->mpf_cnt == 0 || LF_ISSET(DB_MPOOL_DISCARD)) {
+***************
+*** 909,921 ****
+                       }
+               }
+               if (mfp->block_cnt == 0) {
+                       if ((t_ret =
+                           __memp_mf_discard(dbmp, mfp)) != 0 && ret == 0)
+                               ret = t_ret;
+                       deleted = 1;
+               }
+       }
+!      if (!deleted)
+               MUTEX_UNLOCK(dbenv, mfp->mutex);
+  
+  done:        /* Discard the DB_MPOOLFILE structure. */
+--- 910,928 ----
+                       }
+               }
+               if (mfp->block_cnt == 0) {
++                      /*
++                       * We should never discard this mp file if our caller
++                       * is holding the lock on it.  See comment in
++                       * __memp_sync_file.
++                       */
++                      DB_ASSERT(dbenv, !LF_ISSET(DB_MPOOL_NOLOCK));
+                       if ((t_ret =
+                           __memp_mf_discard(dbmp, mfp)) != 0 && ret == 0)
+                               ret = t_ret;
+                       deleted = 1;
+               }
+       }
+!      if (!deleted && !LF_ISSET(DB_MPOOL_NOLOCK))
+               MUTEX_UNLOCK(dbenv, mfp->mutex);
+  
+  done:        /* Discard the DB_MPOOLFILE structure. */
+*** mp/mp_sync.c       2007-06-02 04:32:44.000000000 +1000
+--- mp/mp_sync.c       2008-02-12 16:09:42.000000000 +1100
+***************
+*** 755,761 ****
+        * This is important since we are called with the hash bucket
+        * locked.  The mfp will get freed via the cleanup pass.
+        */
+!      if (dbmfp != NULL && (t_ret = __memp_fclose(dbmfp, 0)) != 0 && ret == 0)
+               ret = t_ret;
+  
+       --mfp->mpf_cnt;
+--- 755,762 ----
+        * This is important since we are called with the hash bucket
+        * locked.  The mfp will get freed via the cleanup pass.
+        */
+!      if (dbmfp != NULL &&
+!          (t_ret = __memp_fclose(dbmfp, DB_MPOOL_NOLOCK)) != 0 && ret == 0)
+               ret = t_ret;
+  
+       --mfp->mpf_cnt;
+
This page took 0.122072 seconds and 4 git commands to generate.