|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /*- ! 23: * Copyright (c) 1991, 1993 ! 24: * The Regents of the University of California. All rights reserved. ! 25: * ! 26: * Redistribution and use in source and binary forms, with or without ! 27: * modification, are permitted provided that the following conditions ! 28: * are met: ! 29: * 1. Redistributions of source code must retain the above copyright ! 30: * notice, this list of conditions and the following disclaimer. ! 31: * 2. Redistributions in binary form must reproduce the above copyright ! 32: * notice, this list of conditions and the following disclaimer in the ! 33: * documentation and/or other materials provided with the distribution. ! 34: * 3. All advertising materials mentioning features or use of this software ! 35: * must display the following acknowledgement: ! 36: * This product includes software developed by the University of ! 37: * California, Berkeley and its contributors. ! 38: * 4. Neither the name of the University nor the names of its contributors ! 39: * may be used to endorse or promote products derived from this software ! 40: * without specific prior written permission. ! 41: * ! 42: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 43: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 44: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 45: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 46: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 47: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 48: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 49: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 50: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 51: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 52: * SUCH DAMAGE. ! 53: * ! 54: * @(#)mpool.h 8.1 (Berkeley) 6/2/93 ! 55: */ ! 56: ! 57: /* ! 58: * The memory pool scheme is a simple one. Each in memory page is referenced ! 59: * by a bucket which is threaded in three ways. All active pages are threaded ! 60: * on a hash chain (hashed by the page number) and an lru chain. Inactive ! 61: * pages are threaded on a free chain. Each reference to a memory pool is ! 62: * handed an MPOOL which is the opaque cookie passed to all of the memory ! 63: * routines. ! 64: */ ! 65: #define HASHSIZE 128 ! 66: #define HASHKEY(pgno) ((pgno - 1) % HASHSIZE) ! 67: ! 68: /* The BKT structures are the elements of the lists. */ ! 69: typedef struct BKT { ! 70: struct BKT *hnext; /* next hash bucket */ ! 71: struct BKT *hprev; /* previous hash bucket */ ! 72: struct BKT *cnext; /* next free/lru bucket */ ! 73: struct BKT *cprev; /* previous free/lru bucket */ ! 74: void *page; /* page */ ! 75: pgno_t pgno; /* page number */ ! 76: ! 77: #define MPOOL_DIRTY 0x01 /* page needs to be written */ ! 78: #define MPOOL_PINNED 0x02 /* page is pinned into memory */ ! 79: unsigned long flags; /* flags */ ! 80: } BKT; ! 81: ! 82: /* The BKTHDR structures are the heads of the lists. */ ! 83: typedef struct BKTHDR { ! 84: struct BKT *hnext; /* next hash bucket */ ! 85: struct BKT *hprev; /* previous hash bucket */ ! 86: struct BKT *cnext; /* next free/lru bucket */ ! 87: struct BKT *cprev; /* previous free/lru bucket */ ! 88: } BKTHDR; ! 89: ! 90: typedef struct MPOOL { ! 91: BKTHDR free; /* The free list. */ ! 92: BKTHDR lru; /* The LRU list. */ ! 93: BKTHDR hashtable[HASHSIZE]; /* Hashed list by page number. */ ! 94: pgno_t curcache; /* Current number of cached pages. */ ! 95: pgno_t maxcache; /* Max number of cached pages. */ ! 96: pgno_t npages; /* Number of pages in the file. */ ! 97: u_long pagesize; /* File page size. */ ! 98: int fd; /* File descriptor. */ ! 99: /* Page in conversion routine. */ ! 100: void (*pgin) __P((void *, pgno_t, void *)); ! 101: /* Page out conversion routine. */ ! 102: void (*pgout) __P((void *, pgno_t, void *)); ! 103: void *pgcookie; /* Cookie for page in/out routines. */ ! 104: #ifdef STATISTICS ! 105: unsigned long cachehit; ! 106: unsigned long cachemiss; ! 107: unsigned long pagealloc; ! 108: unsigned long pageflush; ! 109: unsigned long pageget; ! 110: unsigned long pagenew; ! 111: unsigned long pageput; ! 112: unsigned long pageread; ! 113: unsigned long pagewrite; ! 114: #endif ! 115: } MPOOL; ! 116: ! 117: #ifdef __MPOOLINTERFACE_PRIVATE ! 118: /* Macros to insert/delete into/from hash chain. */ ! 119: #define rmhash(bp) { \ ! 120: (bp)->hprev->hnext = (bp)->hnext; \ ! 121: (bp)->hnext->hprev = (bp)->hprev; \ ! 122: } ! 123: #define inshash(bp, pg) { \ ! 124: hp = &mp->hashtable[HASHKEY(pg)]; \ ! 125: (bp)->hnext = hp->hnext; \ ! 126: (bp)->hprev = (struct BKT *)hp; \ ! 127: hp->hnext->hprev = (bp); \ ! 128: hp->hnext = (bp); \ ! 129: } ! 130: ! 131: /* Macros to insert/delete into/from lru and free chains. */ ! 132: #define rmchain(bp) { \ ! 133: (bp)->cprev->cnext = (bp)->cnext; \ ! 134: (bp)->cnext->cprev = (bp)->cprev; \ ! 135: } ! 136: #define inschain(bp, dp) { \ ! 137: (bp)->cnext = (dp)->cnext; \ ! 138: (bp)->cprev = (struct BKT *)(dp); \ ! 139: (dp)->cnext->cprev = (bp); \ ! 140: (dp)->cnext = (bp); \ ! 141: } ! 142: #endif ! 143: ! 144: __BEGIN_DECLS ! 145: MPOOL *mpool_open __P((DBT *, int, pgno_t, pgno_t)); ! 146: void mpool_filter __P((MPOOL *, void (*)(void *, pgno_t, void *), ! 147: void (*)(void *, pgno_t, void *), void *)); ! 148: void *mpool_new __P((MPOOL *, pgno_t *)); ! 149: void *mpool_get __P((MPOOL *, pgno_t, u_int)); ! 150: int mpool_put __P((MPOOL *, void *, u_int)); ! 151: int mpool_sync __P((MPOOL *)); ! 152: int mpool_close __P((MPOOL *)); ! 153: #ifdef STATISTICS ! 154: void mpool_stat __P((MPOOL *)); ! 155: #endif ! 156: __END_DECLS
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.