1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-12 13:01:09 +03:00

Make sure the queueMutex is held prior to writing the pQueueLast field

of the write queue in the async demonstration code.  Ticket #3405. (CVS 5744)

FossilOrigin-Name: 5622a1e285fc4d5720f7180a0eb551952f2df331
This commit is contained in:
drh
2008-09-26 20:02:50 +00:00
parent d326064e0d
commit 9e2d64b8d3
3 changed files with 34 additions and 9 deletions

View File

@@ -1,5 +1,5 @@
C Performance\senhancement:\savoid\scalling\sreparentChildPages()\sfrom\sbalance_nonroot().\s(CVS\s5743) C Make\ssure\sthe\squeueMutex\sis\sheld\sprior\sto\swriting\sthe\spQueueLast\sfield\nof\sthe\swrite\squeue\sin\sthe\sasync\sdemonstration\scode.\s\sTicket\s#3405.\s(CVS\s5744)
D 2008-09-26T17:31:55 D 2008-09-26T20:02:50
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in e4ab842f9a64ef61d57093539a8aab76b12810db F Makefile.in e4ab842f9a64ef61d57093539a8aab76b12810db
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -165,7 +165,7 @@ F src/test6.c 0a0304a69cfa4962a429d084c6d451ff9e4fb572
F src/test7.c 475b1fa7e3275408b40a3cbdc9508cbdc41ffa02 F src/test7.c 475b1fa7e3275408b40a3cbdc9508cbdc41ffa02
F src/test8.c 3637439424d0d21ff2dcf9b015c30fcc1e7bcb24 F src/test8.c 3637439424d0d21ff2dcf9b015c30fcc1e7bcb24
F src/test9.c 904ebe0ed1472d6bad17a81e2ecbfc20017dc237 F src/test9.c 904ebe0ed1472d6bad17a81e2ecbfc20017dc237
F src/test_async.c de6661370d96f660e0f0d604582c193c6144b19c F src/test_async.c 45024094ed7cf780c5d5dccda645145f95cf78ef
F src/test_autoext.c f53b0cdf7bf5f08100009572a5d65cdb540bd0ad F src/test_autoext.c f53b0cdf7bf5f08100009572a5d65cdb540bd0ad
F src/test_btree.c 8d5b835054f1dd15992e09864a8bc04386bab701 F src/test_btree.c 8d5b835054f1dd15992e09864a8bc04386bab701
F src/test_config.c db72e95bafdd53c05ceb8735f833cc5dc1f48782 F src/test_config.c db72e95bafdd53c05ceb8735f833cc5dc1f48782
@@ -637,7 +637,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1 F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
P 5debf12fa46520946ac5da44c03448fffbc9940c P 28fd0a50ca8529892f5b1ababd38d494889eed6d
R ad8baa95733fbb9a312a15654e608ce1 R 42f79e8d6bad8dc05f28b70884a1cf00
U danielk1977 U drh
Z 410e2e4a76b6dc0451fd1f6a24aebc75 Z c1f39a8806852672a67f740f0e33cd9d

View File

@@ -1 +1 @@
28fd0a50ca8529892f5b1ababd38d494889eed6d 5622a1e285fc4d5720f7180a0eb551952f2df331

View File

@@ -10,7 +10,7 @@
** **
************************************************************************* *************************************************************************
** **
** $Id: test_async.c,v 1.47 2008/09/15 15:49:34 danielk1977 Exp $ ** $Id: test_async.c,v 1.48 2008/09/26 20:02:50 drh Exp $
** **
** This file contains an example implementation of an asynchronous IO ** This file contains an example implementation of an asynchronous IO
** backend for SQLite. ** backend for SQLite.
@@ -571,12 +571,31 @@ static int async_cond_wait(pthread_cond_t *pCond, pthread_mutex_t *pMutex){
return rc; return rc;
} }
/*
** Assert that the mutex is held by the current thread.
*/
static void assert_mutex_is_held(pthread_mutex_t *pMutex){
int iIdx;
pthread_mutex_t *aMutex = (pthread_mutex_t *)(&async);
pthread_t *aHolder = (pthread_t *)(&asyncdebug);
for(iIdx=0; iIdx<3; iIdx++){
if( pMutex==&aMutex[iIdx] ) break;
}
assert(iIdx<3);
assert( aHolder[iIdx]==pthread_self() );
}
/* Call our async_XX wrappers instead of selected pthread_XX functions */ /* Call our async_XX wrappers instead of selected pthread_XX functions */
#define pthread_mutex_lock async_mutex_lock #define pthread_mutex_lock async_mutex_lock
#define pthread_mutex_unlock async_mutex_unlock #define pthread_mutex_unlock async_mutex_unlock
#define pthread_mutex_trylock async_mutex_trylock #define pthread_mutex_trylock async_mutex_trylock
#define pthread_cond_wait async_cond_wait #define pthread_cond_wait async_cond_wait
#else /* if defined(NDEBUG) */
#define assert_mutex_is_held(X) /* A no-op when not debugging */
#endif /* !defined(NDEBUG) */ #endif /* !defined(NDEBUG) */
/* /*
@@ -1482,6 +1501,11 @@ static void *asyncWriterThread(void *pIsStarted){
rc = unlinkAsyncFile(pData); rc = unlinkAsyncFile(pData);
pthread_mutex_unlock(&async.lockMutex); pthread_mutex_unlock(&async.lockMutex);
if( !holdingMutex ){
pthread_mutex_lock(&async.queueMutex);
holdingMutex = 1;
}
assert_mutex_is_held(&async.queueMutex);
async.pQueueFirst = p->pNext; async.pQueueFirst = p->pNext;
sqlite3_free(pData); sqlite3_free(pData);
doNotFree = 1; doNotFree = 1;
@@ -1534,6 +1558,7 @@ static void *asyncWriterThread(void *pIsStarted){
async.pQueueLast = 0; async.pQueueLast = 0;
} }
if( !doNotFree ){ if( !doNotFree ){
assert_mutex_is_held(&async.queueMutex);
async.pQueueFirst = p->pNext; async.pQueueFirst = p->pNext;
sqlite3_free(p); sqlite3_free(p);
} }