/*
- * Sherlock Library -- File Page Cache
+ * UCW Library -- File Page Cache
*
- * (c) 1999--2000 Martin Mares <mj@ucw.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 <string.h>
#include <fcntl.h>
#include <unistd.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
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;
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;
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--;
}
}