X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fjournal%2Fmmap-cache.c;h=03b57beb046fc72019116ea368dc72ccc6cf0872;hp=7813f037544546fe8bf8e33c85c6768acce001a0;hb=5862d652ba14178cff46b8a8fc6c6d8392bf32b1;hpb=89de694724f376a6852e879fe987e7e531327654 diff --git a/src/journal/mmap-cache.c b/src/journal/mmap-cache.c index 7813f0375..03b57beb0 100644 --- a/src/journal/mmap-cache.c +++ b/src/journal/mmap-cache.c @@ -41,9 +41,9 @@ struct Window { bool keep_always; bool in_unused; + int prot; void *ptr; uint64_t offset; - int prot; size_t size; FileDescriptor *fd; @@ -70,12 +70,11 @@ struct FileDescriptor { struct MMapCache { int n_ref; + unsigned n_windows; Hashmap *fds; Hashmap *contexts; - unsigned n_windows; - LIST_HEAD(Window, unused); Window *last_unused; }; @@ -134,7 +133,7 @@ static void window_free(Window *w) { free(w); } -static bool window_matches(Window *w, int fd, int prot, uint64_t offset, size_t size) { +_pure_ static bool window_matches(Window *w, int fd, int prot, uint64_t offset, size_t size) { assert(w); assert(fd >= 0); assert(size > 0); @@ -205,8 +204,8 @@ static void context_attach_window(Context *c, Window *w) { if (w->in_unused) { /* Used again? */ LIST_REMOVE(Window, unused, c->cache->unused, w); - if (!c->cache->last_unused) - c->cache->last_unused = w; + if (c->cache->last_unused == w) + c->cache->last_unused = w->unused_prev; w->in_unused = false; } @@ -308,9 +307,13 @@ static void mmap_cache_free(MMapCache *m) { while ((c = hashmap_first(m->contexts))) context_free(c); + hashmap_free(m->contexts); + while ((f = hashmap_first(m->fds))) fd_free(f); + hashmap_free(m->fds); + while (m->unused) window_free(m->unused);