/*
- * Sherlock Library -- File Page Cache
+ * UCW Library -- File Page Cache
*
- * (c) 1999--2000 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
+ * (c) 1999--2002 Martin Mares <mj@ucw.cz>
+ *
+ * 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
-
-#include "lib.h"
-#include "pagecache.h"
-#include "lfs.h"
+#include <alloca.h>
struct page_cache {
list free_pages; /* LRU queue of free non-dirty pages */
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
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);
c->hash_table = xmalloc(sizeof(list) * c->hash_size);
for(i=0; i<c->hash_size; i++)
init_list(&c->hash_table[i]);
-#ifndef SHERLOCK_HAVE_PREAD
+#ifndef HAVE_PREAD
c->pos_fd = -1;
#endif
return 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
int s;
ASSERT(p->flags & PG_FLAG_DIRTY);
-#ifdef SHERLOCK_HAVE_PREAD
+#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;
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;
rem_node(&p->hn);
c->free_count--;
c->total_count--;
- free(p);
+ xfree(p);
}
ASSERT(!c->free_count);
}
else
{
c->stat_miss++;
-#ifdef SHERLOCK_HAVE_PREAD
+#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;
else
{
rem_node(&p->hn);
- free(p);
+ xfree(p);
c->total_count--;
}
}