Attached is a patch that makes event_base_loop() return 2 if it returns
because of a prior call to event_base_loopexit() or
event_base_loopbreak(). This is useful when the caller calls
event_base_loop(base, EVLOOP_ONCE) repeatedly (to do stuff in between
events) and need to know if it should exit.

Patch is against 2.0.2-alpha.

-khc


--- event.c.orig	2009-07-24 20:42:30.000000000 -0700
+++ event.c	2009-08-11 16:23:40.000000000 -0700
@@ -834,12 +834,12 @@ event_base_loop(struct event_base *base,
 		/* Terminate the loop if we have been asked to */
 		if (base->event_gotterm) {
 			base->event_gotterm = 0;
-			break;
+			return (EVLOOP_RET_BREAK);
 		}
 
 		if (base->event_break) {
 			base->event_break = 0;
-			break;
+			return (EVLOOP_RET_BREAK);
 		}
 
 		timeout_correct(base, &tv);
@@ -858,7 +858,7 @@ event_base_loop(struct event_base *base,
 		/* If we have no events, we just exit */
 		if (!event_haveevents(base) && !base->event_count_active) {
 			event_debug(("%s: no events registered.", __func__));
-			return (1);
+			return (EVLOOP_RET_NO_EVENTS);
 		}
 
 		/* update last old time */
--- include/event2/event.h.orig	2009-07-24 20:42:30.000000000 -0700
+++ include/event2/event.h	2009-08-11 16:23:23.000000000 -0700
@@ -254,6 +254,9 @@ int event_base_set(struct event_base *, 
 /*...@{*/
 #define EVLOOP_ONCE	0x01	/**< Block at most once. */
 #define EVLOOP_NONBLOCK	0x02	/**< Do not block. */
+
+#define EVLOOP_RET_NO_EVENTS	1	/**< No events registered */
+#define EVLOOP_RET_BREAK	2	/**< Loop exit was requested */
 /*...@}*/
 
 /**
@@ -263,9 +266,10 @@ int event_base_set(struct event_base *, 
 
   @param eb the event_base structure returned by event_init()
   @param flags any combination of EVLOOP_ONCE | EVLOOP_NONBLOCK
-  @return 0 if successful, -1 if an error occurred, or 1 if no events were
-    registered.
-  @see event_loopexit(), event_base_loop()
+  @return 0 if successful, -1 if an error occurred, EVLOOP_RET_NO_EVENTS if
+          no events were registered, or EVLOOP_RET_BREAK if
+          event_base_loopexit()/event_base_loopbreak() was called
+  @see event_base_loopexit(), event_base_loop()
   */
 int event_base_loop(struct event_base *, int);
 
_______________________________________________
Libevent-users mailing list
Libevent-users@monkey.org
http://monkeymail.org/mailman/listinfo/libevent-users

Reply via email to