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);
* \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;
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;
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");
}
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");
}
// 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);