I understand that EV_PERSIST basically means that one does not have to continually reschedule the event upon the event occuring.
Consider the following simple test case and my following question on it... #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #include <sys/time.h> #include <event.h> int pfd[2]; int persist[2]; struct event e; void rp(int fd, short event, void *p) { struct timeval tv = { 4, 0 }; time_t tn, *t = p; char c; tn = time(NULL); fprintf(stderr, "event callback, tdiff == %lu\n", tn - *t); if (event == EV_TIMEOUT) { fprintf(stderr, "timeout\n"); if (!persist[1]) event_add(&e, &tv); return; } else if (!persist[0]) { event_add(&e, &tv); } read(fd, &c, 1); fprintf(stderr, "writing to pipe\n"); write(pfd[1], ".", 1); sleep(1); return; } int main(int argc, char **argv) { struct timeval tv = { 4, 0 }; time_t t = time(NULL); pipe(pfd); write(pfd[1], ".", 1); persist[0] = argc > 1 ? EV_PERSIST : 0; persist[1] = argc > 2 ? 1 : 0; event_init(); event_set(&e, pfd[0], EV_READ | persist[0], rp, &t); event_add(&e, &tv); event_dispatch(); return 0; } $ gcc -o evs evs.c -levent 1. Here, we schedule an event and continually reschedule it upon the event firing. No timeout ever occurs because we are writing to the pipe every second. This seems like intuitive and normal behavior to me, with regards to timeouts (they never occur because we're writing): $ ./evs event callback, tdiff == 0 writing to pipe event callback, tdiff == 1 writing to pipe event callback, tdiff == 2 writing to pipe event callback, tdiff == 3 writing to pipe event callback, tdiff == 4 writing to pipe event callback, tdiff == 5 writing to pipe event callback, tdiff == 6 writing to pipe ^C 2. Here, we set EV_PERSIST, write an initial byte and then write to the pipe just like the previous example. However the part that seems entirely unintuitive to me is that a timeout event is being fired almost as if the timeout was based on absolute time. I would think that it would be expected behavior that if one were to set a timeout with event_set(), the timeout will only be fired if the event does not occur within the specified timeout period - just as if you were to be doing a typical "tv.tv_sec = tout; ret = select(..., &tv);" loop. But that idiom is not what is followed when using EV_PERSIST. The timeout occurs anyways, even if a read event is continuously being fired. What am I missing here? $ ./evs p event callback, tdiff == 0 writing to pipe event callback, tdiff == 1 writing to pipe event callback, tdiff == 2 writing to pipe event callback, tdiff == 3 writing to pipe event callback, tdiff == 4 timeout event callback, tdiff == 4 writing to pipe event callback, tdiff == 5 writing to pipe event callback, tdiff == 6 writing to pipe event callback, tdiff == 7 writing to pipe event callback, tdiff == 8 timeout event callback, tdiff == 8 writing to pipe event callback, tdiff == 9 writing to pipe ^C 3. event_dispatch() will return if we do not reschedule the event after a timeout occurs, even with EV_PERSIST. I don't have any issue with this, but it did surprise me when I first started using the library. $ ./evs p p event callback, tdiff == 0 writing to pipe event callback, tdiff == 1 writing to pipe event callback, tdiff == 2 writing to pipe event callback, tdiff == 3 writing to pipe event callback, tdiff == 4 timeout $ Documentation for that is here: The function event_add() schedules the execution of the ev event when the event specified in event_set() occurs or in at least the time speci- fied in the tv. If tv is NULL, no timeout occurs and the function will only be called if a matching event occurs on the file descriptor. The event in the ev argument must be already initialized by event_set() and may not be used in calls to event_set() until it has timed out or implies event_del() --> ^^^^^^^^^^^^^^^^^^^^^ been removed with event_del(). If the event in the ev argument already has a scheduled timeout, the old timeout will be replaced by the new one. Just took a bit to find it in the manpage. It might want to be more explictly stated in the documentation. -cl _______________________________________________ Libevent-users mailing list Libevent-users@monkey.org http://monkey.org/mailman/listinfo/libevent-users