From: Sven F. <mx...@sv...> - 2009-08-26 16:04:53
|
Hi all, during my work, I've written a vesa driver which is capable of serving multiple clients (using 'virtual' framebuffers, derived from your vesa_drv). I always thought, that my 'Session_component' is created once when the first client opens a connection to my service, so that init calls 'create_session' in my 'Root_component' just once and never again. That was obviously wrong. I've found out, that 'create_session' is called once for each client - not on creation of the connection but on the first ipc call the client invokes. For my setting, this behaviour is not useful, so I've manually taken care of being a singleton by allocating my 'Root_component' only once in 'create-session' and handing out that single object subsequently on each following session creation. I've noticed some strange behaviour with that setting. (1) I saw that something complained about my singleton -- [init -> vesa_drv] void Genode::Avl_node<NT>::insert(Genode::Avl_node<NT>*) [wit h NT = Genode::Object_pool<Genode::Server_object>::Entry]: Inserting element 26f c twice into avl tree! -- But that did not seem to matter, so I ignored it... (2) I had to identify my clients somehow to maintain state information. So I hand over a 'shared secret' in each ipc call. That's simply the dataspace cap the client got from me. I noticed that something else than my clients called one of my methods during startup with an invalid secret. -- [init -> vesa_drv] virtual void Framebuffer::Session_component::toggle(Genode::D ataspace_capability): Framebuffer::Session_component::toggle 4b383d61h [init -> vesa_drv] virtual void Framebuffer::Session_component::toggle(Genode::D ataspace_capability): Framebuffer::Session_component::toggle: _fb_cap not accept ed. -- I wonder who might that be. Maybe a relict of mine or does the framework some kind of 'reflection'? (3) However, all that did not really bother, and for a start, everything seemed to work nice, but when my setting grew bigger, some ipcs didn't work properly. One of my two clients (the 2nd) caught an 'Ipc_error' when performing its second request. The first request performed fine. I thought that maybe the ipc could not be performed because the Session_component was serving another ipc at that moment. So I've ignored the exception and i kept retrying the ipc call. Without any success, and from here on I can't imagine what happens. Does anyone have an idea what I've missed? Kind regards Sven -- Sven Fülster |