aboutsummaryrefslogtreecommitdiff
path: root/src/test_multiplex.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2013-10-21 13:15:55 +0000
committerdrh <drh@noemail.net>2013-10-21 13:15:55 +0000
commitee68ccfbad78a0bcc542789eddb09aed960940a5 (patch)
tree6e0293c13116fddcb5e3c6d9050b7b1f7404013d /src/test_multiplex.c
parent05684271c62efe2aefb39c536b628e260cc0a872 (diff)
downloadsqlite-ee68ccfbad78a0bcc542789eddb09aed960940a5.tar.gz
sqlite-ee68ccfbad78a0bcc542789eddb09aed960940a5.zip
Drop the mutex on the multiplexor before entering the xRead VFS call.
FossilOrigin-Name: a00d2ed49c9f53263cd76ad41dad9e35e646ebb5
Diffstat (limited to 'src/test_multiplex.c')
-rw-r--r--src/test_multiplex.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/test_multiplex.c b/src/test_multiplex.c
index 624541b32..469823094 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,9 @@ static int multiplexRead(
}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;
@@ -783,7 +787,8 @@ static int multiplexRead(
}
}
}
- multiplexLeave();
+ assert( nMutex==0 || nMutex==1 );
+ if( nMutex ) multiplexLeave();
return rc;
}