From: dan Date: Thu, 3 Dec 2015 11:51:18 +0000 (+0000) Subject: Improve concurrency in test_multiplex.c. Add a switch to "threadtest3" allowing it... X-Git-Tag: version-3.10.0~65 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=48c06f32ca6442b8c9befeadda9c17489285e716;p=thirdparty%2Fsqlite.git Improve concurrency in test_multiplex.c. Add a switch to "threadtest3" allowing it to run using the multiplexor VFS. FossilOrigin-Name: 9d2c62b04e3a9ac5d9adea2aac7ec3f3bc3e88bd --- diff --git a/main.mk b/main.mk index f3a37dc194..7f2cf7abd6 100644 --- a/main.mk +++ b/main.mk @@ -795,8 +795,8 @@ THREADTEST3_SRC = $(TOP)/test/threadtest3.c \ $(TOP)/test/tt3_stress.c \ $(TOP)/test/tt3_lookaside1.c -threadtest3$(EXE): sqlite3.o $(THREADTEST3_SRC) - $(TCCX) $(TOP)/test/threadtest3.c sqlite3.o -o $@ $(THREADLIB) +threadtest3$(EXE): libsqlite3.a $(THREADTEST3_SRC) $(TOP)/src/test_multiplex.c + $(TCCX) $(TOP)/test/threadtest3.c $(TOP)/src/test_multiplex.c libsqlite3.a -o $@ $(THREADLIB) threadtest: threadtest3$(EXE) ./threadtest3$(EXE) diff --git a/manifest b/manifest index 0f6f52c4c6..341bd3ac31 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C A\sunix\sVFS\schange\sreplaces\sfsync()\swith\sfstat()\swhen\susing\sSQLITE_NO_SYNC,\sso\nset\sPRAGMA\ssynchronous=OFF\sin\sthe\ssysfault-3\stest\sto\savoid\serroneously\scausing\nerrors\sin\sxSync. -D 2015-12-03T01:48:32.232 +C Improve\sconcurrency\sin\stest_multiplex.c.\sAdd\sa\sswitch\sto\s"threadtest3"\sallowing\sit\sto\srun\susing\sthe\smultiplexor\sVFS. +D 2015-12-03T11:51:18.767 F Makefile.in 23d9a63484a383fc64951b25ef44067930f98dc6 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc e8fdca1cb89a1b58b5f4d3a130ea9a3d28cb314d @@ -263,7 +263,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 9001039f432baeba1074e2d1885f3dfd572b8636 +F main.mk 2a1196d5e10ce062862b24a4cf9a985fe477de34 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -375,7 +375,7 @@ F src/test_intarray.h 9dc57417fb65bc7835cc18548852cc08cc062202 F src/test_journal.c 5360fbe1d1e4416ca36290562fd5a2e3f70f32aa F src/test_loadext.c a5251f956ab6af21e138dc1f9c0399394a510cb4 F src/test_malloc.c 8e1c2112fa4f543b46c990a8872f9e6d37938744 -F src/test_multiplex.c 9fefd23f6cc3fa9bf0748a5e453167e7b9f193ce +F src/test_multiplex.c 6a088d8d9d4aad4bec45dd8878af11b15900702d F src/test_multiplex.h c08e4e8f8651f0c5e0509b138ff4d5b43ed1f5d3 F src/test_mutex.c dbdfaff8580071f2212a0deae3325a93a737819c F src/test_onefile.c 38f7cbe79d5bafe95bde683cc3a53b8ca16daf10 @@ -1074,7 +1074,7 @@ F test/thread2.test f35d2106452b77523b3a2b7d1dcde2e5ee8f9e46 F test/thread_common.tcl 334639cadcb9f912bf82aa73f49efd5282e6cadd F test/threadtest1.c 6029d9c5567db28e6dc908a0c63099c3ba6c383b F test/threadtest2.c a70a8e94bef23339d34226eb9521015ef99f4df8 -F test/threadtest3.c 0707c28e0954acbef654f91675e14f3573cf9a10 +F test/threadtest3.c 469ea7fe7030d75bd67dcf8047b16c1deea5210d F test/threadtest4.c c1e67136ceb6c7ec8184e56ac61db28f96bd2925 F test/tkt-02a8e81d44.test 6c80d9c7514e2a42d4918bf87bf6bc54f379110c F test/tkt-26ff0c2d1e.test 888324e751512972c6e0d1a09df740d8f5aaf660 @@ -1408,7 +1408,7 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4f2bcff94c672312805be1400050a7026f93a9d7 -R 029751c01b929451cff95b86da0868ac -U drh -Z 7f6ec6c824be76681c81bd551b601799 +P 4f7f355021f9eb048fffc84e559bfb3fdb1e1e69 +R 17fe6dc83cb64fc6198b93af9ffea9ca +U dan +Z de557aa3ec0a739d4121e9d650d8e092 diff --git a/manifest.uuid b/manifest.uuid index ee47648488..3704b84542 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4f7f355021f9eb048fffc84e559bfb3fdb1e1e69 \ No newline at end of file +9d2c62b04e3a9ac5d9adea2aac7ec3f3bc3e88bd \ No newline at end of file diff --git a/src/test_multiplex.c b/src/test_multiplex.c index 843a92ca65..82845ea7e1 100644 --- a/src/test_multiplex.c +++ b/src/test_multiplex.c @@ -189,8 +189,11 @@ static struct { int isInitialized; /* For run-time access any of the other global data structures in this - ** shim, the following mutex must be held. - */ + ** shim, the following mutex must be held. In practice, all this mutex + ** protects is add/remove operations to/from the linked list of group objects + ** starting at pGroups below. More specifically, it protects the value of + ** pGroups itself, and the pNext/pPrev fields of each multiplexGroup + ** structure. */ sqlite3_mutex *pMutex; /* List of multiplexGroup objects. @@ -758,11 +761,8 @@ static int multiplexRead( multiplexConn *p = (multiplexConn*)pConn; multiplexGroup *pGroup = p->pGroup; int rc = SQLITE_OK; - int nMutex = 0; - multiplexEnter(); nMutex++; if( !pGroup->bEnabled ){ sqlite3_file *pSubOpen = multiplexSubOpen(pGroup, 0, &rc, NULL, 0); - multiplexLeave(); nMutex--; if( pSubOpen==0 ){ rc = SQLITE_IOERR_READ; }else{ @@ -772,9 +772,7 @@ static int multiplexRead( while( iAmt > 0 ){ int i = (int)(iOfst / pGroup->szChunk); sqlite3_file *pSubOpen; - if( nMutex==0 ){ multiplexEnter(); nMutex++; } pSubOpen = multiplexSubOpen(pGroup, i, &rc, NULL, 1); - multiplexLeave(); nMutex--; if( pSubOpen ){ int extra = ((int)(iOfst % pGroup->szChunk) + iAmt) - pGroup->szChunk; if( extra<0 ) extra = 0; @@ -791,8 +789,7 @@ static int multiplexRead( } } } - assert( nMutex==0 || nMutex==1 ); - if( nMutex ) multiplexLeave(); + return rc; } @@ -809,7 +806,6 @@ static int multiplexWrite( multiplexConn *p = (multiplexConn*)pConn; multiplexGroup *pGroup = p->pGroup; int rc = SQLITE_OK; - multiplexEnter(); if( !pGroup->bEnabled ){ sqlite3_file *pSubOpen = multiplexSubOpen(pGroup, 0, &rc, NULL, 0); if( pSubOpen==0 ){ @@ -834,7 +830,6 @@ static int multiplexWrite( } } } - multiplexLeave(); return rc; } diff --git a/test/threadtest3.c b/test/threadtest3.c index a3fcae28cc..a0fad0f91d 100644 --- a/test/threadtest3.c +++ b/test/threadtest3.c @@ -88,6 +88,8 @@ #include #include +#include "test_multiplex.h" + /* * This code implements the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. This code was @@ -1460,13 +1462,36 @@ int main(int argc, char **argv){ argc = 2; argv = substArgv; } + + /* Loop through the command-line arguments to ensure that each argument + ** selects at least one test. If not, assume there is a typo on the + ** command-line and bail out with the usage message. */ for(iArg=1; iArg=sizeof(aTest)/sizeof(aTest[0]) ) goto usage; } + for(iArg=1; iArg0 ? 255 : 0); usage: - printf("Usage: %s [testname|testprefix*]...\n", argv[0]); + printf("Usage: %s [-multiplexor] [testname|testprefix*]...\n", argv[0]); printf("Available tests are:\n"); for(i=0; i