Gonzalo, Brian,
Yes. The API should mimic the native API of the language if any.
What I rather had in mind was how to move most of the functionality
directly to C API. If C API provides most of it, it would be much easier
for bindings to wrap it and - additionally - it would ensure exactly the
same behaviour for all the languages.
Here are my thoughs:
1. The current API - although it matches POSIX poll - is not good
because passing arrays of structures to and out of zmq_poll is not
trivially mimicked by other languages.
2. The API should provide a 'poller' object (as currently done in most
language bindings) and individual associated functions
(adding/modifying/removing sockets, getting events etc.) should be
prototyped in a way to require only simple types as arguments.
3. Poller object should be initialised from context object - the point
is that even when there's no 0MQ socket in the pollset, just standard
POSIX sockets, we still want the poll to exit when context is destroyed
(ETERM).
4. Adding/removing/modifying items in the poll set can be presumably
done by a single function. If the socket is not yet in the pollset it
will be added, if the IN/OUT/ERR flags match the current item in the
pollset, they will be modified. If there's none of the flags set, the
socket will be removed from the pollset.
5. I am not sure how retrieving events should work, however, experience
with similar interfaces (epoll/devpoll/kqueue) seems to indicate that
the event returned should contain:
a.) the socket
b.) the event (IN/OUT/ERR)
c.) a hint (arbitrary object attached to the pollitem)
Presumably, the events should be retrieved from the poller one by one
rather than as a set.
Thoughts?
Martin
gonzalo diethelm wrote:
>> Well, I would say that polling is ripe to get some standardised
>> interface. Something like epoll/kqueue.
>>
>> There's one provided by Python binding, now there's Java, Lisp copies
>> the C interface, not sure about PHP and other languages...
>>
>> Thoughts anyone?
>
> To get this discussion going, here is an example of how things work in
> Java now:
>
> // create a 0MQ context that has poll enabled
> ZMQ.Context ctx = ZMQ.context(1, 1, ZMQ.POLL);
>
> // create two sockets
> ZMQ.Socket spip = ctx.socket(ZMQ.REQ);
> ZMQ.Socket smsg = ctx.socket(ZMQ.PUB);
>
> // create a poller for two sockets
> ZMQ.Poller poller = ctx.poller(2);
>
> // configure poller to wait forever
> poller.setTimeout(-1);
>
> // will poll for INPUT on socket spip.
> // ip is the index for sockete spip in the poll set.
> int ip = poller.register(spip, ZMQ.POLLIN);
>
> // will poll for OUTPUT on socket smsg
> // im is the index for sockete smsg in the poll set.
> int im = poller.register(smsg, ZMQ.POLLOUT);
>
> // loop forever; this loop should have a termination clause!
> while (true) {
> // call poll, possibly block
> long p = poller.poll();
>
> // poll may have spurious returns
> if (p <= 0)
> continue;
>
> // Can we write on smsg? Go ahead.
> if (poller.pollout(im))
> process_messages();
>
> // Can we read on spip? Go ahead.
> if (poller.pollin(ip))
> process_pipe();
> }
>
_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev