[BACK]Return to mpool.h CVS log [TXT][DIR] Up to [local] / src / include

Diff for /src/include/Attic/mpool.h between version 1.1 and 1.2

version 1.1, 1995/10/18 08:41:13 version 1.2, 1996/05/07 09:02:18
Line 1 
Line 1 
 /*      $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
Line 32 
Line 32 
  * 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   * 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   * by a bucket which is threaded in up to two of three ways.  All active pages
  * on a hash chain (hashed by the page number) and an lru chain.  Inactive   * are threaded on a hash chain (hashed by page number) and an lru chain.
  * pages are threaded on a free chain.  Each reference to a memory pool is   * Inactive pages are threaded on a free chain.  Each reference to a memory
  * handed an MPOOL which is the opaque cookie passed to all of the memory   * pool is handed an opaque MPOOL cookie which stores all of this information.
  * routines.  
  */   */
 #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. */  /* The BKT structures are the elements of the queues. */
 typedef struct BKT {  typedef struct _bkt {
         struct BKT      *hnext;         /* next hash bucket */          CIRCLEQ_ENTRY(_bkt) hq;         /* hash queue */
         struct BKT      *hprev;         /* previous hash bucket */          CIRCLEQ_ENTRY(_bkt) q;          /* lru queue */
         struct BKT      *cnext;         /* next free/lru bucket */          void    *page;                  /* page */
         struct BKT      *cprev;         /* previous free/lru bucket */          pgno_t   pgno;                  /* page number */
         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. */          CIRCLEQ_HEAD(_lqh, _bkt) lqh;   /* lru queue head */
         BKTHDR  lru;                    /* The LRU list. */                                          /* hash queue array */
         BKTHDR  hashtable[HASHSIZE];    /* Hashed list by page number. */          CIRCLEQ_HEAD(_hqh, _bkt) hqh[HASHSIZE];
         pgno_t  curcache;               /* Current number of cached pages. */          pgno_t  curcache;               /* current number of cached pages */
         pgno_t  maxcache;               /* Max number of cached pages. */          pgno_t  maxcache;               /* max number of cached pages */
         pgno_t  npages;                 /* Number of pages in the file. */          pgno_t  npages;                 /* number of pages in the file */
         u_long  pagesize;               /* File page size. */          u_long  pagesize;               /* file page size */
         int     fd;                     /* File descriptor. */          int     fd;                     /* file descriptor */
                                         /* Page in conversion routine. */                                          /* 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;          u_long  cachehit;
         unsigned long   cachemiss;          u_long  cachemiss;
         unsigned long   pagealloc;          u_long  pagealloc;
         unsigned long   pageflush;          u_long  pageflush;
         unsigned long   pageget;          u_long  pageget;
         unsigned long   pagenew;          u_long  pagenew;
         unsigned long   pageput;          u_long  pageput;
         unsigned long   pageread;          u_long  pageread;
         unsigned long   pagewrite;          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 *));

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2