libbarrelfish: make cap deletion in memobj_destroy_anon() optional
authorSimon Gerber <simon.gerber@inf.ethz.ch>
Thu, 15 Dec 2016 09:38:35 +0000 (10:38 +0100)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Thu, 15 Dec 2016 14:38:06 +0000 (15:38 +0100)
Signed-off-by: Simon Gerber <simon.gerber@inf.ethz.ch>

include/barrelfish/memobj.h
lib/barrelfish/vspace/memobj_anon.c
lib/barrelfish/vspace/utils.c
usr/acpi/acpica_osglue.c

index 180ba77..c373ece 100644 (file)
@@ -145,7 +145,7 @@ errval_t memobj_create_pinned(struct memobj_pinned *memobj, size_t size,
 
 errval_t memobj_create_anon(struct memobj_anon *memobj, size_t size,
                             memobj_flags_t flags);
-errval_t memobj_destroy_anon(struct memobj *memobj);
+errval_t memobj_destroy_anon(struct memobj *memobj, bool delete_caps);
 
 errval_t memobj_create_one_frame(struct memobj_one_frame *memobj, size_t size,
                                  memobj_flags_t flags);
index 2974dab..f0c3130 100644 (file)
@@ -489,7 +489,7 @@ errval_t memobj_create_anon(struct memobj_anon *anon, size_t size,
  * \brief Destroy the object
  *
  */
-errval_t memobj_destroy_anon(struct memobj *memobj)
+errval_t memobj_destroy_anon(struct memobj *memobj, bool delete_caps)
 {
     struct memobj_anon *m = (struct memobj_anon *)memobj;
 
@@ -508,9 +508,11 @@ errval_t memobj_destroy_anon(struct memobj *memobj)
 
     struct memobj_frame_list *fwalk = m->frame_list;
     while (fwalk) {
-        err = cap_delete(fwalk->frame);
-        if (err_is_fail(err)) {
-            return err;
+        if (delete_caps) {
+            err = cap_delete(fwalk->frame);
+            if (err_is_fail(err)) {
+                return err;
+            }
         }
         struct memobj_frame_list *old = fwalk;
         fwalk = fwalk->next;
index 3a6ed0b..160434e 100644 (file)
@@ -80,7 +80,7 @@ errval_t vspace_map_anon_nomalloc(void **retaddr, struct memobj_anon *memobj,
 
  error:
     if (err_no(err1) !=  LIB_ERR_MEMOBJ_CREATE_ANON) {
-        err2 = memobj_destroy_anon((struct memobj *)memobj);
+        err2 = memobj_destroy_anon((struct memobj *)memobj, true);
         if (err_is_fail(err2)) {
             DEBUG_ERR(err2, "memobj_destroy_anon failed");
         }
@@ -206,7 +206,7 @@ errval_t vspace_map_anon_fixed(genvaddr_t base, size_t size,
 
 error:
     if (memobj) {
-        err2 = memobj_destroy_anon(memobj);
+        err2 = memobj_destroy_anon(memobj, true);
         if (err_is_fail(err2)) {
             DEBUG_ERR(err2, "memobj_destroy_anon failed");
         }
index a8defee..56b2482 100644 (file)
@@ -774,7 +774,7 @@ AcpiOsUnmapMemory (
 
                 // memobj destroy will fail as backing caps are already
                 // deleted, so we don't check errors.
-                memobj_destroy_anon((struct memobj *)walk->memobj);
+                memobj_destroy_anon((struct memobj *)walk->memobj, false);
 
                 // Free malloc'd memory for element
                 free(walk->vregion);