diff --git a/base-linux/include/base/platform_env.h b/base-linux/include/base/platform_env.h index d485c88555..8611b9c921 100644 --- a/base-linux/include/base/platform_env.h +++ b/base-linux/include/base/platform_env.h @@ -199,12 +199,12 @@ namespace Genode { /** * Map dataspace into local address space */ - static void *_map_local(Dataspace_capability ds, - Genode::size_t size, - addr_t offset, - bool use_local_addr, - addr_t local_addr, - bool executable); + void *_map_local(Dataspace_capability ds, + Genode::size_t size, + addr_t offset, + bool use_local_addr, + addr_t local_addr, + bool executable); /** * Determine size of dataspace @@ -214,17 +214,17 @@ namespace Genode { * dataspace size is determined via an RPC to core * (calling 'Dataspace::size()'). */ - static size_t _dataspace_size(Capability); + size_t _dataspace_size(Capability); /** * Determine file descriptor of dataspace */ - static int _dataspace_fd(Capability); + int _dataspace_fd(Capability); /** * Determine whether dataspace is writable */ - static bool _dataspace_writable(Capability); + bool _dataspace_writable(Capability); public: diff --git a/base-linux/src/core/platform.cc b/base-linux/src/core/platform.cc index 6906e46a94..ed402d06c7 100644 --- a/base-linux/src/core/platform.cc +++ b/base-linux/src/core/platform.cc @@ -111,8 +111,13 @@ Platform_env_base::Rm_session_mmap::_dataspace_size(Capability ds_cap return Dataspace_capability::deref(ds_cap)->size(); /* use RPC if called from a different thread */ - if (!core_env()->entrypoint()->is_myself()) - return Dataspace_client(ds_cap).size(); + if (!core_env()->entrypoint()->is_myself()) { + /* release Rm_session_mmap::_lock during RPC */ + _lock.unlock(); + Genode::size_t size = Dataspace_client(ds_cap).size(); + _lock.lock(); + return size; + } /* use local function call if called from the entrypoint */ Dataspace *ds = core_env()->entrypoint()->lookup(ds_cap); @@ -122,8 +127,13 @@ Platform_env_base::Rm_session_mmap::_dataspace_size(Capability ds_cap int Platform_env_base::Rm_session_mmap::_dataspace_fd(Capability ds_cap) { - if (!core_env()->entrypoint()->is_myself()) - return Linux_dataspace_client(ds_cap).fd().dst().socket; + if (!core_env()->entrypoint()->is_myself()) { + /* release Rm_session_mmap::_lock during RPC */ + _lock.unlock(); + int socket = Linux_dataspace_client(ds_cap).fd().dst().socket; + _lock.lock(); + return socket; + } Capability lx_ds_cap = static_cap_cast(ds_cap); @@ -135,8 +145,13 @@ int Platform_env_base::Rm_session_mmap::_dataspace_fd(Capability ds_c bool Platform_env_base::Rm_session_mmap::_dataspace_writable(Dataspace_capability ds_cap) { - if (!core_env()->entrypoint()->is_myself()) - return Dataspace_client(ds_cap).writable(); + if (!core_env()->entrypoint()->is_myself()) { + /* release Rm_session_mmap::_lock during RPC */ + _lock.unlock(); + bool writable = Dataspace_client(ds_cap).writable(); + _lock.lock(); + return writable; + } Dataspace *ds = core_env()->entrypoint()->lookup(ds_cap);