summaryrefslogtreecommitdiff
path: root/src/test_multiplex.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/test_multiplex.c')
-rw-r--r--src/test_multiplex.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/test_multiplex.c b/src/test_multiplex.c
index 624541b..427cc65 100644
--- a/src/test_multiplex.c
+++ b/src/test_multiplex.c
@@ -755,9 +755,11 @@ static int multiplexRead(
multiplexConn *p = (multiplexConn*)pConn;
multiplexGroup *pGroup = p->pGroup;
int rc = SQLITE_OK;
- multiplexEnter();
+ 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{
@@ -766,7 +768,10 @@ static int multiplexRead(
}else{
while( iAmt > 0 ){
int i = (int)(iOfst / pGroup->szChunk);
- sqlite3_file *pSubOpen = multiplexSubOpen(pGroup, i, &rc, NULL, 1);
+ 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;
@@ -783,7 +788,8 @@ static int multiplexRead(
}
}
}
- multiplexLeave();
+ assert( nMutex==0 || nMutex==1 );
+ if( nMutex ) multiplexLeave();
return rc;
}
@@ -1170,14 +1176,20 @@ int sqlite3_multiplex_initialize(const char *zOrigVfsName, int makeDefault){
** THIS ROUTINE IS NOT THREADSAFE. Call this routine exactly once while
** shutting down in order to free all remaining multiplex groups.
*/
-int sqlite3_multiplex_shutdown(void){
+int sqlite3_multiplex_shutdown(int eForce){
+ int rc = SQLITE_OK;
if( gMultiplex.isInitialized==0 ) return SQLITE_MISUSE;
- if( gMultiplex.pGroups ) return SQLITE_MISUSE;
+ if( gMultiplex.pGroups ){
+ sqlite3_log(SQLITE_MISUSE, "sqlite3_multiplex_shutdown() called "
+ "while database connections are still open");
+ if( !eForce ) return SQLITE_MISUSE;
+ rc = SQLITE_MISUSE;
+ }
gMultiplex.isInitialized = 0;
sqlite3_mutex_free(gMultiplex.pMutex);
sqlite3_vfs_unregister(&gMultiplex.sThisVfs);
memset(&gMultiplex, 0, sizeof(gMultiplex));
- return SQLITE_OK;
+ return rc;
}
/***************************** Test Code ***********************************/
@@ -1230,13 +1242,16 @@ static int test_multiplex_shutdown(
UNUSED_PARAMETER(clientData);
- if( objc!=1 ){
- Tcl_WrongNumArgs(interp, 1, objv, "");
+ if( objc==2 && strcmp(Tcl_GetString(objv[1]),"-force")!=0 ){
+ objc = 3;
+ }
+ if( (objc!=1 && objc!=2) ){
+ Tcl_WrongNumArgs(interp, 1, objv, "?-force?");
return TCL_ERROR;
}
/* Call sqlite3_multiplex_shutdown() */
- rc = sqlite3_multiplex_shutdown();
+ rc = sqlite3_multiplex_shutdown(objc==2);
Tcl_SetResult(interp, (char *)sqlite3ErrName(rc), TCL_STATIC);
return TCL_OK;