diff --git a/base/src/core/include/core_env.h b/base/src/core/include/core_env.h index 2646e3ad08..61342a04ec 100644 --- a/base/src/core/include/core_env.h +++ b/base/src/core/include/core_env.h @@ -77,7 +77,6 @@ namespace Genode { void free(Ram_dataspace_capability ds) { - Lock::Guard lock_guard(_lock); RAM_SESSION_IMPL::free(ds); } diff --git a/base/src/core/include/ram_session_component.h b/base/src/core/include/ram_session_component.h index d9609bf1d4..b9c87274e2 100644 --- a/base/src/core/include/ram_session_component.h +++ b/base/src/core/include/ram_session_component.h @@ -19,6 +19,7 @@ #include #include #include +#include /* core includes */ #include @@ -38,7 +39,7 @@ namespace Genode { enum { SBS = 1024 }; /* slab block size */ - typedef Tslab Ds_slab; + typedef Synchronized_allocator > Ds_slab; Rpc_entrypoint *_ds_ep; Rpc_entrypoint *_ram_session_ep; diff --git a/base/src/core/ram_session_component.cc b/base/src/core/ram_session_component.cc index 97c6c0179f..ab4c4b6293 100644 --- a/base/src/core/ram_session_component.cc +++ b/base/src/core/ram_session_component.cc @@ -39,12 +39,12 @@ void Ram_session_component::_free_ds(Dataspace_component *ds) size_t ds_size = ds->size(); - /* destroy native shared memory representation */ - _revoke_ram_ds(ds); - /* tell entry point to forget the dataspace */ _ds_ep->dissolve(ds); + /* destroy native shared memory representation */ + _revoke_ram_ds(ds); + /* XXX: remove dataspace from all RM sessions */ /* free physical memory that was backing the dataspace */ @@ -54,6 +54,7 @@ void Ram_session_component::_free_ds(Dataspace_component *ds) destroy(&_ds_slab, ds); /* adjust payload */ + Lock::Guard lock_guard(_ref_members_lock); _payload -= ds_size; } @@ -181,9 +182,6 @@ Ram_dataspace_capability Ram_session_component::alloc(size_t ds_size, bool cache */ _clear_ds(ds); - /* keep track of the used quota for actual payload */ - _payload += ds_size; - if (verbose) PDBG("ds_size=%zd, used_quota=%zd quota_limit=%zd", ds_size, used_quota(), _quota_limit); @@ -193,6 +191,10 @@ Ram_dataspace_capability Ram_session_component::alloc(size_t ds_size, bool cache /* create native shared memory representation of dataspace */ _export_ram_ds(ds); + Lock::Guard lock_guard(_ref_members_lock); + /* keep track of the used quota for actual payload */ + _payload += ds_size; + return static_cap_cast(result); } @@ -258,7 +260,7 @@ Ram_session_component::Ram_session_component(Rpc_entrypoint *ds_ep, Ram_session_component::~Ram_session_component() { /* destroy all dataspaces */ - for (Dataspace_component *ds; (ds = _ds_slab.first_object()); _free_ds(ds)); + for (Dataspace_component *ds; (ds = _ds_slab.raw()->first_object()); _free_ds(ds)); if (_payload != 0) PWRN("Remaining payload of %zd in ram session to destroy", _payload);