]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Simplifications to the SHM locking implementation in os_unix.c.
authordrh <drh@noemail.net>
Wed, 5 May 2010 18:20:07 +0000 (18:20 +0000)
committerdrh <drh@noemail.net>
Wed, 5 May 2010 18:20:07 +0000 (18:20 +0000)
FossilOrigin-Name: 9de05bfb09e29bafdf5782263330fe8eefcfaba3

manifest
manifest.uuid
src/os_unix.c

index 138bc72434e214595031a994b9f2f1d772d3423b..95c5b4fbc01e7d68605f340966d0c04250e70375 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,8 +1,8 @@
 -----BEGIN PGP SIGNED MESSAGE-----
 Hash: SHA1
 
-C Prohibit\sbackup\sif\sthe\sdestination\sis\susing\sWAL\sand\shas\sa\sdifferent\spage\nsize\sfrom\sthe\ssource.
-D 2010-05-05T16:23:27
+C Simplifications\sto\sthe\sSHM\slocking\simplementation\sin\sos_unix.c.
+D 2010-05-05T18:20:07
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in d83a0ffef3dcbfb08b410a6c6dd6c009ec9167fb
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -153,7 +153,7 @@ F src/os.c aec6922553585a25d5655666defc125a7e217674
 F src/os.h b389844e5469a2918e8a45fe6ae52b4c28dfb2b2
 F src/os_common.h 0d6ee583b6ee3185eb9d951f890c6dd03021a08d
 F src/os_os2.c 8ad77a418630d7dee91d1bb04f79c2096301d3a0
-F src/os_unix.c 7ab8d2fe59954dca619af3e1bbd4789f5032fece
+F src/os_unix.c 623a195fbcdb7b92cf275acf3ced2388459519a4
 F src/os_win.c a8fc01d8483be472e495793c01064fd87e56a5c1
 F src/pager.c 224df6ad5f8c1fed238570092199db1e57233779
 F src/pager.h 934b598583a9d936bb13c37d62a2fe68ac48781c
@@ -812,14 +812,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P 2ac5d96c8e5831b392d83c86491d9ed8bc9c8db7
-R 82b3438b071d9502db3bdd3a22e84c0d
+P 7bd44794c482beee16c684712545275e2bf63dfa
+R a2161c22aa5f81f0774fe4cb87094f8c
 U drh
-Z de906577ce23bb1b1b5ca675861faf36
+Z add6d6f68ea7db2fc288d70b0b6b408e
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.6 (GNU/Linux)
 
-iD8DBQFL4ZuCoxKgR168RlERAuZbAJ4ikNBaO50mnTJ8j201rDXr+9WYqgCfU42A
-ws1gQpPQnYG7m2yeQMuRCxw=
-=XKt5
+iD8DBQFL4bbaoxKgR168RlERAn7mAJ46ccfjrHQ4zLP/jnvmuIjIcwQqEgCfQBpL
++aPZctVfU7OgkP5kSXlpTgM=
+=jtYE
 -----END PGP SIGNATURE-----
index 8fcf35e948f16cc2ce9cd7f9a2103814c2c3ed7a..654a9b76dbc88d2712f0d643de017d8b3092b206 100644 (file)
@@ -1 +1 @@
-7bd44794c482beee16c684712545275e2bf63dfa
\ No newline at end of file
+9de05bfb09e29bafdf5782263330fe8eefcfaba3
\ No newline at end of file
index b9e093b59ac583d4c587f20ce1e2725c3b93a268..daca1c365f15cde3116ea12890375503f433855d 100644 (file)
@@ -4648,7 +4648,6 @@ struct unixShm {
   unixShmFile *pFile;        /* The underlying unixShmFile object */
   unixShm *pNext;            /* Next unixShm with the same unixShmFile */
   u8 lockState;              /* Current lock state */
-  u8 readLock;               /* Which of the two read-lock states to use */
   u8 hasMutex;               /* True if holding the unixShmFile mutex */
   u8 hasMutexBuf;            /* True if holding pFile->mutexBuf */
   u8 sharedMask;             /* Mask of shared locks held */
@@ -4667,8 +4666,7 @@ struct unixShm {
 ** Constants used for locking
 */
 #define UNIX_SHM_BASE      32        /* Byte offset of the first lock byte */
-#define UNIX_SHM_MUTEX     0x01      /* Mask for MUTEX lock */
-#define UNIX_SHM_DMS       0x04      /* Mask for Dead-Man-Switch lock */
+#define UNIX_SHM_DMS       0x01      /* Mask for Dead-Man-Switch lock */
 #define UNIX_SHM_A         0x10      /* Mask for region locks... */
 #define UNIX_SHM_B         0x20
 #define UNIX_SHM_C         0x40
@@ -4695,13 +4693,12 @@ static const char *unixShmLockString(u8 mask){
   iBuf += 8;
   if( iBuf>=sizeof(zBuf) ) iBuf = 0;
 
-  z[0] = (mask & UNIX_SHM_MUTEX) ? 'M' : '.';
-  z[1] = (mask & UNIX_SHM_DMS)   ? 'S' : '.';
-  z[2] = (mask & UNIX_SHM_A)     ? 'A' : '.';
-  z[3] = (mask & UNIX_SHM_B)     ? 'B' : '.';
-  z[4] = (mask & UNIX_SHM_C)     ? 'C' : '.';
-  z[5] = (mask & UNIX_SHM_D)     ? 'D' : '.';
-  z[6] = 0;
+  z[0] = (mask & UNIX_SHM_DMS)   ? 'S' : '.';
+  z[1] = (mask & UNIX_SHM_A)     ? 'A' : '.';
+  z[2] = (mask & UNIX_SHM_B)     ? 'B' : '.';
+  z[3] = (mask & UNIX_SHM_C)     ? 'C' : '.';
+  z[4] = (mask & UNIX_SHM_D)     ? 'D' : '.';
+  z[5] = 0;
   return z;
 }
 #endif /* SQLITE_DEBUG */
@@ -4712,7 +4709,7 @@ static const char *unixShmLockString(u8 mask){
 ** lockMask might contain multiple bits but all bits are guaranteed
 ** to be contiguous.
 **
-** Locks block if the UNIX_SHM_MUTEX bit is set and are non-blocking
+** Locks block if the mask is exactly UNIX_SHM_C and are non-blocking
 ** otherwise.
 */
 static int unixShmSystemLock(
@@ -4733,7 +4730,7 @@ static int unixShmSystemLock(
   memset(&f, 0, sizeof(f));
   f.l_type = lockType;
   f.l_whence = SEEK_SET;
-  if( (lockMask & UNIX_SHM_MUTEX)!=0 && lockType!=F_UNLCK ){
+  if( lockMask==UNIX_SHM_C && lockType!=F_UNLCK ){
     lockOp = F_SETLKW;
     OSTRACE(("SHM-LOCK requesting blocking lock\n"));
   }else{
@@ -5029,10 +5026,6 @@ static int unixShmOpen(
     /* Check to see if another process is holding the dead-man switch.
     ** If not, truncate the file to zero length. 
     */
-    if( unixShmSystemLock(pFile, F_WRLCK, UNIX_SHM_MUTEX) ){
-      rc = SQLITE_IOERR_LOCK;
-      goto shm_open_err;
-    }
     if( unixShmSystemLock(pFile, F_WRLCK, UNIX_SHM_DMS)==SQLITE_OK ){
       if( ftruncate(pFile->h, 0) ){
         rc = SQLITE_IOERR;
@@ -5041,7 +5034,6 @@ static int unixShmOpen(
     if( rc==SQLITE_OK ){
       rc = unixShmSystemLock(pFile, F_RDLCK, UNIX_SHM_DMS);
     }
-    unixShmSystemLock(pFile, F_UNLCK, UNIX_SHM_MUTEX);
     if( rc ) goto shm_open_err;
   }
 
@@ -5321,21 +5313,21 @@ static int unixShmLock(
           if( rc==SQLITE_BUSY ){
             rc = unixShmSharedLock(pFile, p, UNIX_SHM_D);
             if( rc==SQLITE_OK ){
-              p->lockState = p->readLock = SQLITE_SHM_READ_FULL;
+              p->lockState = SQLITE_SHM_READ_FULL;
             }
           }else{
             unixShmUnlock(pFile, p, UNIX_SHM_B);
-            p->lockState = p->readLock = SQLITE_SHM_READ;
+            p->lockState = SQLITE_SHM_READ;
           }
         }
       }else if( p->lockState==SQLITE_SHM_WRITE ){
         rc = unixShmSharedLock(pFile, p, UNIX_SHM_A);
         unixShmUnlock(pFile, p, UNIX_SHM_C|UNIX_SHM_D);
-        p->lockState = p->readLock = SQLITE_SHM_READ;
+        p->lockState = SQLITE_SHM_READ;
       }else{
         assert( p->lockState==SQLITE_SHM_RECOVER );
-        unixShmUnlock(pFile, p, UNIX_SHM_MUTEX);
-        p->lockState = p->readLock;
+        unixShmUnlock(pFile, p, UNIX_SHM_C);
+        p->lockState = SQLITE_SHM_READ;
         rc = SQLITE_OK;
       }
       break;
@@ -5354,7 +5346,7 @@ static int unixShmLock(
            || p->lockState==SQLITE_SHM_PENDING
            || p->lockState==SQLITE_SHM_RECOVER );
       if( p->lockState==SQLITE_SHM_RECOVER ){
-        unixShmUnlock(pFile, p, UNIX_SHM_MUTEX);
+        unixShmUnlock(pFile, p, UNIX_SHM_C);
         p->lockState = SQLITE_SHM_CHECKPOINT;
         rc = SQLITE_OK;
       }
@@ -5378,7 +5370,7 @@ static int unixShmLock(
            || p->lockState==SQLITE_SHM_READ_FULL
            || p->lockState==SQLITE_SHM_CHECKPOINT );
       assert( sqlite3_mutex_held(pFile->mutexBuf) );
-      rc = unixShmExclusiveLock(pFile, p, UNIX_SHM_MUTEX);
+      rc = unixShmExclusiveLock(pFile, p, UNIX_SHM_C);
       if( rc==SQLITE_OK ){
         p->lockState = SQLITE_SHM_RECOVER;
       }