From c42e770384b8f29fada3260c09bfe5d9104eba9e Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Mon, 6 Jul 2015 13:06:27 +0200 Subject: [PATCH] detach ds from all rm sessions before destruction Fixes #1617 --- repos/base-linux/src/core/include/dataspace_component.h | 5 +++++ repos/base-nova/src/core/ram_session_support.cc | 2 -- repos/base/src/core/dataspace_component.cc | 8 ++++++-- repos/base/src/core/include/dataspace_component.h | 5 +++++ repos/base/src/core/ram_session_component.cc | 5 +++-- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/repos/base-linux/src/core/include/dataspace_component.h b/repos/base-linux/src/core/include/dataspace_component.h index 078b3d6c0a..95e73f0320 100644 --- a/repos/base-linux/src/core/include/dataspace_component.h +++ b/repos/base-linux/src/core/include/dataspace_component.h @@ -98,6 +98,11 @@ namespace Genode { */ bool owner(Dataspace_owner * const o) const { return _owner == o; } + /** + * Detach dataspace from all rm sessions. + */ + void detach_from_rm_sessions() { } + /************************* ** Dataspace interface ** *************************/ diff --git a/repos/base-nova/src/core/ram_session_support.cc b/repos/base-nova/src/core/ram_session_support.cc index 12118ac530..4a1872933c 100644 --- a/repos/base-nova/src/core/ram_session_support.cc +++ b/repos/base-nova/src/core/ram_session_support.cc @@ -43,8 +43,6 @@ void Ram_session_component::_revoke_ram_ds(Dataspace_component *ds) platform()->region_alloc()->free((void*)ds->core_local_addr(), page_rounded_size); - - ds->assign_core_local_addr(0); } diff --git a/repos/base/src/core/dataspace_component.cc b/repos/base/src/core/dataspace_component.cc index 3cc57ee45e..1567ac1a5d 100644 --- a/repos/base/src/core/dataspace_component.cc +++ b/repos/base/src/core/dataspace_component.cc @@ -31,8 +31,7 @@ void Dataspace_component::detached_from(Rm_region *region) _regions.remove(region); } - -Dataspace_component::~Dataspace_component() +void Dataspace_component::detach_from_rm_sessions() { _lock.lock(); @@ -50,3 +49,8 @@ Dataspace_component::~Dataspace_component() _lock.unlock(); } + +Dataspace_component::~Dataspace_component() +{ + detach_from_rm_sessions(); +} diff --git a/repos/base/src/core/include/dataspace_component.h b/repos/base/src/core/include/dataspace_component.h index 550230639f..5a9a14fd21 100644 --- a/repos/base/src/core/include/dataspace_component.h +++ b/repos/base/src/core/include/dataspace_component.h @@ -140,6 +140,11 @@ namespace Genode { void attached_to(Rm_region *region); void detached_from(Rm_region *region); + /** + * Detach dataspace from all rm sessions. + */ + void detach_from_rm_sessions(); + /** * Check if dataspace is owned by a specific owner */ diff --git a/repos/base/src/core/ram_session_component.cc b/repos/base/src/core/ram_session_component.cc index 249c6dd191..98a4323729 100644 --- a/repos/base/src/core/ram_session_component.cc +++ b/repos/base/src/core/ram_session_component.cc @@ -42,11 +42,12 @@ void Ram_session_component::_free_ds(Dataspace_component *ds) /* tell entry point to forget the dataspace */ _ds_ep->dissolve(ds); + /* remove dataspace from all RM sessions */ + ds->detach_from_rm_sessions(); + /* destroy native shared memory representation */ _revoke_ram_ds(ds); - /* XXX: remove dataspace from all RM sessions */ - /* free physical memory that was backing the dataspace */ _ram_alloc->free((void *)ds->phys_addr(), ds_size);