Hallo,
I am trying to integrate protom messenger with a regular select-based event
loop.
Regrettably there's not much documentation about reading and sendingn messages
in passive mode using selectros. Can you give a quick look to the pseudo-code,
describing message input in my event loop andverify whether I understand it
correctly?
Here goess the pseudo-code:
for (;;) {
foreach messenger:
messenger::recv(N); // Make sure message read automata is
started.
foreach selectable in messenger:
if (is_registered(selectable))
continue; // Selectable is already in use by
event loop
// Create an I/O object which refers to selectable
// and add it to the I/O list
iolist << new IO(selectable)
foreach iolist item:
if is_terminal(item):
Remove item from iolist
pn_selectable_free(item::selectable)
continue;
if is_readable:
add selection fd to read mask
if is_writable:
add selection fd to write mask
if (selection has deadline)
schedule timer for this iolist item
select(read_mask, write_mask, timeout)
foreach iolist item:
if (read event signalled)
pn_selectable_readable(item::selection)
if (write event signalled)
pn_selectable_writable(item::selection)
If we had any read events check whether some messages
were placed into input queue. If no messages are available
pn_messenger_get() will not block, but rather will return
PN_EOS
foreach messenger:
while pn_messenger_get(messenger, message) != PN_EOS
Handle input message
Check whether some timers have expired. If expired timer
refers to the proton I/O object, delete this object
(this will also exclude it from iolist and select masks)
}
All messengers are created in non-blocking and passive mode.
Some of the messengers are already subscribed to queues.
To send messages I just use pn_messenger_put as usual and
pn_selectable_writable takes care about actual message delivery.
Best regards,
--
\ / | |
(OvO) | Mikhail Iwanow |
(^^^) | Voice: +7 (911) 223-1300 |
\^/ | E-mail: [email protected] |
^ ^ | |