Have a look at the libevent2 reference manual: http://www.wangafu.net/~nickm/libevent-book/Ref3_eventloop.html, it'll explain most stuff in detail and with really great examples.
cheers, Jonas Romfelt 2010/1/29 Donghua Xu <[email protected]>: > Thanks Jonas. I fixed the code like you suggested, using > event_base_loop(global_event_base, 0) and evtimer_add(dummy_event, > &five_seconds). Now the dummy_callback() is indeed called, but the > event_base_loop() exited with a failed status, as show below: > > ***entering main() > ***entering EventLoop() > ***dummy_event=0x60e690 > ***in dummy_callback() > event_base_loop() failed > ***exiting EventLoop() > ***exiting main() > > Any idea what might be wrong? Following is the current code: > > #include <stdlib.h> > #include <stdio.h> > #include "event2/event.h" > > struct event_base *global_event_base; > > static void dummy_callback(evutil_socket_t fd, short what, void *arg) > { > printf("***in dummy_callback()\n"); > } > > static void* EventLoop(void *arg) > { > printf("***entering EventLoop()\n"); > global_event_base = event_base_new(); > if (!global_event_base) { > printf("event_base_new() failed\n"); > exit (-1); > } > > struct timeval five_seconds = {5,0}; > struct event *dummy_event = > evtimer_new(global_event_base, dummy_callback, arg); > > printf("***dummy_event=%p\n", dummy_event); > > evtimer_add(dummy_event, &five_seconds); > > // int ret = event_base_loop(global_event_base, EVLOOP_NONBLOCK); > int ret = event_base_loop(global_event_base, 0); > if (ret!=0) > printf("event_base_loop() failed\n"); > > > printf("***exiting EventLoop()\n"); > return NULL; > } > > int main() > { > printf("***entering main()\n"); > EventLoop(NULL); > printf("***exiting main()\n"); > fflush(stdout); > return 0; > } > > > > On Fri, Jan 29, 2010 at 2:45 AM, Jonas Romfelt <[email protected]> wrote: >> >> Hi, >> >> if I'm not mistaken your call to event_base_loop() will not wait for >> the timer event you added to expire beacuse the EVLOOP_NONBLOCK flag >> is set. Simply because your 5 seconds timer has not yet expired when >> the event_base_loop() is called. >> >> Try: event_base_loop(global_event_base, 0) or >> event_base_loop(global_event_base, EVLOOP_ONCE) if you want to exit >> the loop after the timer expired. >> >> Also, you could change event_add(dummy_event, &five_seconds) to >> evtimer_add(dummy_event, &five_seconds). Event though it's just a >> macro you never know when something under the API may change... >> >> cheers, >> Jonas Romfelt >> >> >> >> 2010/1/29 Donghua Xu <[email protected]> >> > >> > Hi, I just wrote a simple program trying to use the timeout event in >> > libevent 2.0.3-alpha. The source code is at the end of the email. I'm >> > expecting to see a print out of "***in dummy_callback()", but this line >> > does >> > not show up at all. What I am seeing is only: >> > >> > ***entering main() >> > ***entering EventLoop() >> > ***dummy_event=0x60e690 >> > ***exiting EventLoop() >> > ***exiting main() >> > >> > What am I doing wrong in the following source code? A lot of thanks in >> > advance... >> > >> > >> > >> > #include <stdlib.h> >> > #include <stdio.h> >> > #include "event2/event.h" >> > >> > struct event_base *global_event_base; >> > >> > static void dummy_callback(evutil_socket_t fd, short what, void *arg) >> > { >> > printf("***in dummy_callback()\n"); >> > } >> > >> > static void* EventLoop(void *arg) >> > { >> > printf("***entering EventLoop()\n"); >> > global_event_base = event_base_new(); >> > if (!global_event_base) { >> > printf("event_base_new() failed\n"); >> > exit (-1); >> > } >> > >> > struct timeval five_seconds = {5,0}; >> > struct event *dummy_event = >> > evtimer_new(global_event_base, dummy_callback, arg); >> > >> > printf("***dummy_event=%p\n", dummy_event); >> > >> > event_add(dummy_event, &five_seconds); >> > >> > int ret = event_base_loop(global_event_base, EVLOOP_NONBLOCK); >> > if (ret!=0) >> > printf("event_base_loop() failed\n"); >> > >> > >> > printf("***exiting EventLoop()\n"); >> > return NULL; >> > } >> > >> > int main() >> > { >> > printf("***entering main()\n"); >> > EventLoop(NULL); >> > printf("***exiting main()\n"); >> > fflush(stdout); >> > return 0; >> > } >> > >> *********************************************************************** >> To unsubscribe, send an e-mail to [email protected] with >> unsubscribe libevent-users in the body. > > *********************************************************************** To unsubscribe, send an e-mail to [email protected] with unsubscribe libevent-users in the body.
