| Index: third_party/sqlite/src/src/test_pcache.c
|
| diff --git a/third_party/sqlite/src/src/test_pcache.c b/third_party/sqlite/src/src/test_pcache.c
|
| index 98aa1367aa19aa756ca315c449c4d598512f2b90..8fcfe7e26e3ff17496b840f5d63c75783aff8162 100644
|
| --- a/third_party/sqlite/src/src/test_pcache.c
|
| +++ b/third_party/sqlite/src/src/test_pcache.c
|
| @@ -100,15 +100,16 @@ static void testpcacheShutdown(void *pArg){
|
| typedef struct testpcache testpcache;
|
| struct testpcache {
|
| int szPage; /* Size of each page. Multiple of 8. */
|
| + int szExtra; /* Size of extra data that accompanies each page */
|
| int bPurgeable; /* True if the page cache is purgeable */
|
| int nFree; /* Number of unused slots in a[] */
|
| int nPinned; /* Number of pinned slots in a[] */
|
| unsigned iRand; /* State of the PRNG */
|
| unsigned iMagic; /* Magic number for sanity checking */
|
| struct testpcachePage {
|
| + sqlite3_pcache_page page; /* Base class */
|
| unsigned key; /* The key for this page. 0 means unallocated */
|
| int isPinned; /* True if the page is pinned */
|
| - void *pData; /* Data for this page */
|
| } a[TESTPCACHE_NPAGE]; /* All pages in the cache */
|
| };
|
|
|
| @@ -129,27 +130,33 @@ static unsigned testpcacheRandom(testpcache *p){
|
| /*
|
| ** Allocate a new page cache instance.
|
| */
|
| -static sqlite3_pcache *testpcacheCreate(int szPage, int bPurgeable){
|
| +static sqlite3_pcache *testpcacheCreate(
|
| + int szPage,
|
| + int szExtra,
|
| + int bPurgeable
|
| +){
|
| int nMem;
|
| char *x;
|
| testpcache *p;
|
| int i;
|
| assert( testpcacheGlobal.pDummy!=0 );
|
| szPage = (szPage+7)&~7;
|
| - nMem = sizeof(testpcache) + TESTPCACHE_NPAGE*szPage;
|
| + nMem = sizeof(testpcache) + TESTPCACHE_NPAGE*(szPage+szExtra);
|
| p = sqlite3_malloc( nMem );
|
| if( p==0 ) return 0;
|
| x = (char*)&p[1];
|
| p->szPage = szPage;
|
| + p->szExtra = szExtra;
|
| p->nFree = TESTPCACHE_NPAGE;
|
| p->nPinned = 0;
|
| p->iRand = testpcacheGlobal.prngSeed;
|
| p->bPurgeable = bPurgeable;
|
| p->iMagic = TESTPCACHE_VALID;
|
| - for(i=0; i<TESTPCACHE_NPAGE; i++, x += szPage){
|
| + for(i=0; i<TESTPCACHE_NPAGE; i++, x += (szPage+szExtra)){
|
| p->a[i].key = 0;
|
| p->a[i].isPinned = 0;
|
| - p->a[i].pData = (void*)x;
|
| + p->a[i].page.pBuf = (void*)x;
|
| + p->a[i].page.pExtra = (void*)&x[szPage];
|
| }
|
| testpcacheGlobal.nInstance++;
|
| return (sqlite3_pcache*)p;
|
| @@ -161,7 +168,6 @@ static sqlite3_pcache *testpcacheCreate(int szPage, int bPurgeable){
|
| static void testpcacheCachesize(sqlite3_pcache *pCache, int newSize){
|
| testpcache *p = (testpcache*)pCache;
|
| assert( p->iMagic==TESTPCACHE_VALID );
|
| - assert( newSize>=1 );
|
| assert( testpcacheGlobal.pDummy!=0 );
|
| assert( testpcacheGlobal.nInstance>0 );
|
| }
|
| @@ -181,7 +187,7 @@ static int testpcachePagecount(sqlite3_pcache *pCache){
|
| /*
|
| ** Fetch a page.
|
| */
|
| -static void *testpcacheFetch(
|
| +static sqlite3_pcache_page *testpcacheFetch(
|
| sqlite3_pcache *pCache,
|
| unsigned key,
|
| int createFlag
|
| @@ -200,7 +206,7 @@ static void *testpcacheFetch(
|
| assert( p->nPinned <= TESTPCACHE_NPAGE - p->nFree );
|
| p->a[i].isPinned = 1;
|
| }
|
| - return p->a[i].pData;
|
| + return &p->a[i].page;
|
| }
|
| }
|
|
|
| @@ -237,11 +243,12 @@ static void *testpcacheFetch(
|
| if( p->a[j].key==0 ){
|
| p->a[j].key = key;
|
| p->a[j].isPinned = 1;
|
| - memset(p->a[j].pData, 0, p->szPage);
|
| + memset(p->a[j].page.pBuf, 0, p->szPage);
|
| + memset(p->a[j].page.pExtra, 0, p->szExtra);
|
| p->nPinned++;
|
| p->nFree--;
|
| assert( p->nPinned <= TESTPCACHE_NPAGE - p->nFree );
|
| - return p->a[j].pData;
|
| + return &p->a[j].page;
|
| }
|
| }
|
|
|
| @@ -263,10 +270,11 @@ static void *testpcacheFetch(
|
| if( p->a[j].key>0 && p->a[j].isPinned==0 ){
|
| p->a[j].key = key;
|
| p->a[j].isPinned = 1;
|
| - memset(p->a[j].pData, 0, p->szPage);
|
| + memset(p->a[j].page.pBuf, 0, p->szPage);
|
| + memset(p->a[j].page.pExtra, 0, p->szExtra);
|
| p->nPinned++;
|
| assert( p->nPinned <= TESTPCACHE_NPAGE - p->nFree );
|
| - return p->a[j].pData;
|
| + return &p->a[j].page;
|
| }
|
| }
|
|
|
| @@ -280,7 +288,7 @@ static void *testpcacheFetch(
|
| */
|
| static void testpcacheUnpin(
|
| sqlite3_pcache *pCache,
|
| - void *pOldPage,
|
| + sqlite3_pcache_page *pOldPage,
|
| int discard
|
| ){
|
| testpcache *p = (testpcache*)pCache;
|
| @@ -300,7 +308,7 @@ static void testpcacheUnpin(
|
| }
|
|
|
| for(i=0; i<TESTPCACHE_NPAGE; i++){
|
| - if( p->a[i].pData==pOldPage ){
|
| + if( &p->a[i].page==pOldPage ){
|
| /* The pOldPage pointer always points to a pinned page */
|
| assert( p->a[i].isPinned );
|
| p->a[i].isPinned = 0;
|
| @@ -325,7 +333,7 @@ static void testpcacheUnpin(
|
| */
|
| static void testpcacheRekey(
|
| sqlite3_pcache *pCache,
|
| - void *pOldPage,
|
| + sqlite3_pcache_page *pOldPage,
|
| unsigned oldKey,
|
| unsigned newKey
|
| ){
|
| @@ -354,7 +362,7 @@ static void testpcacheRekey(
|
| for(i=0; i<TESTPCACHE_NPAGE; i++){
|
| if( p->a[i].key==oldKey ){
|
| /* The oldKey and pOldPage parameters match */
|
| - assert( p->a[i].pData==pOldPage );
|
| + assert( &p->a[i].page==pOldPage );
|
| /* Page to be rekeyed must be pinned */
|
| assert( p->a[i].isPinned );
|
| p->a[i].key = newKey;
|
| @@ -422,7 +430,8 @@ void installTestPCache(
|
| unsigned prngSeed, /* Seed for the PRNG */
|
| unsigned highStress /* Call xStress agressively */
|
| ){
|
| - static const sqlite3_pcache_methods testPcache = {
|
| + static const sqlite3_pcache_methods2 testPcache = {
|
| + 1,
|
| (void*)&testpcacheGlobal,
|
| testpcacheInit,
|
| testpcacheShutdown,
|
| @@ -435,7 +444,7 @@ void installTestPCache(
|
| testpcacheTruncate,
|
| testpcacheDestroy,
|
| };
|
| - static sqlite3_pcache_methods defaultPcache;
|
| + static sqlite3_pcache_methods2 defaultPcache;
|
| static int isInstalled = 0;
|
|
|
| assert( testpcacheGlobal.nInstance==0 );
|
| @@ -446,12 +455,12 @@ void installTestPCache(
|
| testpcacheGlobal.highStress = highStress;
|
| if( installFlag!=isInstalled ){
|
| if( installFlag ){
|
| - sqlite3_config(SQLITE_CONFIG_GETPCACHE, &defaultPcache);
|
| + sqlite3_config(SQLITE_CONFIG_GETPCACHE2, &defaultPcache);
|
| assert( defaultPcache.xCreate!=testpcacheCreate );
|
| - sqlite3_config(SQLITE_CONFIG_PCACHE, &testPcache);
|
| + sqlite3_config(SQLITE_CONFIG_PCACHE2, &testPcache);
|
| }else{
|
| assert( defaultPcache.xCreate!=0 );
|
| - sqlite3_config(SQLITE_CONFIG_PCACHE, &defaultPcache);
|
| + sqlite3_config(SQLITE_CONFIG_PCACHE2, &defaultPcache);
|
| }
|
| isInstalled = installFlag;
|
| }
|
|
|