Implemented memobj_destroy_anon().
authorSimon Gerber <simugerber@student.ethz.ch>
Thu, 22 Nov 2012 14:53:20 +0000 (15:53 +0100)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Tue, 29 Jan 2013 10:31:02 +0000 (11:31 +0100)
lib/barrelfish/vspace/memobj_anon.c
usr/acpi/acpica_osglue.c

index 08920fe..0c5c03a 100644 (file)
@@ -425,9 +425,33 @@ errval_t memobj_create_anon(struct memobj_anon *anon, size_t size,
 /**
  * \brief Destroy the object
  *
- * \bug NYI
  */
 errval_t memobj_destroy_anon(struct memobj *memobj)
 {
-    return SYS_ERR_OK;
+    struct memobj_anon *m = (struct memobj_anon *)memobj;
+
+    errval_t err = SYS_ERR_OK;
+
+    struct vregion_list *vwalk = m->vregion_list;
+    while (vwalk) {
+        err = vregion_destroy(vwalk->region);
+        if (err_is_fail(err)) {
+            return err;
+        }
+        struct vregion_list *old = vwalk;
+        vwalk = vwalk->next;
+        slab_free(&m->vregion_slab, old);
+    }
+
+    struct memobj_frame_list *fwalk = m->frame_list;
+    while (fwalk) {
+        err = cap_delete(fwalk->frame);
+        if (err_is_fail(err)) {
+            return err;
+        }
+        struct memobj_frame_list *old = fwalk;
+        fwalk = fwalk->next;
+        slab_free(&m->frame_slab, old);
+    }
+    return err;
 }
index db653d1..0a40404 100644 (file)
@@ -700,7 +700,6 @@ AcpiOsUnmapMemory (
             walk->refcount--;
             if (!walk->refcount) {
                 vregion_destroy(walk->vregion);
-                // XXX: memobj_destroy_anon is not implemented
                 memobj_destroy_anon((struct memobj *)walk->memobj);
                 if (prev) {
                     prev->next = walk->next;