qpid-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Rafael Schloming <...@alum.mit.edu>
Subject Re: Selectables usage
Date Thu, 07 May 2015 13:47:47 GMT
That looks mostly correct to me. I've made a few notes inline...

On Thu, May 7, 2015 at 9:27 AM, Michael Ivanov <ivans@logit-ag.de> wrote:

> Hallo,
>
> I am trying to integrate proton messenger with a regular select-based
> event loop.
> Regrettably there's not much documentation about reading and sendingn
> messages
> in passive mode using selectors. Can you give a quick look to the
> pseudo-code,
> describing message input in my event loop and verify whether I understand
> it
> correctly?
>
> Here goes 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)
>

You also want to do if (deadline for selectable expired)
pn_selectable_expired(item::selection) here.


>
>    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)
>

This isn't quite right. The timer expiring doesn't mean you should throw
out the selectable, it simply means you should signal the timing event
using the call to pn_selectable_expired as described above.


>
> }
>
> 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.
>


Other than the notes above, I believe this is correct.

--Rafael

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message