]> git.saurik.com Git - apple/libc.git/blobdiff - db/mpool/FreeBSD/mpool.c
Libc-825.24.tar.gz
[apple/libc.git] / db / mpool / FreeBSD / mpool.c
index 737c03c3bc454765a978bf772d5beac7d4cab532..36fb30bb56bda9c3f165f327677faf82691b787a 100644 (file)
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
  * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
@@ -35,7 +31,7 @@
 static char sccsid[] = "@(#)mpool.c    8.5 (Berkeley) 7/26/94";
 #endif /* LIBC_SCCS and not lint */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/db/mpool/mpool.c,v 1.10 2002/03/22 21:52:01 obrien Exp $");
+__FBSDID("$FreeBSD: src/lib/libc/db/mpool/mpool.c,v 1.16 2009/03/28 04:00:46 delphij Exp $");
 
 #include "namespace.h"
 #include <sys/param.h>
@@ -62,11 +58,9 @@ static int  mpool_write(MPOOL *, BKT *);
  * mpool_open --
  *     Initialize a memory pool.
  */
+/* ARGSUSED */
 MPOOL *
-mpool_open(key, fd, pagesize, maxcache)
-       void *key;
-       int fd;
-       pgno_t pagesize, maxcache;
+mpool_open(void *key, int fd, pgno_t pagesize, pgno_t maxcache)
 {
        struct stat sb;
        MPOOL *mp;
@@ -103,11 +97,8 @@ mpool_open(key, fd, pagesize, maxcache)
  *     Initialize input/output filters.
  */
 void
-mpool_filter(mp, pgin, pgout, pgcookie)
-       MPOOL *mp;
-       void (*pgin)(void *, pgno_t, void *);
-       void (*pgout)(void *, pgno_t, void *);
-       void *pgcookie;
+mpool_filter(MPOOL *mp, void (*pgin) (void *, pgno_t, void *),
+    void (*pgout) (void *, pgno_t, void *), void *pgcookie)
 {
        mp->pgin = pgin;
        mp->pgout = pgout;
@@ -128,7 +119,7 @@ mpool_new(mp, pgnoaddr)
 
        if (mp->npages == MAX_PAGE_NUMBER) {
                (void)fprintf(stderr, "mpool_new: page allocation overflow.\n");
-               abort();
+               LIBC_ABORT("page allocation overflow");
        }
 #ifdef STATISTICS
        ++mp->pagenew;
@@ -153,11 +144,10 @@ mpool_new(mp, pgnoaddr)
  * mpool_get
  *     Get a page.
  */
+/* ARGSUSED */
 void *
-mpool_get(mp, pgno, flags)
-       MPOOL *mp;
-       pgno_t pgno;
-       u_int flags;                            /* XXX not used? */
+mpool_get(MPOOL *mp, pgno_t pgno,
+    u_int flags)               /* XXX not used? */
 {
        struct _hqh *head;
        BKT *bp;
@@ -180,7 +170,7 @@ mpool_get(mp, pgno, flags)
                if (bp->flags & MPOOL_PINNED) {
                        (void)fprintf(stderr,
                            "mpool_get: page %d already pinned\n", bp->pgno);
-                       abort();
+                       LIBC_ABORT("page %d already pinned", bp->pgno);
                }
 #endif
                /*
@@ -207,9 +197,8 @@ mpool_get(mp, pgno, flags)
        ++mp->pageread;
 #endif
        off = mp->pagesize * pgno;
-       if (lseek(mp->fd, off, SEEK_SET) != off)
-               return (NULL);
-       if ((nr = _read(mp->fd, bp->page, mp->pagesize)) != mp->pagesize) {
+       nr = pread(mp->fd, bp->page, mp->pagesize, off);
+       if (nr != mp->pagesize) {
                if (nr >= 0)
                        errno = EFTYPE;
                return (NULL);
@@ -238,11 +227,9 @@ mpool_get(mp, pgno, flags)
  * mpool_put
  *     Return a page.
  */
+/* ARGSUSED */
 int
-mpool_put(mp, page, flags)
-       MPOOL *mp;
-       void *page;
-       u_int flags;
+mpool_put(MPOOL *mp, void *page, u_int flags)
 {
        BKT *bp;
 
@@ -254,7 +241,7 @@ mpool_put(mp, page, flags)
        if (!(bp->flags & MPOOL_PINNED)) {
                (void)fprintf(stderr,
                    "mpool_put: page %d not pinned\n", bp->pgno);
-               abort();
+               LIBC_ABORT("page %d not pinned", bp->pgno);
        }
 #endif
        bp->flags &= ~MPOOL_PINNED;
@@ -267,8 +254,7 @@ mpool_put(mp, page, flags)
  *     Close the buffer pool.
  */
 int
-mpool_close(mp)
-       MPOOL *mp;
+mpool_close(MPOOL *mp)
 {
        BKT *bp;
 
@@ -289,16 +275,21 @@ mpool_close(mp)
  *     Sync the pool to disk.
  */
 int
-mpool_sync(mp)
-       MPOOL *mp;
+mpool_sync(MPOOL *mp)
 {
        BKT *bp;
 
        /* Walk the lru chain, flushing any dirty pages to disk. */
-       TAILQ_FOREACH(bp, &mp->lqh, q)
-               if (bp->flags & MPOOL_DIRTY &&
-                   mpool_write(mp, bp) == RET_ERROR)
-                       return (RET_ERROR);
+       TAILQ_FOREACH(bp, &mp->lqh, q) {
+               if (bp->flags & MPOOL_DIRTY)
+                       if (mpool_write(mp, bp) == RET_ERROR) {
+                               return (RET_ERROR);
+                       } else {
+                               /* 4874757: Re-run through the user's pgin filter. */
+                               if (mp->pgin != NULL)
+                                       (mp->pgin)(mp->pgcookie, bp->pgno, bp->page);
+                       }
+       }
 
        /* Sync the file descriptor. */
        return (_fsync(mp->fd) ? RET_ERROR : RET_SUCCESS);
@@ -309,8 +300,7 @@ mpool_sync(mp)
  *     Get a page from the cache (or create one).
  */
 static BKT *
-mpool_bkt(mp)
-       MPOOL *mp;
+mpool_bkt(MPOOL *mp)
 {
        struct _hqh *head;
        BKT *bp;
@@ -348,13 +338,10 @@ mpool_bkt(mp)
                        return (bp);
                }
 
-new:   if ((bp = (BKT *)malloc(sizeof(BKT) + mp->pagesize)) == NULL)
+new:   if ((bp = (BKT *)calloc(1, sizeof(BKT) + mp->pagesize)) == NULL)
                return (NULL);
 #ifdef STATISTICS
        ++mp->pagealloc;
-#endif
-#if defined(DEBUG) || defined(PURIFY)
-       memset(bp, 0xff, sizeof(BKT) + mp->pagesize);
 #endif
        bp->page = (char *)bp + sizeof(BKT);
        ++mp->curcache;
@@ -366,9 +353,7 @@ new:        if ((bp = (BKT *)malloc(sizeof(BKT) + mp->pagesize)) == NULL)
  *     Write a page to disk.
  */
 static int
-mpool_write(mp, bp)
-       MPOOL *mp;
-       BKT *bp;
+mpool_write(MPOOL *mp, BKT *bp)
 {
        off_t off;
 
@@ -381,9 +366,7 @@ mpool_write(mp, bp)
                (mp->pgout)(mp->pgcookie, bp->pgno, bp->page);
 
        off = mp->pagesize * bp->pgno;
-       if (lseek(mp->fd, off, SEEK_SET) != off)
-               return (RET_ERROR);
-       if (_write(mp->fd, bp->page, mp->pagesize) != mp->pagesize)
+       if (pwrite(mp->fd, bp->page, mp->pagesize, off) != mp->pagesize)
                return (RET_ERROR);
 
        bp->flags &= ~MPOOL_DIRTY;
@@ -395,9 +378,7 @@ mpool_write(mp, bp)
  *     Lookup a page in the cache.
  */
 static BKT *
-mpool_look(mp, pgno)
-       MPOOL *mp;
-       pgno_t pgno;
+mpool_look(MPOOL *mp, pgno_t pgno)
 {
        struct _hqh *head;
        BKT *bp;
@@ -422,8 +403,7 @@ mpool_look(mp, pgno)
  *     Print out cache statistics.
  */
 void
-mpool_stat(mp)
-       MPOOL *mp;
+mpool_stat(MPOOL *mp)
 {
        BKT *bp;
        int cnt;