You are viewing a plain text version of this content. The canonical link for it is here.
Posted to proton@qpid.apache.org by Michael Ivanov <iv...@logit-ag.de> on 2015/05/06 22:48:48 UTC
Selectables usage
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: ivans@logit-ag.de |
^ ^ | |