From: drh Date: Wed, 5 May 2010 18:20:07 +0000 (+0000) Subject: Simplifications to the SHM locking implementation in os_unix.c. X-Git-Tag: version-3.7.2~429 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4bc79def36fa01a0b3bd0913a92f34cda317bb94;p=thirdparty%2Fsqlite.git Simplifications to the SHM locking implementation in os_unix.c. FossilOrigin-Name: 9de05bfb09e29bafdf5782263330fe8eefcfaba3 --- diff --git a/manifest b/manifest index 138bc72434..95c5b4fbc0 100644 --- 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----- diff --git a/manifest.uuid b/manifest.uuid index 8fcf35e948..654a9b76db 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7bd44794c482beee16c684712545275e2bf63dfa \ No newline at end of file +9de05bfb09e29bafdf5782263330fe8eefcfaba3 \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index b9e093b59a..daca1c365f 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -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; }