RPC with LWIP
Johannes Schlatow
schlatow at ...238...
Mon Jul 7 13:44:39 CEST 2014
Hi Norman,
in order to simplify the implementation of
multi-threaded/multi-entrypoint servers, I made an attempt to extract
the generic part from the multi-threaded timer implementation you
referenced.
I therefore created a Root_component_multi and a
Session_component_multi from which a server implementation can easily
inherit. As far as I know, it is working in Mohammad's case.
I put this on github so that anyone else can reuse the code [1].
[1]
https://github.com/ValiValpas/genode/commit/b8afa38dc98a28da525442022f7a014997dda7cb
Best
Johannes
On Wed, 02 Jul 2014 14:37:04 +0200
Norman Feske <norman.feske at ...1...> wrote:
> Hi Mohammad,
>
> > from the client side i connect to the both server by telent each of
> > them and type message to them and it work smoothly.
> > so , I think without using the RPC we dont have the blocking
> > problem or may be my test was wrong .
> > i will attach the .run ,server.c and .mk files .
>
> your test is exactly what I had in mind for simplifying the scenario.
> Since the test works when two threads are using lwIP directly, we know
> that your issue is not related to the way lwIP works. Your test
> pinpoints the problem to the RPC interface. It seems that you have
> missed a step when turning the RPC interface multi-threaded. Please
> make sure that
>
> * Your 'Lwip::Session_component' has an 'Rpc_entrypoint' as a member
> variable. So each time, a session is created, a dedicated entrypoint
> get created, too.
>
> * Your 'Lwip::Session_component' is managed by the session's own
> entrypoint, not the entrpoint that serves the root interface. Note
> that the default 'Root_component' provided by Genode's
> 'root/component.h' does not what you want. You cannot use the
> default implementation but implement the 'Root_component' yourself.
> Please take a close look at the timer variant [1] I referenced in my
> email from May 28.
>
>
> [1]
> https://github.com/genodelabs/genode/tree/b54bdea2aae245b2d8f53794c1c1b9b2da371592/os/src/drivers/timer/nova
>
> To see that each lwIP session is executed by a different thread, you
> may add the following debug output to one of the lwIP RPC functions
> (e.g., at the beginning of 'accept').
>
> PDBG("thread_base at %p", Genode::Thread_base::myself());
>
> The 'myself' function returns a different pointer for each thread that
> calls the function. You will see two messages, one for each session.
> If you see two different pointer values, you know that both sessions
> are dispatched by different threads - this is what we want. I guess
> that you will see the same value twice.
>
> If the problem persists, would you consider to make branch publicly
> available (e.g., on GitHub) so that I could have a look?
>
> On another note, have you had success with inspecting the scenario
> using GDB on Linux?
>
> Good luck!
> Norman
>
More information about the users
mailing list