X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fpagecache.c;h=13ad36603fc7f69ea64c0aa9e527e74c88d8a7f5;hb=88714d18176f047eb4d298bb3f22520217671513;hp=b5636906bfaf1de75d0db9f4412624bb91b6e87b;hpb=006d7a8ef1c1b9144246fd421a5df93deeabd951;p=libucw.git diff --git a/lib/pagecache.c b/lib/pagecache.c index b5636906..13ad3660 100644 --- a/lib/pagecache.c +++ b/lib/pagecache.c @@ -1,18 +1,22 @@ /* - * Sherlock Library -- File Page Cache + * UCW Library -- File Page Cache * - * (c) 1999 Martin Mares + * (c) 1999--2002 Martin Mares + * + * This software may be freely distributed and used according to the terms + * of the GNU Lesser General Public License. */ +#include "lib/lib.h" +#include "lib/pagecache.h" +#include "lib/lfs.h" + #include #include #include #include #include - -#include "lib.h" -#include "pagecache.h" -#include "lfs.h" +#include struct page_cache { list free_pages; /* LRU queue of free non-dirty pages */ @@ -27,7 +31,7 @@ struct page_cache { uns stat_miss; /* Number of cache misses */ uns stat_write; /* Number of writes */ list *hash_table; /* List heads corresponding to hash buckets */ -#ifndef SHERLOCK_HAVE_PREAD +#ifndef HAVE_PREAD sh_off_t pos; /* Current position in the file */ int pos_fd; /* FD the position corresponds to */ #endif @@ -39,10 +43,9 @@ struct page_cache { struct page_cache * pgc_open(uns page_size, uns max_pages) { - struct page_cache *c = xmalloc(sizeof(struct page_cache)); + struct page_cache *c = xmalloc_zero(sizeof(struct page_cache)); uns i; - bzero(c, sizeof(*c)); init_list(&c->free_pages); init_list(&c->locked_pages); init_list(&c->dirty_pages); @@ -52,7 +55,7 @@ pgc_open(uns page_size, uns max_pages) c->hash_table = xmalloc(sizeof(list) * c->hash_size); for(i=0; ihash_size; i++) init_list(&c->hash_table[i]); -#ifndef SHERLOCK_HAVE_PREAD +#ifndef HAVE_PREAD c->pos_fd = -1; #endif return c; @@ -65,8 +68,8 @@ pgc_close(struct page_cache *c) ASSERT(EMPTY_LIST(c->locked_pages)); ASSERT(EMPTY_LIST(c->dirty_pages)); ASSERT(EMPTY_LIST(c->free_pages)); - free(c->hash_table); - free(c); + xfree(c->hash_table); + xfree(c); } static void @@ -102,10 +105,10 @@ flush_page(struct page_cache *c, struct page *p) int s; ASSERT(p->flags & PG_FLAG_DIRTY); -#ifdef SHERLOCK_HAVE_PREAD - s = pwrite(p->fd, p->data, c->page_size, p->pos); +#ifdef HAVE_PREAD + s = sh_pwrite(p->fd, p->data, c->page_size, p->pos); #else - if (c->pos != p->pos || c->pos_fd != p->fd) + if (c->pos != p->pos || c->pos_fd != (int) p->fd) sh_seek(p->fd, p->pos, SEEK_SET); s = write(p->fd, p->data, c->page_size); c->pos = p->pos + s; @@ -114,7 +117,7 @@ flush_page(struct page_cache *c, struct page *p) if (s < 0) die("pgc_write(%d): %m", p->fd); if (s != (int) c->page_size) - die("pgc_write(%d): incomplete page (only %d of %d)", s, c->page_size); + die("pgc_write(%d): incomplete page (only %d of %d)", p->fd, s, c->page_size); p->flags &= ~PG_FLAG_DIRTY; c->stat_write++; } @@ -140,7 +143,7 @@ static void flush_pages(struct page_cache *c, uns force) { uns cnt = 0; - uns max = force ? ~0 : c->free_count / 2; /* FIXME: Needs tuning */ + uns max = force ? ~0U : c->free_count / 2; uns i; struct page *p, *q, **req, **rr; @@ -251,7 +254,7 @@ pgc_cleanup(struct page_cache *c) rem_node(&p->hn); c->free_count--; c->total_count--; - free(p); + xfree(p); } ASSERT(!c->free_count); } @@ -273,17 +276,16 @@ pgc_read(struct page_cache *c, int fd, sh_off_t pos) int s; ASSERT(!PAGE_OFFSET(pos)); - ASSERT(!PAGE_NUMBER(fd)); p = get_and_lock_page(c, pos, fd); if (p->flags & PG_FLAG_VALID) c->stat_hit++; else { c->stat_miss++; -#ifdef SHERLOCK_HAVE_PREAD - s = pread(fd, p->data, c->page_size, pos); +#ifdef HAVE_PREAD + s = sh_pread(fd, p->data, c->page_size, pos); #else - if (c->pos != pos || c->pos_fd != fd) + if (c->pos != pos || c->pos_fd != (int)fd) sh_seek(fd, pos, SEEK_SET); s = read(fd, p->data, c->page_size); c->pos = pos + s; @@ -292,7 +294,7 @@ pgc_read(struct page_cache *c, int fd, sh_off_t pos) if (s < 0) die("pgc_read(%d): %m", fd); if (s != (int) c->page_size) - die("pgc_read(%d): incomplete page (only %d of %d)", s, c->page_size); + die("pgc_read(%d): incomplete page (only %d of %d)", p->fd, s, c->page_size); p->flags |= PG_FLAG_VALID; } return p; @@ -304,7 +306,6 @@ pgc_get(struct page_cache *c, int fd, sh_off_t pos) struct page *p; ASSERT(!PAGE_OFFSET(pos)); - ASSERT(!PAGE_NUMBER(fd)); p = get_and_lock_page(c, pos, fd); p->flags |= PG_FLAG_VALID | PG_FLAG_DIRTY; return p; @@ -316,7 +317,6 @@ pgc_get_zero(struct page_cache *c, int fd, sh_off_t pos) struct page *p; ASSERT(!PAGE_OFFSET(pos)); - ASSERT(!PAGE_NUMBER(fd)); p = get_and_lock_page(c, pos, fd); bzero(p->data, c->page_size); p->flags |= PG_FLAG_VALID | PG_FLAG_DIRTY; @@ -343,7 +343,7 @@ pgc_put(struct page_cache *c, struct page *p) else { rem_node(&p->hn); - free(p); + xfree(p); c->total_count--; } }