Hi Johannes,
does Genode provide something similar to the standard C++ condition variable? I want to block a function call until a certain event occurs but I don't want to sleep and check for that event.
I wonder, may it be an option to avoid the reliance on blocking calls and instead model your component as a state machine? I am asking because we actually started out with the approach to block control flows just as you wish for, but we moved (almost) completely away from it. Nowadays, all modern Genode components are designed to handle I/O in an asynchronous fashion. That is, the 'Component::construct' function merely creates a "Main" object (that hosts signal handlers for responding to external events) and returns immediately. Once it returned, the component is able to respond to external events (e.g., I/O) via the signal handlers. When triggered, a signal handler applies a state change to the component and returns. It never blocks.
All modern components follow this pattern to great success. So I recommend you to design your component following the same approach. For an illustrative nontrivial example, please have a look at 'os/src/server/input_filter/'.
That said, for compatibility with ported 3rd-party software, we actually provide an implementation of the pthread API including the support for condition variables. You may have a look at 'libports/src/lib/pthread/'. When using the libc, functions like 'read' and 'select' obviously block for I/O. So technically, Genode covers that. But please be aware that the use of POSIX goes against the grain of the actual Genode API. For hosting existing 3rd-party software on Genode, there is no way around it. But we shun it when creating new components from scratch.
I cannot give any statement about C++ condition variables specifically. If they use the pthread API under the hood, you may be lucky to add 'stdcxx' to the 'LIBS' of your target. But as I said above, I'd advice against it.
Cheers Norman