From: dan Date: Mon, 14 Apr 2014 07:30:39 +0000 (+0000) Subject: Improve use of multiple threads in sqlite3VdbeSorterRewind(). X-Git-Tag: version-3.8.7~132^2~75^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=be3018c18f69c5cfbd689e3772a502fcc2edd0b4;p=thirdparty%2Fsqlite.git Improve use of multiple threads in sqlite3VdbeSorterRewind(). FossilOrigin-Name: e1bdc4b810907cc0e55e0c923c8ebc777068cfe0 --- diff --git a/manifest b/manifest index bca9ab362e..bb8ef3522e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\smany\sissues\swith\snew\scode. -D 2014-04-12T19:34:44.467 +C Improve\suse\sof\smultiple\sthreads\sin\ssqlite3VdbeSorterRewind(). +D 2014-04-14T07:30:39.899 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in ad0921c4b2780d01868cf69b419a4f102308d125 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -286,7 +286,7 @@ F src/vdbeapi.c 0ed6053f947edd0b30f64ce5aeb811872a3450a4 F src/vdbeaux.c d8dc38965507a34b0e150c0d7fc82b02f8cf25ea F src/vdbeblob.c 15377abfb59251bccedd5a9c7d014a895f0c04aa F src/vdbemem.c 6fc77594c60f6155404f3f8d71bf36d1fdeb4447 -F src/vdbesort.c bc0d90e00abcc88997f463d4d41b7ba4a10cfd88 +F src/vdbesort.c b047de6a9c89b122ad8649b083c848b6336b91cb F src/vdbetrace.c 6f52bc0c51e144b7efdcfb2a8f771167a8816767 F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd F src/wal.c 76e7fc6de229bea8b30bb2539110f03a494dc3a8 @@ -1163,7 +1163,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 98bf0307b121b0776a7170108cc8d3f948a7ebfe -R f3107fdb117ba86f9bee4609a5b08bfd +P 62c406a042d7246f6df6b943421182a88483b2e3 +R c3e4d1b3a81e551661cfec7b71fa4391 U dan -Z 5a1b16a83fca264558f06f5fb6536949 +Z 2f53ddd699d6387555ef072104853e10 diff --git a/manifest.uuid b/manifest.uuid index e7ab0df5c2..1fc2ca4f8c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -62c406a042d7246f6df6b943421182a88483b2e3 \ No newline at end of file +e1bdc4b810907cc0e55e0c923c8ebc777068cfe0 \ No newline at end of file diff --git a/src/vdbesort.c b/src/vdbesort.c index 1889c8fde1..32305ed792 100644 --- a/src/vdbesort.c +++ b/src/vdbesort.c @@ -1710,7 +1710,10 @@ static void vdbeIncrSetThreads(IncrMerger *pIncr, int bUseThread){ } } -static int vdbeIncrInit2(PmaReader *pIter){ +#define INCRINIT2_NORMAL 0 +#define INCRINIT2_TASK 1 +#define INCRINIT2_ROOT 2 +static int vdbeIncrInit2(PmaReader *pIter, int eMode){ int rc = SQLITE_OK; IncrMerger *pIncr = pIter->pIncr; if( pIncr ){ @@ -1719,7 +1722,12 @@ static int vdbeIncrInit2(PmaReader *pIter){ MergeEngine *pMerger = pIncr->pMerger; for(i=0; rc==SQLITE_OK && inTree; i++){ - rc = vdbeIncrInit2(&pMerger->aIter[i]); + IncrMerger *p; + if( eMode==INCRINIT2_ROOT ){ + rc = vdbePmaReaderNext(&pMerger->aIter[i]); + }else{ + rc = vdbeIncrInit2(&pMerger->aIter[i], INCRINIT2_NORMAL); + } } /* Set up the required files for pIncr */ @@ -1751,16 +1759,32 @@ static int vdbeIncrInit2(PmaReader *pIter){ } if( rc==SQLITE_OK && pIncr->bUseThread ){ - rc = vdbeIncrBgPopulate(pIncr); + /* Use the current thread */ + assert( eMode==INCRINIT2_ROOT || eMode==INCRINIT2_TASK ); + rc = vdbeIncrPopulate(pIncr); } - if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK && eMode!=INCRINIT2_TASK ){ rc = vdbePmaReaderNext(pIter); } } return rc; } +static void *vdbeIncrInit2Thread(void *pCtx){ + PmaReader *pReader = (PmaReader*)pCtx; + void *pRet = SQLITE_INT_TO_PTR( vdbeIncrInit2(pReader, INCRINIT2_TASK) ); + pReader->pIncr->thread.bDone = 1; + return pRet; +} + +static int vdbeIncrBgInit2(PmaReader *pIter){ + void *pCtx = (void*)pIter; + return vdbeSorterCreateThread( + &pIter->pIncr->thread, vdbeIncrInit2Thread, pCtx + ); +} + /* ** Allocate a new MergeEngine object to merge the contents of nPMA level-0 ** PMAs from pTask->file. If no error occurs, set *ppOut to point to @@ -1933,10 +1957,20 @@ static int vdbePmaReaderIncrInit(VdbeSorter *pSorter, PmaReader *pIter){ assert( pIncr->pTask!=pLast ); } } + if( pSorter->nTask>1 ){ + for(iTask=0; rc==SQLITE_OK && iTasknTask; iTask++){ + PmaReader *p = &pMain->aIter[iTask]; + assert( p->pIncr==0 || p->pIncr->pTask==&pSorter->aTask[iTask] ); + if( p->pIncr ){ rc = vdbeIncrBgInit2(p); } + } + } } } } - if( rc==SQLITE_OK ) rc = vdbeIncrInit2(pIter); + if( rc==SQLITE_OK ){ + int eMode = (pSorter->nTask>1 ? INCRINIT2_ROOT : INCRINIT2_NORMAL); + rc = vdbeIncrInit2(pIter, eMode); + } sqlite3_free(aMerge); return rc;