From b2657c5d73d4940b2aa94b066d7d6bdc5e1be078 Mon Sep 17 00:00:00 2001
From: Utz-Uwe Haus <uhaus@daint103.login.cscs.ch>
Date: Mon, 23 Nov 2020 11:33:13 +0100
Subject: [PATCH] add mstro_memlock_finalize function

---
 include/maestro/i_memlock.h |  6 ++++++
 maestro/core.c              |  2 +-
 maestro/memlock.c           | 24 ++++++++++++++++++++++++
 tests/check_memlock.c       |  5 +++--
 4 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/include/maestro/i_memlock.h b/include/maestro/i_memlock.h
index 98667a78..201d5a20 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 7bac92b8..83c1fdfb 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 51bcc0d6..863ec81a 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 cc8e4f84..7a9719eb 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());
            })
-- 
GitLab