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