Index: src/test_multiplex.c ================================================================== --- src/test_multiplex.c +++ src/test_multiplex.c @@ -753,22 +753,26 @@ sqlite3_int64 iOfst ){ 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{ rc = pSubOpen->pMethods->xRead(pSubOpen, pBuf, iAmt, iOfst); } }else{ while( iAmt > 0 ){ int i = (int)(iOfst / pGroup->szChunk); + if( nMutex==0 ){ multiplexEnter(); nMutex++; } sqlite3_file *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; iAmt -= extra; rc = pSubOpen->pMethods->xRead(pSubOpen, pBuf, iAmt, @@ -781,11 +785,12 @@ rc = SQLITE_IOERR_READ; break; } } } - multiplexLeave(); + assert( nMutex==0 || nMutex==1 ); + if( nMutex ) multiplexLeave(); return rc; } /* Pass xWrite requests thru to the original VFS after ** determining the correct chunk to operate on.