From: Simon Gerber Date: Thu, 15 Dec 2016 09:38:35 +0000 (+0100) Subject: libbarrelfish: make cap deletion in memobj_destroy_anon() optional X-Git-Tag: release2016-12-23~53 X-Git-Url: http://git.barrelfish.org/?p=barrelfish;a=commitdiff_plain;h=9364103f6277ea717989ce70a01362482f9028e3 libbarrelfish: make cap deletion in memobj_destroy_anon() optional Signed-off-by: Simon Gerber --- diff --git a/include/barrelfish/memobj.h b/include/barrelfish/memobj.h index 180ba77..c373ece 100644 --- a/include/barrelfish/memobj.h +++ b/include/barrelfish/memobj.h @@ -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); diff --git a/lib/barrelfish/vspace/memobj_anon.c b/lib/barrelfish/vspace/memobj_anon.c index 2974dab..f0c3130 100644 --- a/lib/barrelfish/vspace/memobj_anon.c +++ b/lib/barrelfish/vspace/memobj_anon.c @@ -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; diff --git a/lib/barrelfish/vspace/utils.c b/lib/barrelfish/vspace/utils.c index 3a6ed0b..160434e 100644 --- a/lib/barrelfish/vspace/utils.c +++ b/lib/barrelfish/vspace/utils.c @@ -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"); } diff --git a/usr/acpi/acpica_osglue.c b/usr/acpi/acpica_osglue.c index a8defee..56b2482 100644 --- a/usr/acpi/acpica_osglue.c +++ b/usr/acpi/acpica_osglue.c @@ -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);