Hi, thanks for your reply. You understood well. I used both flags EVLOOP_ONCE and EVLOOP_NONBLOCK while creating event_base. I was already able to fix it with the timer, or file descriptor and it works just as I want. As I said I was just surprised, that it works differently with event_active function and timer/fd solution (both makes event active all the time).
Thanks for your explanation! harnen 2011/5/3 Nick Mathewson <ni...@freehaven.net> > On Fri, Apr 29, 2011 at 5:43 AM, Michał Król <mhar...@gmail.com> wrote: > > Hi, > > > > I had some problems using event_active() function, and as I'm not sure > > weather it's a bug or not I've decided to write about it. > > > > I'm using two event bases, sender_base and feeder_base. sender_base runs > as > > a main program loop using event_dispatch(). If there is nothing to send > it > > calls event_base_loop() on feeder_base which fills the buffer (with > events > > reading from files which(events) are all the time active). > > So in feeder_base there are many all the time pending events and there > are > > invoked one by one when event_base_loop() is called. > > > > It worked perfectly fine unless I've decided to add to the feeder_base > event > > which invokes itself by event_active and not by file descriptor + > EV_READ. > > This event was filling the buffer and then rescheduling itself calling > > event_active(). I've expected that after calling event_active event will > be > > just scheduled as pending and invoked during next call of > event_base_loop(). > > But from this time it was invoking itself infinitely within one loop of > > feeder_base. I was able to override this problem by opening random file > > (like /dev/zero) and invoking this event based on EV_READ and not by > > event_active. Anyway I'm just not sure if event_active is supposed to > work > > like this or it's kind of a bug, so I've decided to write about it. > > > > I know my architecture is a bit messy, but I hope my description is clear > > enough. > > Hi! I've tried reading your explanation but I'm afraid I'm unclear on > what you mean, so if I have it wrong below, please let me know what > you really meant. > > I think you're saying that you're calling event_base_loop() with the > EVLOOP_ONCE or EVLOOP_NONBLOCK flag set, and you're calling > event_active() on an event from inside an event callback. You want > the event_active() to schedule the event's callback to run the *next* > time you call event_base_loop(), but instead it is scheduling it for > *this* iteration. > > Question 1: Is it a bug? (Skip this if you just want your program to > work.) > > According to the documentation, I think the current behavior is > allowed by EVLOOP_ONCE, where the doxygen says: "Block until we have > an active event, then exit once all active events have had their > callbacks run" and the book says "wait until some events become > active, then run active events until there are no more to run, then > return." > > EVLOOP_NONBLOCK is murkier: the doxygen says "Do not block: see which > events are ready now, run the callbacks [of the] highest-priority > ones, then exit" and the book says "check whether any events are ready > to trigger immediately, and run their callbacks if so." The former is > ungrammatical and missing some words (I just fixed it in git). Both > are unclear as to whether events that are made active while the other > events' callbacks are running should get their callbacks invoked > during this event_base_loop() or not. I should try to clarify this; > I'd welcome patches to the documentation and/or the book to make > either more accurate. > > The pseudocode in the book still looks right to me, but it's a bit > late here and I could be missing something. > > Question 2: Ignoring whether it's a bug, what's the best way to do > what you want? > > If you want the event activated on the next time through the loop and > absolutely not this time, I'd consider an timeout event with a > duration of 0. > > hoping this helps, > -- > Nick > *********************************************************************** > To unsubscribe, send an e-mail to majord...@freehaven.net with > unsubscribe libevent-users in the body. >