Session mapping 1:1 vs. 1:n
    Sven Fülster 
    mx at ...19...
       
    Wed Aug 26 18:04:34 CEST 2009
    
    
  
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
    
    
More information about the users
mailing list