$(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)
-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
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
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
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
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
-4f7f355021f9eb048fffc84e559bfb3fdb1e1e69
\ No newline at end of file
+9d2c62b04e3a9ac5d9adea2aac7ec3f3bc3e88bd
\ No newline at end of file
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.
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{
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;
}
}
}
- assert( nMutex==0 || nMutex==1 );
- if( nMutex ) multiplexLeave();
+
return rc;
}
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 ){
}
}
}
- multiplexLeave();
return rc;
}
#include <fcntl.h>
#include <errno.h>
+#include "test_multiplex.h"
+
/*
* This code implements the MD5 message-digest algorithm.
* The algorithm is due to Ron Rivest. This code was
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<argc; iArg++){
+ const char *zArg = argv[iArg];
+ if( zArg[0]=='-' ){
+ if( sqlite3_stricmp(zArg, "-multiplexor")==0 ){
+ /* Install the multiplexor VFS as the default */
+ int rc = sqlite3_multiplex_initialize(0, 1);
+ if( rc!=SQLITE_OK ){
+ fprintf(stderr, "Failed to install multiplexor VFS (%d)\n", rc);
+ return 253;
+ }
+ }
+ else {
+ goto usage;
+ }
+
+ continue;
+ }
+
for(i=0; i<sizeof(aTest)/sizeof(aTest[0]); i++){
- if( sqlite3_strglob(argv[iArg],aTest[i].zTest)==0 ) break;
+ if( sqlite3_strglob(zArg, aTest[i].zTest)==0 ) break;
}
if( i>=sizeof(aTest)/sizeof(aTest[0]) ) goto usage;
}
+
for(iArg=1; iArg<argc; iArg++){
+ if( argv[iArg][0]=='-' ) continue;
for(i=0; i<sizeof(aTest)/sizeof(aTest[0]); i++){
char const *z = aTest[i].zTest;
if( sqlite3_strglob(argv[iArg],z)==0 ){
return (nGlobalErr>0 ? 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<sizeof(aTest)/sizeof(aTest[0]); i++){
printf(" %s\n", aTest[i].zTest);