diff --git a/include/remote_rom/backend_base.h b/include/remote_rom/backend_base.h
index 2d8b786..b715467 100644
--- a/include/remote_rom/backend_base.h
+++ b/include/remote_rom/backend_base.h
@@ -22,8 +22,8 @@ namespace Remote_rom {
struct Backend_client_base;
class Exception : public ::Genode::Exception { };
- Backend_server_base &backend_init_server();
- Backend_client_base &backend_init_client();
+ Backend_server_base &backend_init_server(Genode::Env &env, Genode::Allocator &alloc);
+ Backend_client_base &backend_init_client(Genode::Env &env, Genode::Allocator &alloc);
};
struct Remote_rom::Backend_server_base
diff --git a/src/lib/remote_rom/backend/nic_ip/backend.cc b/src/lib/remote_rom/backend/nic_ip/backend.cc
index 756ab5c..48e5dad 100644
--- a/src/lib/remote_rom/backend/nic_ip/backend.cc
+++ b/src/lib/remote_rom/backend/nic_ip/backend.cc
@@ -7,6 +7,7 @@
#include
#include
#include
+#include
#include
@@ -16,8 +17,6 @@
#include
#include
-#include
-
namespace Remote_rom {
bool verbose = false;
using Genode::size_t;
@@ -305,9 +304,9 @@ class Remote_rom::Backend_base
}
public:
- explicit Backend_base(Genode::Allocator &alloc, HANDLER &handler)
+ explicit Backend_base(Genode::Env &env, Genode::Allocator &alloc, HANDLER &handler)
:
- _tx_block_alloc(&alloc), _nic(&_tx_block_alloc, BUF_SIZE, BUF_SIZE),
+ _tx_block_alloc(&alloc), _nic(env, &_tx_block_alloc, BUF_SIZE, BUF_SIZE),
_rx_thread(_nic, handler, _accept_ip)
{
/* start dispatcher thread */
@@ -316,9 +315,11 @@ class Remote_rom::Backend_base
/* store mac address */
_mac_address = _nic.mac_address();
+ Genode::Attached_rom_dataspace config = {env, "config"};
+
try {
char ip_string[15];
- Genode::Xml_node remoterom = Genode::config()->xml_node().sub_node("remote_rom");
+ Genode::Xml_node remoterom = config.xml().sub_node("remote_rom");
remoterom.attribute("src").value(ip_string, sizeof(ip_string));
_src_ip = Ipv4_packet::ip_from_string(ip_string);
@@ -358,12 +359,8 @@ class Remote_rom::Backend_base
class Remote_rom::Backend_server : public Backend_server_base, public Backend_base
{
private:
- static Backend_server_base* _instance;
Rom_forwarder_base *_forwarder;
- Backend_server(Genode::Allocator &alloc) : Backend_base(alloc, *this), _forwarder(nullptr)
- { }
-
void send_data()
{
if (!_forwarder) return;
@@ -390,17 +387,8 @@ class Remote_rom::Backend_server : public Backend_server_base, public Backend_ba
}
public:
- static Backend_server_base &instance()
- {
- if (!_instance) {
- _instance = new (env()->heap()) Backend_server(*env()->heap());
-
- if (!_instance)
- throw Exception();
- }
-
- return *_instance;
- }
+ Backend_server(Genode::Env &env, Genode::Allocator &alloc) : Backend_base(env, alloc, *this), _forwarder(nullptr)
+ { }
void register_forwarder(Rom_forwarder_base *forwarder)
{
@@ -451,14 +439,10 @@ class Remote_rom::Backend_server : public Backend_server_base, public Backend_ba
class Remote_rom::Backend_client : public Backend_client_base, public Backend_base
{
private:
- static Backend_client_base *_instance;
Rom_receiver_base *_receiver;
char *_write_ptr;
size_t _buf_size;
- Backend_client(Genode::Allocator &alloc) : Backend_base(alloc, *this), _receiver(nullptr), _write_ptr(nullptr), _buf_size(0)
- {
- }
void write(char *data, size_t offset, size_t size)
{
@@ -472,16 +456,8 @@ class Remote_rom::Backend_client : public Backend_client_base, public Backend_ba
}
public:
- static Backend_client_base &instance()
+ Backend_client(Genode::Env &env, Genode::Allocator &alloc) : Backend_base(env, alloc, *this), _receiver(nullptr), _write_ptr(nullptr), _buf_size(0)
{
- if (!_instance) {
- _instance = new (env()->heap()) Backend_client(*env()->heap());
-
- if (!_instance)
- throw Exception();
- }
-
- return *_instance;
}
void register_receiver(Rom_receiver_base *receiver)
@@ -564,15 +540,14 @@ class Remote_rom::Backend_client : public Backend_client_base, public Backend_ba
}
};
-Remote_rom::Backend_server_base *Remote_rom::Backend_server::_instance = nullptr;
-Remote_rom::Backend_client_base *Remote_rom::Backend_client::_instance = nullptr;
-
-Remote_rom::Backend_server_base &Remote_rom::backend_init_server()
+Remote_rom::Backend_server_base &Remote_rom::backend_init_server(Genode::Env &env, Genode::Allocator &alloc)
{
- return Backend_server::instance();
+ static Backend_server backend(env, alloc);
+ return backend;
}
-Remote_rom::Backend_client_base &Remote_rom::backend_init_client()
+Remote_rom::Backend_client_base &Remote_rom::backend_init_client(Genode::Env &env, Genode::Allocator &alloc)
{
- return Backend_client::instance();
+ static Backend_client backend(env, alloc);
+ return backend;
}
diff --git a/src/proxy/remote_rom/client/main.cc b/src/proxy/remote_rom/client/main.cc
index 28345f3..c3d2a5b 100644
--- a/src/proxy/remote_rom/client/main.cc
+++ b/src/proxy/remote_rom/client/main.cc
@@ -26,11 +26,11 @@
#include
#include
-#include
+#include
+#include
#include
#include
-#include
#include
@@ -44,8 +44,6 @@ namespace Remote_rom {
struct Main;
struct Read_buffer;
- static char remotename[255];
-
typedef Genode::List Session_list;
};
@@ -104,7 +102,7 @@ class Remote_rom::Session_component : public Genode::Rpc_object _ram_ds->size()) {
- _ram_ds.construct(&_env.ram(), _buffer.content_size());
+ _ram_ds.construct(_env.ram(), _env.rm(), _buffer.content_size());
}
char *dst = _ram_ds->local_addr();
@@ -170,16 +168,25 @@ struct Remote_rom::Main : public Remote_rom::Read_buffer, public Remote_rom::Rom
Genode::Constructible _ds;
size_t _ds_content_size;
+ Genode::Attached_rom_dataspace _config = { env, "config" };
+
Backend_client_base &_backend;
- Main(Genode::Env &env) : env(env), _ds_content_size(1024), _backend(backend_init_client())
+ char remotename[255];
+
+ Main(Genode::Env &env) : env(env), _ds_content_size(1024), _backend(backend_init_client(env, heap))
{
+ try {
+ Genode::Xml_node remote_rom = _config.xml().sub_node("remote_rom");
+ remote_rom.attribute("name").value(remotename, sizeof(remotename));
+ } catch (...) {
+ Genode::error("No ROM module configured!");
+ }
+
env.parent().announce(env.ep().manage(remote_rom_root));
/* initialise backend */
_backend.register_receiver(this);
-
-// _ds.construct(Genode::env()->ram_session(), _ds_content_size);
}
const char* module_name() const { return remotename; }
@@ -191,7 +198,7 @@ struct Remote_rom::Main : public Remote_rom::Read_buffer, public Remote_rom::Rom
// TODO (optional) implement double buffering
if (!_ds.is_constructed() || _ds_content_size > _ds->size())
- _ds.construct(&env.ram(), _ds_content_size);
+ _ds.construct(env.ram(), env.rm(), _ds_content_size);
// TODO set write lock
@@ -216,7 +223,7 @@ struct Remote_rom::Main : public Remote_rom::Read_buffer, public Remote_rom::Rom
else {
/* transfer default content if set */
try {
- Genode::Xml_node default_content = Genode::config()->xml_node().sub_node("remote_rom").sub_node("default");
+ Genode::Xml_node default_content = _config.xml().sub_node("remote_rom").sub_node("default");
return default_content.content_size();
} catch (...) { }
}
@@ -234,7 +241,7 @@ struct Remote_rom::Main : public Remote_rom::Read_buffer, public Remote_rom::Rom
else {
/* transfer default content if set */
try {
- Genode::Xml_node default_content = Genode::config()->xml_node().sub_node("remote_rom").sub_node("default");
+ Genode::Xml_node default_content = _config.xml().sub_node("remote_rom").sub_node("default");
size_t const len = Genode::min(dst_len, default_content.content_size());
Genode::memcpy(dst, default_content.content_base(), len);
return len;
@@ -248,13 +255,6 @@ namespace Component {
Genode::size_t stack_size() { return 2*1024*sizeof(long); }
void construct(Genode::Env &env)
{
- try {
- Genode::Xml_node remote_rom = Genode::config()->xml_node().sub_node("remote_rom");
- remote_rom.attribute("name").value(Remote_rom::remotename, sizeof(Remote_rom::remotename));
- } catch (...) {
- Genode::error("No ROM module configured!");
- }
-
static Remote_rom::Main main(env);
}
}
diff --git a/src/proxy/remote_rom/server/main.cc b/src/proxy/remote_rom/server/main.cc
index fd43201..90bef18 100644
--- a/src/proxy/remote_rom/server/main.cc
+++ b/src/proxy/remote_rom/server/main.cc
@@ -19,12 +19,12 @@
#include
#include
+#include
#include
#include
-#include
-#include
+#include
namespace Remote_rom {
using Genode::size_t;
@@ -44,7 +44,10 @@ struct Remote_rom::Rom_forwarder : Rom_forwarder_base
Attached_rom_dataspace &_rom;
Backend_server_base &_backend;
- Rom_forwarder(Attached_rom_dataspace &rom, Backend_server_base &backend) : _rom(rom), _backend(backend)
+ Attached_rom_dataspace &_config;
+
+ Rom_forwarder(Attached_rom_dataspace &rom, Backend_server_base &backend, Attached_rom_dataspace &config)
+ : _rom(rom), _backend(backend), _config(config)
{
_backend.register_forwarder(this);
@@ -75,7 +78,7 @@ struct Remote_rom::Rom_forwarder : Rom_forwarder_base
}
else {
try {
- Genode::Xml_node default_content = Genode::config()->xml_node().sub_node("remote_rom").sub_node("default");
+ Genode::Xml_node default_content = _config.xml().sub_node("remote_rom").sub_node("default");
return default_content.content_size();
} catch (...) { }
}
@@ -92,7 +95,7 @@ struct Remote_rom::Rom_forwarder : Rom_forwarder_base
else {
/* transfer default content if set */
try {
- Genode::Xml_node default_content = Genode::config()->xml_node().sub_node("remote_rom").sub_node("default");
+ Genode::Xml_node default_content = _config.xml().sub_node("remote_rom").sub_node("default");
size_t const len = Genode::min(dst_len, default_content.content_size()-offset);
Genode::memcpy(dst, default_content.content_base() + offset, len);
return len;
@@ -105,16 +108,19 @@ struct Remote_rom::Rom_forwarder : Rom_forwarder_base
struct Remote_rom::Main
{
- Genode::Entrypoint &_ep;
+ Genode::Env &_env;
+ Genode::Heap _heap = { &_env.ram(), &_env.rm() };
+ Attached_rom_dataspace _config = { _env, "config" };
+
Attached_rom_dataspace _rom;
Rom_forwarder _forwarder;
- Genode::Signal_handler _dispatcher = { _ep, _forwarder, &Rom_forwarder::update };
+ Genode::Signal_handler _dispatcher = { _env.ep(), _forwarder, &Rom_forwarder::update };
- Main(Genode::Entrypoint &ep)
- : _ep(ep),
- _rom(modulename),
- _forwarder(_rom, backend_init_server())
+ Main(Genode::Env &env)
+ : _env(env),
+ _rom(env, modulename),
+ _forwarder(_rom, backend_init_server(env, _heap), _config)
{
/* register update dispatcher */
_rom.sigh(_dispatcher);
@@ -123,10 +129,13 @@ struct Remote_rom::Main
namespace Component {
Genode::size_t stack_size() { return 2*1024*sizeof(long); }
+
+
void construct(Genode::Env &env)
{
+ Genode::Attached_rom_dataspace config = { env, "config" };
try {
- Genode::Xml_node remote_rom = Genode::config()->xml_node().sub_node("remote_rom");
+ Genode::Xml_node remote_rom = config.xml().sub_node("remote_rom");
if (remote_rom.has_attribute("localname"))
remote_rom.attribute("localname").value(Remote_rom::modulename, sizeof(Remote_rom::modulename));
else
@@ -140,6 +149,6 @@ namespace Component {
Genode::error("No ROM module configured!");
}
- static Remote_rom::Main main(env.ep());
+ static Remote_rom::Main main(env);
}
}