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" <[email protected]> wrote:
> 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 > [email protected] > http://lists.zeromq.org/mailman/listinfo/zeromq-dev >
_______________________________________________ zeromq-dev mailing list [email protected] http://lists.zeromq.org/mailman/listinfo/zeromq-dev
