mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Automatically deallocate thread-specific data when it is no longer
being used. Ticket #1601. Also implemented the suggestion of ticket #1603. Memory management is now off by default at compile-time. The sqlite3_enable_memory_management() API has been removed. (CVS 2919) FossilOrigin-Name: 5d9c6aa964305c3f36741ff0058da5b5f3ce0d24
This commit is contained in:
29
src/pager.c
29
src/pager.c
@@ -18,7 +18,7 @@
|
||||
** file simultaneously, or one process from reading the database while
|
||||
** another is writing.
|
||||
**
|
||||
** @(#) $Id: pager.c,v 1.235 2006/01/10 20:32:32 drh Exp $
|
||||
** @(#) $Id: pager.c,v 1.236 2006/01/11 21:41:22 drh Exp $
|
||||
*/
|
||||
#ifndef SQLITE_OMIT_DISKIO
|
||||
#include "sqliteInt.h"
|
||||
@@ -284,7 +284,7 @@ struct Pager {
|
||||
void (*xCodec)(void*,void*,Pgno,int); /* Routine for en/decoding data */
|
||||
void *pCodecArg; /* First argument to xCodec() */
|
||||
PgHdr *aHash[N_PG_HASH]; /* Hash table to map page number to PgHdr */
|
||||
#ifndef SQLITE_OMIT_MEMORY_MANAGEMENT
|
||||
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
|
||||
Pager *pNext; /* Linked list of pagers in this thread */
|
||||
#endif
|
||||
};
|
||||
@@ -1618,8 +1618,8 @@ int sqlite3pager_open(
|
||||
int useJournal = (flags & PAGER_OMIT_JOURNAL)==0;
|
||||
int noReadlock = (flags & PAGER_NO_READLOCK)!=0;
|
||||
char zTemp[SQLITE_TEMPNAME_SIZE];
|
||||
#ifndef SQLITE_OMIT_MEMORY_MANAGEMENT
|
||||
ThreadData *pTsd = sqlite3ThreadData();
|
||||
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
|
||||
const ThreadData *pTsdro = sqlite3ThreadDataReadOnly();
|
||||
#endif
|
||||
|
||||
/* If malloc() has already failed return SQLITE_NOMEM. Before even
|
||||
@@ -1627,7 +1627,7 @@ int sqlite3pager_open(
|
||||
** structure was never allocated.
|
||||
*/
|
||||
*ppPager = 0;
|
||||
if( sqlite3ThreadData()->mallocFailed ){
|
||||
if( sqlite3ThreadDataReadOnly()->mallocFailed ){
|
||||
return SQLITE_NOMEM;
|
||||
}
|
||||
memset(&fd, 0, sizeof(fd));
|
||||
@@ -1720,8 +1720,9 @@ int sqlite3pager_open(
|
||||
pPager->pBusyHandler = 0;
|
||||
memset(pPager->aHash, 0, sizeof(pPager->aHash));
|
||||
*ppPager = pPager;
|
||||
#ifndef SQLITE_OMIT_MEMORY_MANAGEMENT
|
||||
if( pTsd->useMemoryManagement ){
|
||||
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
|
||||
if( pTsdro->useMemoryManagement ){
|
||||
ThreadData *pTsd = sqlite3ThreadData();
|
||||
pPager->pNext = pTsd->pPager;
|
||||
pTsd->pPager = pPager;
|
||||
}
|
||||
@@ -2027,8 +2028,8 @@ int sqlite3pager_truncate(Pager *pPager, Pgno nPage){
|
||||
*/
|
||||
int sqlite3pager_close(Pager *pPager){
|
||||
PgHdr *pPg, *pNext;
|
||||
#ifndef SQLITE_OMIT_MEMORY_MANAGEMENT
|
||||
ThreadData *pTsd = sqlite3ThreadData();
|
||||
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
|
||||
const ThreadData *pTsd = sqlite3ThreadDataReadOnly();
|
||||
#endif
|
||||
|
||||
switch( pPager->state ){
|
||||
@@ -2087,7 +2088,7 @@ int sqlite3pager_close(Pager *pPager){
|
||||
** }
|
||||
*/
|
||||
|
||||
#ifndef SQLITE_OMIT_MEMORY_MANAGEMENT
|
||||
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
|
||||
/* Remove the pager from the linked list of pagers starting at
|
||||
** ThreadData.pPager if memory-management is enabled.
|
||||
*/
|
||||
@@ -2456,9 +2457,9 @@ static int pager_recycle(Pager *pPager, int syncOk, PgHdr **ppPg){
|
||||
** free as much memory as possible. The return value is the total number
|
||||
** of bytes of memory released.
|
||||
*/
|
||||
#ifndef SQLITE_OMIT_MEMORY_MANAGEMENT
|
||||
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
|
||||
int sqlite3pager_release_memory(int nReq){
|
||||
ThreadData *pTsd = sqlite3ThreadData();
|
||||
const ThreadData *pTsdro = sqlite3ThreadDataReadOnly();
|
||||
Pager *p;
|
||||
int nReleased = 0;
|
||||
int i;
|
||||
@@ -2481,7 +2482,7 @@ int sqlite3pager_release_memory(int nReq){
|
||||
for(i=0; i<=1; i++){
|
||||
|
||||
/* Loop through all the SQLite pagers opened by the current thread. */
|
||||
for(p=pTsd->pPager; p && (nReq<0 || nReleased<nReq); p=p->pNext){
|
||||
for(p=pTsdro->pPager; p && (nReq<0 || nReleased<nReq); p=p->pNext){
|
||||
PgHdr *pPg;
|
||||
int rc;
|
||||
|
||||
@@ -2527,7 +2528,7 @@ int sqlite3pager_release_memory(int nReq){
|
||||
|
||||
return nReleased;
|
||||
}
|
||||
#endif /* SQLITE_OMIT_MEMORY_MANAGEMENT */
|
||||
#endif /* SQLITE_ENABLE_MEMORY_MANAGEMENT */
|
||||
|
||||
/*
|
||||
** Acquire a page.
|
||||
|
Reference in New Issue
Block a user