Hi Marc, I think the documentation is very clear on this:
The function event_set() prepares the event structure ev to be used in future calls to event_add() and event_del(). The event will be prepared to call the function specified by the fn argument with an int argument indicating the file descriptor, a short argument indicating the type of event, and a void * argument given in the arg argument. The fd indicates the file descriptor that should be monitored for events. The events can be either EV_READ, EV_WRITE, or both, indicating that an application can read or write from the file descriptor respectively without blocking. Perhaps you might like to create a libev mailing list and discuss further development of libev there? I find your somewhat discourteous insinuation of bugs distracting. Thank you, Niels. On 11/3/07, Marc Lehmann <[EMAIL PROTECTED]> wrote: > While debugging a problem of http.c with libev, I found this code > in evhttp_write_buffer: > > if (event_pending(&evcon->ev, EV_WRITE|EV_TIMEOUT, NULL)) > event_del(&evcon->ev); > > event_set(&evcon->ev, evcon->fd, EV_WRITE, evhttp_write, evcon); > evhttp_add_event(&evcon->ev, evcon->timeout, HTTP_WRITE_TIMEOUT); > > now, event_set initialises a struct event. the problem with the above code > is that it calls event_set on a struct event that is currently in use and > expects it to work. > > this doesn't directly contradict the sparse documentation, but is rather > weird. > > looking at event_set closely, I see that it doesn't initialise the struct > event > fully (but it does initialiseev_flags). > > I also saw that some parts of the testsuite are indeed expecting that > libevent treats struct events that have never been initialised by an > event_set "properly" (= ignoring them). > > I therefore conclude that there is no function in libevent that actually > initialises struct events. > > This strikes me as a rather weird design, especially as it requires the user > of libevent to clear all his struct events before passing it to event_set. > > It also is not threadsafe, as event_set overwrites ev_base with current_base > which might not be the correct one. > > Note also that some tets programs do not properly clear the event structure > they allocate (test-time for example). > > This makes me wonder about these questions: > > 1. could anybody confirm wether a user must clear the struct event before > passing it to event_set? > 2. shouldn't this rather fundamental requirement be documented *somewhere*? > 3. is there some guarantee that one can call event_add/del on cleared memory > arrays and this will not crash? > 4. will the code fragment above not cause an event to be added twice to some > lists, as event_set clears the flags that event_add uses to detect wether > an event is already on the list? > > In any case, I can manage in the libev emulation layer by also relying > on some "has been initialiased before" flag, but this is of course no > guarantee that code like the above will ever work (and I suspect it will > not). > > In general, this whole design strikes me as rather messy. > > (in libev, you always have to call one of the watcher initialiser macros > that do not depend on earlier contents). > > Thanks a lot for any insights. > > -- > The choice of a Deliantra, the free code+content MORPG > -----==- _GNU_ http://www.deliantra.net > ----==-- _ generation > ---==---(_)__ __ ____ __ Marc Lehmann > --==---/ / _ \/ // /\ \/ / [EMAIL PROTECTED] > -=====/_/_//_/\_,_/ /_/\_\ > _______________________________________________ > Libevent-users mailing list > Libevent-users@monkey.org > http://monkey.org/mailman/listinfo/libevent-users > > _______________________________________________ Libevent-users mailing list Libevent-users@monkey.org http://monkey.org/mailman/listinfo/libevent-users