Browse Source

db release 1.85

OPENBSD_2_0
deraadt 28 years ago
parent
commit
ae3ae2b568
1 changed files with 38 additions and 74 deletions
  1. +38
    -74
      src/include/mpool.h

+ 38
- 74
src/include/mpool.h View File

@ -1,7 +1,7 @@
/* $NetBSD: mpool.h,v 1.6 1994/10/26 00:56:07 cgd Exp $ */
/* $NetBSD: mpool.h,v 1.7 1996/05/03 21:13:41 cgd Exp $ */
/*- /*-
* Copyright (c) 1991, 1993
* Copyright (c) 1991, 1993, 1994
* The Regents of the University of California. All rights reserved. * The Regents of the University of California. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -32,98 +32,62 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)mpool.h 8.1 (Berkeley) 6/2/93
* @(#)mpool.h 8.2 (Berkeley) 7/14/94
*/ */
#include <sys/queue.h>
/* /*
* The memory pool scheme is a simple one. Each in memory page is referenced
* by a bucket which is threaded in three ways. All active pages are threaded
* on a hash chain (hashed by the page number) and an lru chain. Inactive
* pages are threaded on a free chain. Each reference to a memory pool is
* handed an MPOOL which is the opaque cookie passed to all of the memory
* routines.
* The memory pool scheme is a simple one. Each in-memory page is referenced
* by a bucket which is threaded in up to two of three ways. All active pages
* are threaded on a hash chain (hashed by page number) and an lru chain.
* Inactive pages are threaded on a free chain. Each reference to a memory
* pool is handed an opaque MPOOL cookie which stores all of this information.
*/ */
#define HASHSIZE 128 #define HASHSIZE 128
#define HASHKEY(pgno) ((pgno - 1) % HASHSIZE) #define HASHKEY(pgno) ((pgno - 1) % HASHSIZE)
/* The BKT structures are the elements of the lists. */
typedef struct BKT {
struct BKT *hnext; /* next hash bucket */
struct BKT *hprev; /* previous hash bucket */
struct BKT *cnext; /* next free/lru bucket */
struct BKT *cprev; /* previous free/lru bucket */
void *page; /* page */
pgno_t pgno; /* page number */
/* The BKT structures are the elements of the queues. */
typedef struct _bkt {
CIRCLEQ_ENTRY(_bkt) hq; /* hash queue */
CIRCLEQ_ENTRY(_bkt) q; /* lru queue */
void *page; /* page */
pgno_t pgno; /* page number */
#define MPOOL_DIRTY 0x01 /* page needs to be written */ #define MPOOL_DIRTY 0x01 /* page needs to be written */
#define MPOOL_PINNED 0x02 /* page is pinned into memory */ #define MPOOL_PINNED 0x02 /* page is pinned into memory */
unsigned long flags; /* flags */
u_int8_t flags; /* flags */
} BKT; } BKT;
/* The BKTHDR structures are the heads of the lists. */
typedef struct BKTHDR {
struct BKT *hnext; /* next hash bucket */
struct BKT *hprev; /* previous hash bucket */
struct BKT *cnext; /* next free/lru bucket */
struct BKT *cprev; /* previous free/lru bucket */
} BKTHDR;
typedef struct MPOOL { typedef struct MPOOL {
BKTHDR free; /* The free list. */
BKTHDR lru; /* The LRU list. */
BKTHDR hashtable[HASHSIZE]; /* Hashed list by page number. */
pgno_t curcache; /* Current number of cached pages. */
pgno_t maxcache; /* Max number of cached pages. */
pgno_t npages; /* Number of pages in the file. */
u_long pagesize; /* File page size. */
int fd; /* File descriptor. */
/* Page in conversion routine. */
CIRCLEQ_HEAD(_lqh, _bkt) lqh; /* lru queue head */
/* hash queue array */
CIRCLEQ_HEAD(_hqh, _bkt) hqh[HASHSIZE];
pgno_t curcache; /* current number of cached pages */
pgno_t maxcache; /* max number of cached pages */
pgno_t npages; /* number of pages in the file */
u_long pagesize; /* file page size */
int fd; /* file descriptor */
/* page in conversion routine */
void (*pgin) __P((void *, pgno_t, void *)); void (*pgin) __P((void *, pgno_t, void *));
/* Page out conversion routine. */
/* page out conversion routine */
void (*pgout) __P((void *, pgno_t, void *)); void (*pgout) __P((void *, pgno_t, void *));
void *pgcookie; /* Cookie for page in/out routines. */
void *pgcookie; /* cookie for page in/out routines */
#ifdef STATISTICS #ifdef STATISTICS
unsigned long cachehit;
unsigned long cachemiss;
unsigned long pagealloc;
unsigned long pageflush;
unsigned long pageget;
unsigned long pagenew;
unsigned long pageput;
unsigned long pageread;
unsigned long pagewrite;
u_long cachehit;
u_long cachemiss;
u_long pagealloc;
u_long pageflush;
u_long pageget;
u_long pagenew;
u_long pageput;
u_long pageread;
u_long pagewrite;
#endif #endif
} MPOOL; } MPOOL;
#ifdef __MPOOLINTERFACE_PRIVATE
/* Macros to insert/delete into/from hash chain. */
#define rmhash(bp) { \
(bp)->hprev->hnext = (bp)->hnext; \
(bp)->hnext->hprev = (bp)->hprev; \
}
#define inshash(bp, pg) { \
hp = &mp->hashtable[HASHKEY(pg)]; \
(bp)->hnext = hp->hnext; \
(bp)->hprev = (struct BKT *)hp; \
hp->hnext->hprev = (bp); \
hp->hnext = (bp); \
}
/* Macros to insert/delete into/from lru and free chains. */
#define rmchain(bp) { \
(bp)->cprev->cnext = (bp)->cnext; \
(bp)->cnext->cprev = (bp)->cprev; \
}
#define inschain(bp, dp) { \
(bp)->cnext = (dp)->cnext; \
(bp)->cprev = (struct BKT *)(dp); \
(dp)->cnext->cprev = (bp); \
(dp)->cnext = (bp); \
}
#endif
__BEGIN_DECLS __BEGIN_DECLS
MPOOL *mpool_open __P((DBT *, int, pgno_t, pgno_t));
MPOOL *mpool_open __P((void *, int, pgno_t, pgno_t));
void mpool_filter __P((MPOOL *, void (*)(void *, pgno_t, void *), void mpool_filter __P((MPOOL *, void (*)(void *, pgno_t, void *),
void (*)(void *, pgno_t, void *), void *)); void (*)(void *, pgno_t, void *), void *));
void *mpool_new __P((MPOOL *, pgno_t *)); void *mpool_new __P((MPOOL *, pgno_t *));


Loading…
Cancel
Save