Add internal interfaces: PageMalloc/PageFree and ScratchMalloc/ScratchFree. (CVS 5226)

FossilOrigin-Name: 3e797d0ffe1af6f7512b3fb7b387418ac05671e0
This commit is contained in:
drh 2008-06-17 15:12:00 +00:00
parent cdb7a0feb5
commit facf030792
9 changed files with 85 additions and 85 deletions

View File

@ -1,5 +1,5 @@
C Do\snot\sallow\sa\sVACUUM\sto\stry\sto\schange\sthe\spage_size\son\san\sencrypted\sdatabase.\s(CVS\s5225) C Add\sinternal\sinterfaces:\s\sPageMalloc/PageFree\sand\sScratchMalloc/ScratchFree.\s(CVS\s5226)
D 2008-06-17T01:03:26 D 2008-06-17T15:12:01
F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7 F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7
F Makefile.in dc5608df93faf4406cfd7a1c8ed9ab93d8bfbfd5 F Makefile.in dc5608df93faf4406cfd7a1c8ed9ab93d8bfbfd5
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@ -96,7 +96,7 @@ F src/attach.c b18ba42c77f7d3941f5d23d2ca20fa1d841a4e91
F src/auth.c c8b2ab5c8bad4bd90ed7c294694f48269162c627 F src/auth.c c8b2ab5c8bad4bd90ed7c294694f48269162c627
F src/bitvec.c ab50c4b8c6a899dae499f5a805eebe4223c78269 F src/bitvec.c ab50c4b8c6a899dae499f5a805eebe4223c78269
F src/btmutex.c 483ced3c52205b04b97df69161fadbf87f4f1ea2 F src/btmutex.c 483ced3c52205b04b97df69161fadbf87f4f1ea2
F src/btree.c b374c2ba457f442371aa92b065d1ba698cdee1dc F src/btree.c a7b1ffdde06b8e854076789e393b315ee7856ae5
F src/btree.h b1bd7e0b8c2e33658aaf447cb0d1d94f74664b6b F src/btree.h b1bd7e0b8c2e33658aaf447cb0d1d94f74664b6b
F src/btreeInt.h 02325f04758dba0fcd0c08ac55cd9b189dad61a5 F src/btreeInt.h 02325f04758dba0fcd0c08ac55cd9b189dad61a5
F src/build.c 88cc5501a87f72d0538b040001d88d31f994edea F src/build.c 88cc5501a87f72d0538b040001d88d31f994edea
@ -116,10 +116,10 @@ F src/journal.c cffd2cd214e58c0e99c3ff632b3bee6c7cbb260e
F src/legacy.c 3626c71fb70912abec9a4312beba753a9ce800df F src/legacy.c 3626c71fb70912abec9a4312beba753a9ce800df
F src/loadext.c f99a75534a53e281fa2461239ee4a4b4bf6ad564 F src/loadext.c f99a75534a53e281fa2461239ee4a4b4bf6ad564
F src/main.c 1f65b285a87f237e9e63c9628f220d10aef36b81 F src/main.c 1f65b285a87f237e9e63c9628f220d10aef36b81
F src/malloc.c c5bdf8967df9acc9765ed1b55c0c0eba9fe9494c F src/malloc.c 7b622d22f29e3be56d271a5a921f3b5788330189
F src/md5.c 008216bbb5d34c6fbab5357aa68575ad8a31516a F src/md5.c 008216bbb5d34c6fbab5357aa68575ad8a31516a
F src/mem1.c c8e07e9e6620b1aabf9bdefd19dee93831f67733 F src/mem1.c 159f10e280f2d9aea597cf938851e61652dd5c3d
F src/mem2.c 53d29d8275753e05676536c5db8f4867a622b31c F src/mem2.c 809d0e311c38521779e92262f51bd847d12d0f4d
F src/mem3.c 617c2e2a72a10ecc5c01af14efc8c2596d2c2e87 F src/mem3.c 617c2e2a72a10ecc5c01af14efc8c2596d2c2e87
F src/mem4.c 45c328ec6dcb7e8d319cb383615b5fe547ca5409 F src/mem4.c 45c328ec6dcb7e8d319cb383615b5fe547ca5409
F src/mem5.c 3d2ff00c6e3bc37f5d82cd82e1a123b246fb7b39 F src/mem5.c 3d2ff00c6e3bc37f5d82cd82e1a123b246fb7b39
@ -134,7 +134,7 @@ F src/os_common.h 24525d8b7bce66c374dfc1810a6c9043f3359b60
F src/os_os2.c 9f74147f1899793a106827f6bc770363ec377912 F src/os_os2.c 9f74147f1899793a106827f6bc770363ec377912
F src/os_unix.c dd4a7b19ec00869764c389560c3faf566cf98a71 F src/os_unix.c dd4a7b19ec00869764c389560c3faf566cf98a71
F src/os_win.c 0b90d9a1ce18bfd2a5f3c4a6bdb13ec369c805a9 F src/os_win.c 0b90d9a1ce18bfd2a5f3c4a6bdb13ec369c805a9
F src/pager.c 5599fb3ebb63a60ecb44a18a594b371484a7e128 F src/pager.c 124b3eaed1bcf9d19b183b5796fa94e292f8cdb8
F src/pager.h 6aa3050a3c684475a5a9dbad5ff1cebad612acba F src/pager.h 6aa3050a3c684475a5a9dbad5ff1cebad612acba
F src/parse.y 8c2c3145eebe1964eb279cb3c4e502eae28bb0fa F src/parse.y 8c2c3145eebe1964eb279cb3c4e502eae28bb0fa
F src/pragma.c 70e7c865dce85fdf9df81848af2169009a56ed08 F src/pragma.c 70e7c865dce85fdf9df81848af2169009a56ed08
@ -143,9 +143,9 @@ F src/printf.c 8b063da9dcde26b7c500a01444b718d86f21bc6e
F src/random.c 2b2db2de4ab491f5a14d3480466f8f4b5a5db74a F src/random.c 2b2db2de4ab491f5a14d3480466f8f4b5a5db74a
F src/select.c 669687459e7d0193c89de06c5dbed55b4a41191c F src/select.c 669687459e7d0193c89de06c5dbed55b4a41191c
F src/shell.c a12ea645271b7876c8f080146f48e20b00d367ec F src/shell.c a12ea645271b7876c8f080146f48e20b00d367ec
F src/sqlite.h.in 9ff44542f18937a987f13dbc64f29f9a93b8b521 F src/sqlite.h.in 1444cdd69bd9377fe33fd273a4554b75fb0b5ede
F src/sqlite3ext.h faacd0e6a81aabee0861c6d7883c9172e74ef5b3 F src/sqlite3ext.h faacd0e6a81aabee0861c6d7883c9172e74ef5b3
F src/sqliteInt.h bf561dab8a5155f25d3415fa056f570a731e2792 F src/sqliteInt.h e579f90f7d070f604f79bb85029c424d273cc20b
F src/sqliteLimit.h f435e728c6b620ef7312814d660a81f9356eb5c8 F src/sqliteLimit.h f435e728c6b620ef7312814d660a81f9356eb5c8
F src/table.c 1fa8f8113ac9cbc09ae4801c6d2a7f0af82c5822 F src/table.c 1fa8f8113ac9cbc09ae4801c6d2a7f0af82c5822
F src/tclsqlite.c c57e740e30bd6dda678796eed62c7f0e64689834 F src/tclsqlite.c c57e740e30bd6dda678796eed62c7f0e64689834
@ -594,7 +594,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1 F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
P bb4edb53964559fc1cd69700beb72ecc29b58f37 P d49e5020019093a5b8a4fbe09caeb84ecb538629
R 7166a804863eb0c7dec5311dc0bfcdb3 R 25fbb9097db5d9ffe1b1d6302c5755df
U drh U drh
Z 9f8da086219df1d3431408cc19590d26 Z e3fe71a0b1fa8d45526d8e8aaa39339c

View File

@ -1 +1 @@
d49e5020019093a5b8a4fbe09caeb84ecb538629 3e797d0ffe1af6f7512b3fb7b387418ac05671e0

View File

@ -9,7 +9,7 @@
** May you share freely, never taking more than you give. ** May you share freely, never taking more than you give.
** **
************************************************************************* *************************************************************************
** $Id: btree.c,v 1.464 2008/06/15 02:51:47 drh Exp $ ** $Id: btree.c,v 1.465 2008/06/17 15:12:01 drh Exp $
** **
** This file implements a external (disk-based) database using BTrees. ** This file implements a external (disk-based) database using BTrees.
** See the header comment on "btreeInt.h" for additional information. ** See the header comment on "btreeInt.h" for additional information.
@ -3719,14 +3719,14 @@ int sqlite3BtreeMoveto(
if( available>=nCellKey ){ if( available>=nCellKey ){
c = sqlite3VdbeRecordCompare(nCellKey, pCellKey, pUnKey); c = sqlite3VdbeRecordCompare(nCellKey, pCellKey, pUnKey);
}else{ }else{
pCellKey = sqlite3TempMalloc( nCellKey ); pCellKey = sqlite3Malloc( nCellKey );
if( pCellKey==0 ){ if( pCellKey==0 ){
rc = SQLITE_NOMEM; rc = SQLITE_NOMEM;
goto moveto_finish; goto moveto_finish;
} }
rc = sqlite3BtreeKey(pCur, 0, nCellKey, (void *)pCellKey); rc = sqlite3BtreeKey(pCur, 0, nCellKey, (void *)pCellKey);
c = sqlite3VdbeRecordCompare(nCellKey, pCellKey, pUnKey); c = sqlite3VdbeRecordCompare(nCellKey, pCellKey, pUnKey);
sqlite3TempFree(pCellKey); sqlite3_free(pCellKey);
if( rc ) goto moveto_finish; if( rc ) goto moveto_finish;
} }
} }
@ -4860,6 +4860,7 @@ static int balance_nonroot(MemPage *pPage){
int subtotal; /* Subtotal of bytes in cells on one page */ int subtotal; /* Subtotal of bytes in cells on one page */
int iSpace1 = 0; /* First unused byte of aSpace1[] */ int iSpace1 = 0; /* First unused byte of aSpace1[] */
int iSpace2 = 0; /* First unused byte of aSpace2[] */ int iSpace2 = 0; /* First unused byte of aSpace2[] */
int szScratch; /* Size of scratch memory requested */
MemPage *apOld[NB]; /* pPage and up to two siblings */ MemPage *apOld[NB]; /* pPage and up to two siblings */
Pgno pgnoOld[NB]; /* Page numbers for each page in apOld[] */ Pgno pgnoOld[NB]; /* Page numbers for each page in apOld[] */
MemPage *apCopy[NB]; /* Private copies of apOld[] pages */ MemPage *apCopy[NB]; /* Private copies of apOld[] pages */
@ -4990,13 +4991,13 @@ static int balance_nonroot(MemPage *pPage){
/* /*
** Allocate space for memory structures ** Allocate space for memory structures
*/ */
apCell = sqlite3TempMalloc( szScratch =
nMaxCells*sizeof(u8*) /* apCell */ nMaxCells*sizeof(u8*) /* apCell */
+ nMaxCells*sizeof(u16) /* szCell */ + nMaxCells*sizeof(u16) /* szCell */
+ (ROUND8(sizeof(MemPage))+pBt->pageSize)*NB /* aCopy */ + (ROUND8(sizeof(MemPage))+pBt->pageSize)*NB /* aCopy */
+ pBt->pageSize /* aSpace1 */ + pBt->pageSize /* aSpace1 */
+ (ISAUTOVACUUM ? nMaxCells : 0) /* aFrom */ + (ISAUTOVACUUM ? nMaxCells : 0); /* aFrom */
); apCell = sqlite3ScratchMalloc( szScratch );
if( apCell==0 ){ if( apCell==0 ){
rc = SQLITE_NOMEM; rc = SQLITE_NOMEM;
goto balance_cleanup; goto balance_cleanup;
@ -5015,7 +5016,7 @@ static int balance_nonroot(MemPage *pPage){
aFrom = &aSpace1[pBt->pageSize]; aFrom = &aSpace1[pBt->pageSize];
} }
#endif #endif
aSpace2 = sqlite3Malloc(pBt->pageSize); aSpace2 = sqlite3PageMalloc(pBt->pageSize);
if( aSpace2==0 ){ if( aSpace2==0 ){
rc = SQLITE_NOMEM; rc = SQLITE_NOMEM;
goto balance_cleanup; goto balance_cleanup;
@ -5397,7 +5398,7 @@ static int balance_nonroot(MemPage *pPage){
** But the parent page will always be initialized. ** But the parent page will always be initialized.
*/ */
assert( pParent->isInit ); assert( pParent->isInit );
sqlite3TempFree(apCell); sqlite3ScratchFree(apCell);
apCell = 0; apCell = 0;
rc = balance(pParent, 0); rc = balance(pParent, 0);
@ -5405,8 +5406,8 @@ static int balance_nonroot(MemPage *pPage){
** Cleanup before returning. ** Cleanup before returning.
*/ */
balance_cleanup: balance_cleanup:
sqlite3_free(aSpace2); sqlite3PageFree(aSpace2);
sqlite3TempFree(apCell); sqlite3ScratchFree(apCell);
for(i=0; i<nOld; i++){ for(i=0; i<nOld; i++){
releasePage(apOld[i]); releasePage(apOld[i]);
} }

View File

@ -12,7 +12,7 @@
** **
** Memory allocation functions used throughout sqlite. ** Memory allocation functions used throughout sqlite.
** **
** $Id: malloc.c,v 1.17 2008/06/15 02:51:48 drh Exp $ ** $Id: malloc.c,v 1.18 2008/06/17 15:12:01 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
#include <stdarg.h> #include <stdarg.h>
@ -91,7 +91,7 @@ static struct {
sqlite3_int64 nowUsed; /* Main memory currently in use */ sqlite3_int64 nowUsed; /* Main memory currently in use */
sqlite3_int64 mxUsed; /* Highwater mark for nowUsed */ sqlite3_int64 mxUsed; /* Highwater mark for nowUsed */
int mxReq; /* Max request size for ordinary mallocs */ int mxReq; /* Max request size for ordinary mallocs */
int mxTempReq; /* Max request size for xTemp mallocs */ int mxScratchReq; /* Max request size for xTemp mallocs */
} mem0; } mem0;
/* /*
@ -229,12 +229,12 @@ void *sqlite3_malloc(int n){
/* /*
** Each thread may only have a single outstanding allocation from ** Each thread may only have a single outstanding allocation from
** xTempMalloc(). We verify this constraint in the single-threaded ** xScratchMalloc(). We verify this constraint in the single-threaded
** case by setting tempAllocOut to 1 when an allocation ** case by setting scratchAllocOut to 1 when an allocation
** is outstanding clearing it when the allocation is freed. ** is outstanding clearing it when the allocation is freed.
*/ */
#if SQLITE_THREADSAFE==0 && !defined(NDEBUG) #if SQLITE_THREADSAFE==0 && !defined(NDEBUG)
static int tempAllocOut = 0; static int scratchAllocOut = 0;
#endif #endif
@ -246,36 +246,46 @@ static int tempAllocOut = 0;
** structures that would not normally fit on the stack of an ** structures that would not normally fit on the stack of an
** embedded processor. ** embedded processor.
*/ */
void *sqlite3TempMalloc(int n){ void *sqlite3ScratchMalloc(int n){
void *p; void *p;
assert( n>0 ); assert( n>0 );
if( sqlite3FaultStep(SQLITE_FAULTINJECTOR_MALLOC) ){ if( sqlite3FaultStep(SQLITE_FAULTINJECTOR_MALLOC) ){
return 0; return 0;
} }
#if SQLITE_THREADSAFE==0 && !defined(NDEBUG) #if SQLITE_THREADSAFE==0 && !defined(NDEBUG)
assert( tempAllocOut==0 ); assert( scratchAllocOut==0 );
tempAllocOut = 1; scratchAllocOut = 1;
#endif #endif
if( sqlite3Config.bMemstat ){ if( sqlite3Config.bMemstat ){
sqlite3_mutex_enter(mem0.mutex); sqlite3_mutex_enter(mem0.mutex);
if( n>mem0.mxTempReq ) mem0.mxTempReq = n; if( n>mem0.mxScratchReq ) mem0.mxScratchReq = n;
p = sqlite3Config.m.xTempMalloc(n); p = sqlite3Config.m.xMalloc(n);
sqlite3_mutex_leave(mem0.mutex); sqlite3_mutex_leave(mem0.mutex);
}else{ }else{
p = sqlite3Config.m.xTempMalloc(n); p = sqlite3Config.m.xMalloc(n);
} }
return p; return p;
} }
void sqlite3TempFree(void *p){ void sqlite3ScratchFree(void *p){
if( p ){ if( p ){
#if SQLITE_THREADSAFE==0 && !defined(NDEBUG) #if SQLITE_THREADSAFE==0 && !defined(NDEBUG)
assert( tempAllocOut==1 ); assert( scratchAllocOut==1 );
tempAllocOut = 0; scratchAllocOut = 0;
#endif #endif
sqlite3Config.m.xTempFree(p); sqlite3Config.m.xFree(p);
} }
} }
/*
** Place holders for the page-cache memory allocator.
*/
void *sqlite3PageMalloc(int iSize){
return sqlite3Malloc(iSize);
}
void sqlite3PageFree(void *pOld){
sqlite3_free(pOld);
}
/* /*
** Return the size of a memory allocation previously obtained from ** Return the size of a memory allocation previously obtained from
** sqlite3Malloc() or sqlite3_malloc(). ** sqlite3Malloc() or sqlite3_malloc().

View File

@ -17,7 +17,7 @@
** This file contains implementations of the low-level memory allocation ** This file contains implementations of the low-level memory allocation
** routines specified in the sqlite3_mem_methods object. ** routines specified in the sqlite3_mem_methods object.
** **
** $Id: mem1.c,v 1.20 2008/06/15 02:51:48 drh Exp $ ** $Id: mem1.c,v 1.21 2008/06/17 15:12:01 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
@ -130,8 +130,6 @@ void sqlite3MemSetDefault(void){
sqlite3MemRealloc, sqlite3MemRealloc,
sqlite3MemSize, sqlite3MemSize,
sqlite3MemRoundup, sqlite3MemRoundup,
sqlite3MemMalloc,
sqlite3MemFree,
sqlite3MemInit, sqlite3MemInit,
sqlite3MemShutdown, sqlite3MemShutdown,
0 0

View File

@ -19,7 +19,7 @@
** This file contains implementations of the low-level memory allocation ** This file contains implementations of the low-level memory allocation
** routines specified in the sqlite3_mem_methods object. ** routines specified in the sqlite3_mem_methods object.
** **
** $Id: mem2.c,v 1.29 2008/06/15 02:51:48 drh Exp $ ** $Id: mem2.c,v 1.30 2008/06/17 15:12:01 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
@ -312,8 +312,6 @@ void sqlite3MemSetDefault(void){
sqlite3MemRealloc, sqlite3MemRealloc,
sqlite3MemSize, sqlite3MemSize,
sqlite3MemRoundup, sqlite3MemRoundup,
sqlite3MemMalloc,
sqlite3MemFree,
sqlite3MemInit, sqlite3MemInit,
sqlite3MemShutdown, sqlite3MemShutdown,
0 0

View File

@ -18,7 +18,7 @@
** file simultaneously, or one process from reading the database while ** file simultaneously, or one process from reading the database while
** another is writing. ** another is writing.
** **
** @(#) $Id: pager.c,v 1.457 2008/06/15 02:51:48 drh Exp $ ** @(#) $Id: pager.c,v 1.458 2008/06/17 15:12:01 drh Exp $
*/ */
#ifndef SQLITE_OMIT_DISKIO #ifndef SQLITE_OMIT_DISKIO
#include "sqliteInt.h" #include "sqliteInt.h"
@ -773,19 +773,20 @@ static int osUnlock(sqlite3_file *pFd, int eLock){
static int jrnlBufferSize(Pager *pPager){ static int jrnlBufferSize(Pager *pPager){
int dc; /* Device characteristics */ int dc; /* Device characteristics */
int nSector; /* Sector size */ int nSector; /* Sector size */
int nPage; /* Page size */ int szPage; /* Page size */
sqlite3_file *fd = pPager->fd; sqlite3_file *fd = pPager->fd;
if( fd->pMethods ){ if( fd->pMethods ){
dc = sqlite3OsDeviceCharacteristics(fd); dc = sqlite3OsDeviceCharacteristics(fd);
nSector = sqlite3OsSectorSize(fd); nSector = sqlite3OsSectorSize(fd);
nPage = pPager->pageSize; szPage = pPager->pageSize;
} }
assert(SQLITE_IOCAP_ATOMIC512==(512>>8)); assert(SQLITE_IOCAP_ATOMIC512==(512>>8));
assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8)); assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8));
if( !fd->pMethods || (dc&(SQLITE_IOCAP_ATOMIC|(nPage>>8))&&nSector<=nPage) ){ if( !fd->pMethods ||
(dc & (SQLITE_IOCAP_ATOMIC|(szPage>>8)) && nSector<=szPage) ){
return JOURNAL_HDR_SZ(pPager) + JOURNAL_PG_SZ(pPager); return JOURNAL_HDR_SZ(pPager) + JOURNAL_PG_SZ(pPager);
} }
return 0; return 0;
@ -1294,7 +1295,7 @@ static void pager_reset(Pager *pPager){
PAGER_INCR(sqlite3_pager_pgfree_count); PAGER_INCR(sqlite3_pager_pgfree_count);
pNext = pPg->pNextAll; pNext = pPg->pNextAll;
lruListRemove(pPg); lruListRemove(pPg);
sqlite3_free(pPg->pData); sqlite3PageFree(pPg->pData);
sqlite3_free(pPg); sqlite3_free(pPg);
} }
assert(pPager->lru.pFirst==0); assert(pPager->lru.pFirst==0);
@ -2180,7 +2181,7 @@ int sqlite3PagerOpen(
int useJournal = (flags & PAGER_OMIT_JOURNAL)==0; int useJournal = (flags & PAGER_OMIT_JOURNAL)==0;
int noReadlock = (flags & PAGER_NO_READLOCK)!=0; int noReadlock = (flags & PAGER_NO_READLOCK)!=0;
int journalFileSize = sqlite3JournalSize(pVfs); int journalFileSize = sqlite3JournalSize(pVfs);
int nDefaultPage = SQLITE_DEFAULT_PAGE_SIZE; int szPageDflt = SQLITE_DEFAULT_PAGE_SIZE;
char *zPathname = 0; char *zPathname = 0;
int nPathname = 0; int nPathname = 0;
@ -2259,8 +2260,8 @@ int sqlite3PagerOpen(
*/ */
if( rc==SQLITE_OK && !readOnly ){ if( rc==SQLITE_OK && !readOnly ){
int iSectorSize = sqlite3OsSectorSize(pPager->fd); int iSectorSize = sqlite3OsSectorSize(pPager->fd);
if( nDefaultPage<iSectorSize ){ if( szPageDflt<iSectorSize ){
nDefaultPage = iSectorSize; szPageDflt = iSectorSize;
} }
#ifdef SQLITE_ENABLE_ATOMIC_WRITE #ifdef SQLITE_ENABLE_ATOMIC_WRITE
{ {
@ -2269,13 +2270,13 @@ int sqlite3PagerOpen(
assert(SQLITE_IOCAP_ATOMIC512==(512>>8)); assert(SQLITE_IOCAP_ATOMIC512==(512>>8));
assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8)); assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8));
assert(SQLITE_MAX_DEFAULT_PAGE_SIZE<=65536); assert(SQLITE_MAX_DEFAULT_PAGE_SIZE<=65536);
for(ii=nDefaultPage; ii<=SQLITE_MAX_DEFAULT_PAGE_SIZE; ii=ii*2){ for(ii=szPageDflt; ii<=SQLITE_MAX_DEFAULT_PAGE_SIZE; ii=ii*2){
if( iDc&(SQLITE_IOCAP_ATOMIC|(ii>>8)) ) nDefaultPage = ii; if( iDc&(SQLITE_IOCAP_ATOMIC|(ii>>8)) ) szPageDflt = ii;
} }
} }
#endif #endif
if( nDefaultPage>SQLITE_MAX_DEFAULT_PAGE_SIZE ){ if( szPageDflt>SQLITE_MAX_DEFAULT_PAGE_SIZE ){
nDefaultPage = SQLITE_MAX_DEFAULT_PAGE_SIZE; szPageDflt = SQLITE_MAX_DEFAULT_PAGE_SIZE;
} }
} }
} }
@ -2289,7 +2290,7 @@ int sqlite3PagerOpen(
} }
if( pPager && rc==SQLITE_OK ){ if( pPager && rc==SQLITE_OK ){
pPager->pTmpSpace = sqlite3MallocZero(nDefaultPage); pPager->pTmpSpace = sqlite3PageMalloc(szPageDflt);
} }
/* If an error occured in either of the blocks above. /* If an error occured in either of the blocks above.
@ -2326,7 +2327,7 @@ int sqlite3PagerOpen(
/* pPager->stmtInUse = 0; */ /* pPager->stmtInUse = 0; */
/* pPager->nRef = 0; */ /* pPager->nRef = 0; */
pPager->dbSize = memDb-1; pPager->dbSize = memDb-1;
pPager->pageSize = nDefaultPage; pPager->pageSize = szPageDflt;
/* pPager->stmtSize = 0; */ /* pPager->stmtSize = 0; */
/* pPager->stmtJSize = 0; */ /* pPager->stmtJSize = 0; */
/* pPager->nPage = 0; */ /* pPager->nPage = 0; */
@ -2421,7 +2422,7 @@ int sqlite3PagerSetPagesize(Pager *pPager, u16 *pPageSize){
if( pageSize && pageSize!=pPager->pageSize if( pageSize && pageSize!=pPager->pageSize
&& !pPager->memDb && pPager->nRef==0 && !pPager->memDb && pPager->nRef==0
){ ){
char *pNew = (char *)sqlite3Malloc(pageSize); char *pNew = (char *)sqlite3PageMalloc(pageSize);
if( !pNew ){ if( !pNew ){
rc = SQLITE_NOMEM; rc = SQLITE_NOMEM;
}else{ }else{
@ -2429,7 +2430,7 @@ int sqlite3PagerSetPagesize(Pager *pPager, u16 *pPageSize){
pager_reset(pPager); pager_reset(pPager);
pPager->pageSize = pageSize; pPager->pageSize = pageSize;
setSectorSize(pPager); setSectorSize(pPager);
sqlite3_free(pPager->pTmpSpace); sqlite3PageFree(pPager->pTmpSpace);
pPager->pTmpSpace = pNew; pPager->pTmpSpace = pNew;
pagerLeave(pPager); pagerLeave(pPager);
} }
@ -2567,8 +2568,8 @@ int sqlite3PagerPagecount(Pager *pPager, int *pnPage){
** Clear a PgHistory block ** Clear a PgHistory block
*/ */
static void clearHistory(PgHistory *pHist){ static void clearHistory(PgHistory *pHist){
sqlite3_free(pHist->pOrig); sqlite3PageFree(pHist->pOrig);
sqlite3_free(pHist->pStmt); sqlite3PageFree(pHist->pStmt);
pHist->pOrig = 0; pHist->pOrig = 0;
pHist->pStmt = 0; pHist->pStmt = 0;
} }
@ -2653,7 +2654,7 @@ static void pager_truncate_cache(Pager *pPager){
PAGER_INCR(sqlite3_pager_pgfree_count); PAGER_INCR(sqlite3_pager_pgfree_count);
unlinkPage(pPg); unlinkPage(pPg);
makeClean(pPg); makeClean(pPg);
sqlite3_free(pPg->pData); sqlite3PageFree(pPg->pData);
sqlite3_free(pPg); sqlite3_free(pPg);
pPager->nPage--; pPager->nPage--;
} }
@ -2790,7 +2791,7 @@ int sqlite3PagerClose(Pager *pPager){
*/ */
sqlite3_free(pPager->aHash); sqlite3_free(pPager->aHash);
sqlite3_free(pPager->pTmpSpace); sqlite3PageFree(pPager->pTmpSpace);
sqlite3_free(pPager); sqlite3_free(pPager);
return SQLITE_OK; return SQLITE_OK;
} }
@ -3347,7 +3348,7 @@ int sqlite3PagerReleaseMemory(int nReq){
); );
IOTRACE(("PGFREE %p %d *\n", pPager, pPg->pgno)); IOTRACE(("PGFREE %p %d *\n", pPager, pPg->pgno));
PAGER_INCR(sqlite3_pager_pgfree_count); PAGER_INCR(sqlite3_pager_pgfree_count);
sqlite3_free(pPg->pData); sqlite3PageFree(pPg->pData);
sqlite3_free(pPg); sqlite3_free(pPg);
pPager->nPage--; pPager->nPage--;
}else{ }else{
@ -3649,7 +3650,7 @@ static int pagerAllocatePage(Pager *pPager, PgHdr **ppPg){
+ MEMDB*sizeof(PgHistory); + MEMDB*sizeof(PgHistory);
pPg = sqlite3Malloc( nByteHdr ); pPg = sqlite3Malloc( nByteHdr );
if( pPg ){ if( pPg ){
pData = sqlite3Malloc( pPager->pageSize ); pData = sqlite3PageMalloc( pPager->pageSize );
if( pData==0 ){ if( pData==0 ){
sqlite3_free(pPg); sqlite3_free(pPg);
pPg = 0; pPg = 0;
@ -4223,7 +4224,7 @@ static int pager_write(PgHdr *pPg){
PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager); PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager);
PAGERTRACE3("JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno); PAGERTRACE3("JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno);
assert( pHist->pOrig==0 ); assert( pHist->pOrig==0 );
pHist->pOrig = sqlite3Malloc( pPager->pageSize ); pHist->pOrig = sqlite3PageMalloc( pPager->pageSize );
if( !pHist->pOrig ){ if( !pHist->pOrig ){
return SQLITE_NOMEM; return SQLITE_NOMEM;
} }
@ -4293,7 +4294,7 @@ static int pager_write(PgHdr *pPg){
if( MEMDB ){ if( MEMDB ){
PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager); PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager);
assert( pHist->pStmt==0 ); assert( pHist->pStmt==0 );
pHist->pStmt = sqlite3Malloc( pPager->pageSize ); pHist->pStmt = sqlite3PageMalloc( pPager->pageSize );
if( pHist->pStmt ){ if( pHist->pStmt ){
memcpy(pHist->pStmt, PGHDR_TO_DATA(pPg), pPager->pageSize); memcpy(pHist->pStmt, PGHDR_TO_DATA(pPg), pPager->pageSize);
} }
@ -5035,7 +5036,7 @@ int sqlite3PagerStmtCommit(Pager *pPager){
assert( pHist->inStmt ); assert( pHist->inStmt );
pHist->inStmt = 0; pHist->inStmt = 0;
pHist->pPrevStmt = pHist->pNextStmt = 0; pHist->pPrevStmt = pHist->pNextStmt = 0;
sqlite3_free(pHist->pStmt); sqlite3PageFree(pHist->pStmt);
pHist->pStmt = 0; pHist->pStmt = 0;
} }
} }
@ -5063,7 +5064,7 @@ int sqlite3PagerStmtRollback(Pager *pPager){
pHist = PGHDR_TO_HIST(pPg, pPager); pHist = PGHDR_TO_HIST(pPg, pPager);
if( pHist->pStmt ){ if( pHist->pStmt ){
memcpy(PGHDR_TO_DATA(pPg), pHist->pStmt, pPager->pageSize); memcpy(PGHDR_TO_DATA(pPg), pHist->pStmt, pPager->pageSize);
sqlite3_free(pHist->pStmt); sqlite3PageFree(pHist->pStmt);
pHist->pStmt = 0; pHist->pStmt = 0;
} }
} }

View File

@ -30,7 +30,7 @@
** the version number) and changes its name to "sqlite3.h" as ** the version number) and changes its name to "sqlite3.h" as
** part of the build process. ** part of the build process.
** **
** @(#) $Id: sqlite.h.in,v 1.328 2008/06/15 02:51:48 drh Exp $ ** @(#) $Id: sqlite.h.in,v 1.329 2008/06/17 15:12:01 drh Exp $
*/ */
#ifndef _SQLITE3_H_ #ifndef _SQLITE3_H_
#define _SQLITE3_H_ #define _SQLITE3_H_
@ -975,15 +975,7 @@ int sqlite3_config(int, ...);
** The xRoundup method returns what would be the allocated size of ** The xRoundup method returns what would be the allocated size of
** a memory allocation given a particular requested size. Most memory ** a memory allocation given a particular requested size. Most memory
** allocators round up memory allocations at least to the next multiple ** allocators round up memory allocations at least to the next multiple
** of 8. Some round up to a larger multiple or to a power of 2. ** of 8. Some allocators round up to a larger multiple or to a power of 2.
**
** The xTempMalloc and xTempFree methods are used to allocate a large
** chunk of temporary-use memory whose lifetime is a single procedure
** call. These routines may be the same as xMalloc and xFree, if desired,
** though some specialized applications may benefit from using a different
** allocation algorithm in this case.
** SQLite will never request more than one outstanding memory allocation
** per thread using xTempMalloc.
** **
** The xInit method initializes the memory allocator. (For example, ** The xInit method initializes the memory allocator. (For example,
** it might allocate any require mutexes or initialize internal data ** it might allocate any require mutexes or initialize internal data
@ -999,8 +991,6 @@ struct sqlite3_mem_methods {
void *(*xRealloc)(void*,int); /* Resize an allocation */ void *(*xRealloc)(void*,int); /* Resize an allocation */
int (*xSize)(void*); /* Return the size of an allocation */ int (*xSize)(void*); /* Return the size of an allocation */
int (*xRoundup)(int); /* Round up request size to allocation size */ int (*xRoundup)(int); /* Round up request size to allocation size */
void *(*xTempMalloc)(int); /* Allocate temporary space */
void (*xTempFree)(void*); /* Free space from xTempMalloc */
int (*xInit)(void*); /* Initialize the memory allocator */ int (*xInit)(void*); /* Initialize the memory allocator */
void (*xShutdown)(void*); /* Deinitialize the memory allocator */ void (*xShutdown)(void*); /* Deinitialize the memory allocator */
void *pAppData; /* Argument to xInit() and xShutdown() */ void *pAppData; /* Argument to xInit() and xShutdown() */

View File

@ -11,7 +11,7 @@
************************************************************************* *************************************************************************
** Internal interface definitions for SQLite. ** Internal interface definitions for SQLite.
** **
** @(#) $Id: sqliteInt.h,v 1.710 2008/06/15 02:51:48 drh Exp $ ** @(#) $Id: sqliteInt.h,v 1.711 2008/06/17 15:12:01 drh Exp $
*/ */
#ifndef _SQLITEINT_H_ #ifndef _SQLITEINT_H_
#define _SQLITEINT_H_ #define _SQLITEINT_H_
@ -1791,8 +1791,10 @@ void *sqlite3Realloc(void*, int);
void *sqlite3DbReallocOrFree(sqlite3 *, void *, int); void *sqlite3DbReallocOrFree(sqlite3 *, void *, int);
void *sqlite3DbRealloc(sqlite3 *, void *, int); void *sqlite3DbRealloc(sqlite3 *, void *, int);
int sqlite3MallocSize(void *); int sqlite3MallocSize(void *);
void *sqlite3TempMalloc(int); void *sqlite3ScratchMalloc(int);
void sqlite3TempFree(void*); void sqlite3ScratchFree(void*);
void *sqlite3PageMalloc(int);
void sqlite3PageFree(void*);
void sqlite3MemSetDefault(void); void sqlite3MemSetDefault(void);
int sqlite3IsNaN(double); int sqlite3IsNaN(double);