Hello
I want to use the Genode signalling scheme
to control asynchrones data exchange between a client and a server. To get
familiar with it I started with a test implementation on the server side.
The server’s main function
fills some data into a buffer and instantiates a Signal receiver thread
which shall dump the buffer content on signal reception. Then it instantiates a
Signal transmitter to fire a signal at the receiver for one time. The
unexpected outcome is that it looks as if the receiver gets the signal twice.
This is the implementation in main():
Signal_receiver
s_rcvr;
Signal_context
ct;
Receiver
*ser_rx = new (env()->heap()) Receiver(s_rcvr, srv.transmit);
Signal_context_capability send_cap = s_rcvr.manage(&ct);
Signal_transmitter tx(send_cap);
tx.submit();
The receiver thread’s entry()
function (class Receiver derived from class Thread<>; the
constructor’s 2nd parameter is a handle to the buffer already
filled with data, which is accessed thru _transmit inside the
function):
void entry()
{
uint8_t ch[32];
int cnt = 0;
while (1)
{
Signal signal = _receiver.wait_for_signal();
#if 1
for (unsigned out = 0; out < sizeof(ch); ++out)
{
int rd = _transmit.read_byte();
if (rd >= 0) ch[out] = uint8_t(rd);
else break;
}
++cnt;
ch[31] = '\0';
printf("Found characters: %s\n", &ch[0]);
ch[0] = '\0';
printf("Caught signals: %d\n", cnt);
#endif
}
}
The debug output shows that the 2 printf()s
inside the while() loop are called 2 times, which clearly indicates that
_receiver.wait_for_signal() returned 2 times. I wonder what goes wrong, and what I should do to
get rid of this odd behaviour.
Regards
Frank