blob: 33735d2cbb2dc159ca988e91f90b8658f91e5394 [file] [log] [blame]
danielk19778c0a7912008-08-20 14:49:23 +00001/*
2** 2008 August 05
3**
4** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
6**
7** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
10**
11*************************************************************************
12** This header file defines the interface that the sqlite page cache
13** subsystem.
danielk19778c0a7912008-08-20 14:49:23 +000014*/
15
16#ifndef _PCACHE_H_
17
18typedef struct PgHdr PgHdr;
19typedef struct PCache PCache;
20
21/*
22** Every page in the cache is controlled by an instance of the following
23** structure.
24*/
25struct PgHdr {
danielk19778c0a7912008-08-20 14:49:23 +000026 void *pData; /* Content of this page */
27 void *pExtra; /* Extra content */
28 PgHdr *pDirty; /* Transient list of dirty pages */
29 Pgno pgno; /* Page number for this page */
drha85f7e32008-08-28 02:26:07 +000030 Pager *pPager; /* The pager this page is part of */
danielk19778c0a7912008-08-20 14:49:23 +000031#ifdef SQLITE_CHECK_PAGES
drha85f7e32008-08-28 02:26:07 +000032 u32 pageHash; /* Hash of page content */
danielk19778c0a7912008-08-20 14:49:23 +000033#endif
drha85f7e32008-08-28 02:26:07 +000034 u16 flags; /* PGHDR flags defined below */
danielk1977bc2ca9e2008-11-13 14:28:28 +000035
drha85f7e32008-08-28 02:26:07 +000036 /**********************************************************************
37 ** Elements above are public. All that follows is private to pcache.c
38 ** and should not be accessed by other modules.
39 */
40 i16 nRef; /* Number of users of this page */
danielk19778c0a7912008-08-20 14:49:23 +000041 PCache *pCache; /* Cache that owns this page */
danielk1977b3175382008-10-17 18:51:52 +000042
danielk1977bc2ca9e2008-11-13 14:28:28 +000043 PgHdr *pDirtyNext; /* Next element in list of dirty pages */
44 PgHdr *pDirtyPrev; /* Previous element in list of dirty pages */
danielk19778c0a7912008-08-20 14:49:23 +000045};
46
47/* Bit values for PgHdr.flags */
drhb3df2e12008-09-17 20:06:26 +000048#define PGHDR_DIRTY 0x002 /* Page has changed */
49#define PGHDR_NEED_SYNC 0x004 /* Fsync the rollback journal before
50 ** writing this page to the database */
51#define PGHDR_NEED_READ 0x008 /* Content is unread */
52#define PGHDR_REUSE_UNLIKELY 0x010 /* A hint that reuse is unlikely */
53#define PGHDR_DONT_WRITE 0x020 /* Do not write content to disk */
danielk19778c0a7912008-08-20 14:49:23 +000054
55/* Initialize and shutdown the page cache subsystem */
56int sqlite3PcacheInitialize(void);
57void sqlite3PcacheShutdown(void);
58
59/* Page cache buffer management:
60** These routines implement SQLITE_CONFIG_PAGECACHE.
61*/
62void sqlite3PCacheBufferSetup(void *, int sz, int n);
danielk19778c0a7912008-08-20 14:49:23 +000063
64/* Create a new pager cache.
65** Under memory stress, invoke xStress to try to make pages clean.
66** Only clean and unpinned pages can be reclaimed.
67*/
68void sqlite3PcacheOpen(
danielk1977a858aa22008-08-22 16:22:17 +000069 int szPage, /* Size of every page */
70 int szExtra, /* Extra space associated with each page */
71 int bPurgeable, /* True if pages are on backing store */
danielk1977a858aa22008-08-22 16:22:17 +000072 int (*xStress)(void*, PgHdr*), /* Call to try to make pages clean */
73 void *pStress, /* Argument to xStress */
74 PCache *pToInit /* Preallocated space for the PCache */
danielk19778c0a7912008-08-20 14:49:23 +000075);
76
77/* Modify the page-size after the cache has been created. */
78void sqlite3PcacheSetPageSize(PCache *, int);
79
80/* Return the size in bytes of a PCache object. Used to preallocate
81** storage space.
82*/
83int sqlite3PcacheSize(void);
84
85/* One release per successful fetch. Page is pinned until released.
86** Reference counted.
87*/
88int sqlite3PcacheFetch(PCache*, Pgno, int createFlag, PgHdr**);
89void sqlite3PcacheRelease(PgHdr*);
90
91void sqlite3PcacheDrop(PgHdr*); /* Remove page from cache */
92void sqlite3PcacheMakeDirty(PgHdr*); /* Make sure page is marked dirty */
93void sqlite3PcacheMakeClean(PgHdr*); /* Mark a single page as clean */
94void sqlite3PcacheCleanAll(PCache*); /* Mark all dirty list pages as clean */
95
96/* Change a page number. Used by incr-vacuum. */
97void sqlite3PcacheMove(PgHdr*, Pgno);
98
danielk19778c0a7912008-08-20 14:49:23 +000099/* Remove all pages with pgno>x. Reset the cache if x==0 */
100void sqlite3PcacheTruncate(PCache*, Pgno x);
101
danielk19778c0a7912008-08-20 14:49:23 +0000102/* Get a list of all dirty pages in the cache, sorted by page number */
103PgHdr *sqlite3PcacheDirtyList(PCache*);
104
danielk19778c0a7912008-08-20 14:49:23 +0000105/* Reset and close the cache object */
106void sqlite3PcacheClose(PCache*);
107
drhb3df2e12008-09-17 20:06:26 +0000108/* Clear flags from pages of the page cache */
danielk1977bc2ca9e2008-11-13 14:28:28 +0000109void sqlite3PcacheClearSyncFlags(PCache *);
danielk19778c0a7912008-08-20 14:49:23 +0000110
danielk19778c0a7912008-08-20 14:49:23 +0000111/* Discard the contents of the cache */
danielk1977bea2a942009-01-20 17:06:27 +0000112void sqlite3PcacheClear(PCache*);
danielk19778c0a7912008-08-20 14:49:23 +0000113
114/* Return the total number of outstanding page references */
115int sqlite3PcacheRefCount(PCache*);
116
117/* Increment the reference count of an existing page */
118void sqlite3PcacheRef(PgHdr*);
119
danielk197771d5d2c2008-09-29 11:49:47 +0000120int sqlite3PcachePageRefcount(PgHdr*);
121
danielk19778c0a7912008-08-20 14:49:23 +0000122/* Return the total number of pages stored in the cache */
123int sqlite3PcachePagecount(PCache*);
124
danielk1977750e87d2009-07-25 11:46:48 +0000125#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG)
danielk1977bc2ca9e2008-11-13 14:28:28 +0000126/* Iterate through all dirty pages currently stored in the cache. This
127** interface is only available if SQLITE_CHECK_PAGES is defined when the
128** library is built.
danielk19778c0a7912008-08-20 14:49:23 +0000129*/
danielk1977bc2ca9e2008-11-13 14:28:28 +0000130void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *));
drh419fcf62008-10-11 17:42:28 +0000131#endif
danielk19778c0a7912008-08-20 14:49:23 +0000132
danielk1977d491e1b2008-08-26 18:05:48 +0000133/* Set and get the suggested cache-size for the specified pager-cache.
danielk19778c0a7912008-08-20 14:49:23 +0000134**
135** If no global maximum is configured, then the system attempts to limit
136** the total number of pages cached by purgeable pager-caches to the sum
137** of the suggested cache-sizes.
138*/
danielk19778c0a7912008-08-20 14:49:23 +0000139void sqlite3PcacheSetCachesize(PCache *, int);
danielk1977f3d3c272008-11-19 16:52:44 +0000140#ifdef SQLITE_TEST
141int sqlite3PcacheGetCachesize(PCache *);
142#endif
danielk19778c0a7912008-08-20 14:49:23 +0000143
drh419fcf62008-10-11 17:42:28 +0000144#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
danielk1977d491e1b2008-08-26 18:05:48 +0000145/* Try to return memory used by the pcache module to the main memory heap */
danielk197767e3da72008-08-21 12:19:44 +0000146int sqlite3PcacheReleaseMemory(int);
drh419fcf62008-10-11 17:42:28 +0000147#endif
danielk197767e3da72008-08-21 12:19:44 +0000148
drh419fcf62008-10-11 17:42:28 +0000149#ifdef SQLITE_TEST
danielk1977062d4cb2008-08-29 09:10:02 +0000150void sqlite3PcacheStats(int*,int*,int*,int*);
drh419fcf62008-10-11 17:42:28 +0000151#endif
danielk1977062d4cb2008-08-29 09:10:02 +0000152
danielk1977bc2ca9e2008-11-13 14:28:28 +0000153void sqlite3PCacheSetDefault(void);
154
danielk19778c0a7912008-08-20 14:49:23 +0000155#endif /* _PCACHE_H_ */