diff --git a/src/backend/mmap.c b/src/backend/mmap.c index 0ff0c8d61..6622d8466 100644 --- a/src/backend/mmap.c +++ b/src/backend/mmap.c @@ -192,7 +192,7 @@ lumiera_mmap_init (LumieraMMap self, LumieraFile file, off_t start, size_t size) self->size = length; self->address = addr; self->refmap = lumiera_calloc ((length-1)/chunksize+1, sizeof (unsigned short)); - self->refcnt = 0; + self->refcnt = 1; lumiera_mmapcache_announce (self); lumiera_file_handle_release (file); @@ -228,7 +228,7 @@ lumiera_mmap_delete (LumieraMMap self) TRACE (mmap_dbg); if (self) { - REQUIRE (!self->refcnt); + REQUIRE (self->refcnt <= 1); lumiera_mmapcache_forget (self); /* The matching mappings->lock must be hold or being irrelevant (mappings destructor) here, we can't asset this from here, good luck */ diff --git a/src/backend/mmapings.c b/src/backend/mmapings.c index b27801b70..0d8dc9051 100644 --- a/src/backend/mmapings.c +++ b/src/backend/mmapings.c @@ -59,8 +59,9 @@ lumiera_mmapings_destroy (LumieraMMapings self) LLIST_WHILE_TAIL (&self->mmaps, node) { - LumieraMMap mmap = LLIST_TO_STRUCTP (node, lumiera_mmap, searchnode); - lumiera_mmap_delete (mmap); + LumieraMMap map = LLIST_TO_STRUCTP (node, lumiera_mmap, searchnode); + REQUIRE (map->refcnt == 0, "map still in use: %p", map); + lumiera_mmap_delete (map); } lumiera_mutex_destroy (&self->lock, &NOBUG_FLAG(mutex_dbg), NOBUG_CONTEXT); @@ -114,8 +115,9 @@ lumiera_mmapings_mmap_acquire (LumieraMMapings self, LumieraFile file, off_t sta if (ret) { if (!ret->refcnt) - /* in cache, needs to me checked out */ + /* in cache, needs to be checked out */ lumiera_mmapcache_checkout (ret); + ++ret->refcnt; } else { @@ -128,8 +130,6 @@ lumiera_mmapings_mmap_acquire (LumieraMMapings self, LumieraFile file, off_t sta TODO ("sort search list?"); } - ++ret->refcnt; - PLANNED ("use refmap for finer grained refcounting"); ENSURE (llist_is_empty(&ret->cachenode));