Constructing objects from dataspaces

Frank Kaiser frank.kaiser at ...24...
Fri Jul 2 14:30:43 CEST 2010


Hello

 

I recently stumbled over a missing placement new operator in the Genode
framework. I needed an object to be shared between a client and a
server. The server should construct the object. The client should
connect to the server, and in response receive a capability allowing the
client to access the data held by the object. The class defining the
object provides a constructor to do some necessary initialisation of the
object. It looks like this:

class Object {

   ...

   Object(...) : ... { ... }

};

The chosen approach is to create a dataspace capability with the size of
the object. On the server side the object is instantiated:

Dataspace_capability cap = env()->ram_session()->alloc(sizeof(Object));

Object *obj = static_cast<Object *>(env()->rm_session()->attach(cap));

However, this does not work as expected, since this way Object's
constructor is never called. To achieve this applying the new operator
is required:

Dataspace_capability cap = env()->ram_session()->alloc(sizeof(Object));

Object *obj = new(env()->rm_session()->attach(cap)) Object();

However, this does not work either, because it leads to a type error
with the placement parameter. The reason is that the only publicly
available placement new operator is:

             void *operator new(Genode::size_t size, Genode::Allocator
*allocator)

And worse, its implementation tries to effectively allocate the object's
space, something which is not wanted in the given context. What is
needed here is a new operator which just returns the placement parameter
as the address of the object so that its constructor is invoked when
applying the operator. Something like this:

             void *operator new(Genode::size_t size, void *addr) {
return addr; }

I found such an operator locally defined in some Genode source files
(allocator_avl.cc for instance). I wonder why such an operator is not
publicly available although its usefulness is obvious. For the time
being I created a local inplementation for my purpose by cloning it from
an exisiting one. It would be helpful to have it generally thru a system
include file.

 

Regards

Frank

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.genode.org/pipermail/users/attachments/20100702/a7dfec88/attachment.html>


More information about the users mailing list