[zeromq-dev] zloop_timer() does not fire if added after zloop_start()...

KIU Shueng Chuan nixchuan at gmail.com
Thu Dec 27 12:13:30 CET 2012

If you have already started the reactor, are you not then trying to add a
timer from another thread? The code is not thread-safe, so you shouldn't be
doing it.
On Dec 27, 2012 6:21 PM, "Andy Ballingall TF" <ballingall at thefoundry.co.uk>

> Hi,
> CZMQ's zloop reactor (  http://czmq.zeromq.org/manual:zloop ) is a
> handy thing, but one thing caught me out.
> In my design, after starting a reactor (with zloop_start()), I wanted
> to later add a timer (with zloop_timer() ). However, this timer didn't
> appear to fire when expected (or at all).
> After looking at the source code, it became clear why. (See line 357,
> https://github.com/zeromq/czmq/blob/master/src/zloop.c ). The reactor
> implementation is a 'tickless' design which calls zmq_poll() with a
> timeout (s_tickless_timer) equalling the first expiring timer. If
> there are no timers, then it'll default to an hour. So if you add a
> timer once it's running, then because it's already in zmq_poll with a
> timeout of an hour, it doesn't have the chance to exit the zmq_poll
> and update s_tickless_timer.
> In my case, I changed my design slightly to work with a heartbeat
> timer which was added before calling zloop_start(), but I can see
> other scenarios where it would be good to be able to add and remove
> timers after calling zloop_start(), and be guaranteed that the timers
> would fire when required.
> This issue may be masked in those cases where a timer is added to a
> reactor which already has a timer in place, because when the first
> timer expires, it gives the reactor the chance to recalculate the
> correct s_tickless_timer, taking into account the timer you've just
> added. If the first timer should fire first, you won't notice the
> issue. However, if the second timer should fire first, it will miss
> that first firing.
> There's no mention of this shortcoming in the docs, but It doesn't
> look like an easy thing to solve, so maybe just mentioning it in the
> documentation would be enough to help others who might run into the
> issue... or is there another way to add and remove timers dynamically
> once zloop_start() has begin and be sure that each timer first when
> required?
> This slight issue aside, the zloop reactor is a lovely thing. I'm
> currently using it in 2 places and it saves many lines of code.
> Andy
> --
> Andy Ballingall
> Senior Software Engineer
> The Foundry
> 6th Floor, The Communications Building,
> 48, Leicester Square,
> London, WC2H 7LT, UK
> Tel: +44 (0)20 7968 6828 - Fax: +44 (0)20 7930 8906
> Web: http://www.thefoundry.co.uk/
> The Foundry Visionmongers Ltd.
> Registered in England and Wales No: 4642027
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org
> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20121227/da3f4357/attachment.htm>

More information about the zeromq-dev mailing list