diff --git a/repos/libports/src/lib/libc/dynamic_linker.cc b/repos/libports/src/lib/libc/dynamic_linker.cc
index 4f97bbbcb1..91f1cb1ddd 100644
--- a/repos/libports/src/lib/libc/dynamic_linker.cc
+++ b/repos/libports/src/lib/libc/dynamic_linker.cc
@@ -1,19 +1,23 @@
-/**
- * \brief DL interface bindings
+/*
+ * \brief Dynamic linker interface bindings
* \author Sebastian Sumpf
* \date 2014-10-24
*
* Wrap Genode's shared library interface onto libc semantics.
*/
-#include
+/* Genode includes */
#include
#include
#include
+/* Genode-specific libc includes */
+#include
+
/* libc-internal includes */
#include
+/* libc includes */
extern "C" {
#include
}
@@ -71,8 +75,9 @@ void *dlopen(const char *name, int mode)
}
try {
- return new (env()->heap())
- Shared_object(*genode_env, *env()->heap(), name, bind, keep);
+ static Libc::Allocator global_alloc;
+ return new (global_alloc)
+ Shared_object(*genode_env, global_alloc, name, bind, keep);
} catch (...) {
snprintf(err_str, MAX_ERR, "Unable to open file %s\n", name);
}
@@ -117,7 +122,7 @@ int dladdr(const void *addr, Dl_info *dlip)
int dlclose(void *handle)
{
- destroy(env()->heap(), to_object(handle));
+ destroy(Libc::Allocator(), to_object(handle));
return 0;
}
diff --git a/repos/libports/src/lib/libc/libc_init.h b/repos/libports/src/lib/libc/libc_init.h
index 7fe5d0c2b4..df2a2f5d6a 100644
--- a/repos/libports/src/lib/libc/libc_init.h
+++ b/repos/libports/src/lib/libc/libc_init.h
@@ -23,6 +23,11 @@ namespace Libc {
* Support for shared libraries
*/
void init_dl(Genode::Env &env);
+
+ /**
+ * Global memory allocator
+ */
+ void init_mem_alloc(Genode::Env &env);
}
#endif /* _LIBC_INIT_H_ */
diff --git a/repos/libports/src/lib/libc/libc_mem_alloc.cc b/repos/libports/src/lib/libc/libc_mem_alloc.cc
index f4900af84b..58a05c2b8d 100644
--- a/repos/libports/src/lib/libc/libc_mem_alloc.cc
+++ b/repos/libports/src/lib/libc/libc_mem_alloc.cc
@@ -16,10 +16,11 @@
/* Genode includes */
#include
#include
-#include
+#include
/* local includes */
#include "libc_mem_alloc.h"
+#include "libc_init.h"
using namespace Genode;
@@ -66,7 +67,7 @@ int Libc::Mem_alloc_impl::Dataspace_pool::expand(size_t size, Range_allocator *a
/* now that we have new backing store, allocate Dataspace structure */
if (alloc->alloc_aligned(sizeof(Dataspace), &ds_addr, 2).error()) {
- PWRN("could not allocate meta data - this should never happen");
+ Genode::warning("libc: could not allocate meta data - this should never happen");
return -1;
}
@@ -107,7 +108,7 @@ void *Libc::Mem_alloc_impl::alloc(size_t size, size_t align_log2)
}
if (_ds_pool.expand(align_addr(request_size, 12), &_alloc) < 0) {
- PWRN("could not expand dataspace pool");
+ Genode::warning("libc: could not expand dataspace pool");
return 0;
}
@@ -136,10 +137,26 @@ Genode::size_t Libc::Mem_alloc_impl::size_at(void const *addr) const
}
-Libc::Mem_alloc *Libc::mem_alloc()
-{
- static Libc::Mem_alloc_impl inst;
- return &inst;
+static Libc::Mem_alloc *_libc_mem_alloc;
+
+
+namespace Libc {
+
+ void init_mem_alloc(Genode::Env &env)
+ {
+ static Libc::Mem_alloc_impl inst(env.rm(), env.ram());
+ _libc_mem_alloc = &inst;
+ }
+}
+
+
+Libc::Mem_alloc *Libc::mem_alloc()
+{
+ if (!_libc_mem_alloc) {
+ error("attempt to use 'Libc::mem_alloc' before call of 'init_mem_alloc'");
+ Genode::sleep_forever();
+ }
+ return _libc_mem_alloc;
}
diff --git a/repos/libports/src/lib/libc/libc_mem_alloc.h b/repos/libports/src/lib/libc/libc_mem_alloc.h
index 27d55af40c..ebd138bafa 100644
--- a/repos/libports/src/lib/libc/libc_mem_alloc.h
+++ b/repos/libports/src/lib/libc/libc_mem_alloc.h
@@ -108,10 +108,9 @@ namespace Libc {
public:
- Mem_alloc_impl(Genode::Region_map * rm = Genode::env()->rm_session(),
- Genode::Ram_session * ram = Genode::env()->ram_session())
+ Mem_alloc_impl(Genode::Region_map &rm, Genode::Ram_session &ram)
:
- _ds_pool(ram, rm),
+ _ds_pool(&ram, &rm),
_alloc(0),
_chunk_size(MIN_CHUNK_SIZE)
{ }
diff --git a/repos/libports/src/lib/libc/task.cc b/repos/libports/src/lib/libc/task.cc
index 870ac6b7c8..315d063828 100644
--- a/repos/libports/src/lib/libc/task.cc
+++ b/repos/libports/src/lib/libc/task.cc
@@ -641,6 +641,7 @@ Genode::size_t Component::stack_size() { return Libc::Component::stack_size(); }
void Component::construct(Genode::Env &env)
{
/* pass Genode::Env to libc subsystems that depend on it */
+ Libc::init_mem_alloc(env);
Libc::init_dl(env);
kernel = unmanaged_singleton(env);
diff --git a/repos/ports/src/virtualbox/mm.cc b/repos/ports/src/virtualbox/mm.cc
index aa8725f909..ddaec4424f 100644
--- a/repos/ports/src/virtualbox/mm.cc
+++ b/repos/ports/src/virtualbox/mm.cc
@@ -57,7 +57,8 @@ static Libc::Mem_alloc * heap_by_mmtag(MMTAG enmTag)
return memory_regions[enmTag].heap;
memory_regions[enmTag].conn = new Sub_rm_connection(genode_env(), REGION_SIZE);
- memory_regions[enmTag].heap = new Libc::Mem_alloc_impl(memory_regions[enmTag].conn);
+ memory_regions[enmTag].heap = new Libc::Mem_alloc_impl(*memory_regions[enmTag].conn,
+ genode_env().ram());
return memory_regions[enmTag].heap;
}
diff --git a/repos/ports/src/virtualbox/spec/nova/sup.cc b/repos/ports/src/virtualbox/spec/nova/sup.cc
index feb68392e8..d5045d564b 100644
--- a/repos/ports/src/virtualbox/spec/nova/sup.cc
+++ b/repos/ports/src/virtualbox/spec/nova/sup.cc
@@ -278,7 +278,7 @@ extern "C" void pthread_yield(void)
void *operator new (__SIZE_TYPE__ size, int log2_align)
{
- static Libc::Mem_alloc_impl heap(&genode_env().rm());
+ static Libc::Mem_alloc_impl heap(genode_env().rm(), genode_env().ram());
return heap.alloc(size, log2_align);
}
diff --git a/repos/ports/src/virtualbox5/mm.cc b/repos/ports/src/virtualbox5/mm.cc
index 847bfb9a65..da5447fed2 100644
--- a/repos/ports/src/virtualbox5/mm.cc
+++ b/repos/ports/src/virtualbox5/mm.cc
@@ -61,7 +61,8 @@ static Libc::Mem_alloc * heap_by_mmtag(MMTAG enmTag)
return memory_regions[enmTag].heap;
memory_regions[enmTag].conn = new Sub_rm_connection(genode_env(), REGION_SIZE);
- memory_regions[enmTag].heap = new Libc::Mem_alloc_impl(memory_regions[enmTag].conn);
+ memory_regions[enmTag].heap = new Libc::Mem_alloc_impl(*memory_regions[enmTag].conn,
+ genode_env().ram());
return memory_regions[enmTag].heap;
}
diff --git a/repos/ports/src/virtualbox5/spec/nova/sup.cc b/repos/ports/src/virtualbox5/spec/nova/sup.cc
index 0981b3ec0f..a7d081e863 100644
--- a/repos/ports/src/virtualbox5/spec/nova/sup.cc
+++ b/repos/ports/src/virtualbox5/spec/nova/sup.cc
@@ -544,7 +544,7 @@ extern "C" void pthread_yield(void)
void *operator new (__SIZE_TYPE__ size, int log2_align)
{
- static Libc::Mem_alloc_impl heap(&genode_env().rm());
+ static Libc::Mem_alloc_impl heap(genode_env().rm(), genode_env().ram());
return heap.alloc(size, log2_align);
}