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