diff --git a/include/maestro/i_memlock.h b/include/maestro/i_memlock.h index 98667a789a8c4165dc5c4b8a1e3df60f6c87bb62..201d5a209d54c48934bdafde581fe81ecfa0c8b7 100644 --- a/include/maestro/i_memlock.h +++ b/include/maestro/i_memlock.h @@ -83,6 +83,12 @@ mstro_memunlock(void* addr, size_t len); mstro_status mstro_memlock_init(size_t min_required); +/**@brief De-Initialize the memlock subsystem + * + */ +mstro_status +mstro_memlock_finalize(void); + /**@} (end of group MSTRO_I_MEMLOCK) */ /**@} (end of group MSTRO_Internal) */ diff --git a/maestro/core.c b/maestro/core.c index 7bac92b88684f8a9beab40470520045af9f53472..83c1fdfb718fb12a33c1711e5a80cf50812c52fc 100644 --- a/maestro/core.c +++ b/maestro/core.c @@ -371,7 +371,7 @@ mstro_core_finalize(void) goto BAILOUT; } - status = MSTRO_OK; + status = mstro_memlock_finalize(); BAILOUT: return status; diff --git a/maestro/memlock.c b/maestro/memlock.c index 51bcc0d6516d8d19663f879694283cbd15c506ea..863ec81ad0558850efd86525b0fd9b4317e4f537 100644 --- a/maestro/memlock.c +++ b/maestro/memlock.c @@ -14,6 +14,8 @@ #include <pthread.h> #include <sys/mman.h> #include <errno.h> +#include <sys/time.h> +#include <sys/resource.h> /* Terminology: * @@ -119,6 +121,28 @@ mstro_memlock_init(size_t min_required) } +mstro_status +mstro_memlock_finalize(void) +{ + mstro_status s=MSTRO_OK; + + WITH_LOCKED_PAGETABLE({ + if(g_locked_pages) { + if(kh_size(g_locked_pages)!=0) { + ERR("Table of locked page-sets nonempty: %d live entries\n", + kh_size(g_locked_pages)); + s=MSTRO_FAIL; + } + kh_destroy(page_set, g_locked_pages); + } else { + ERR("called before init, or called twice\n"); + } + }, BAILOUT); +BAILOUT: + return s; +} + + /** check whether @arg page is locked. * * Must be called while holding @ref g_locked_pages_mtx. diff --git a/tests/check_memlock.c b/tests/check_memlock.c index cc8e4f843b6c88c12d89687f7035b260b80e182a..7a9719eb3c6bfea5fd66284deb69596b4e99b550 100644 --- a/tests/check_memlock.c +++ b/tests/check_memlock.c @@ -56,6 +56,7 @@ CHEAT_TEST(lock_unlock, cheat_assert(MSTRO_OK==mstro_memunlock(x,8000)); free(x); + cheat_assert(MSTRO_OK==mstro_memlock_finalize()); }) @@ -78,6 +79,7 @@ CHEAT_TEST(lock_unlock_multi, cheat_assert(MSTRO_FAIL==mstro_memunlock(x,8000)); free(x); + cheat_assert(MSTRO_OK==mstro_memlock_finalize()); }) CHEAT_TEST(lock_overlapping, @@ -108,6 +110,5 @@ CHEAT_TEST(lock_overlapping, cheat_assert(MSTRO_OK==mstro_memunlock(start3, len3)); free(x); - - + cheat_assert(MSTRO_OK==mstro_memlock_finalize()); })