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; |
} |