summaryrefslogtreecommitdiff
path: root/evthread-internal.h
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2010-09-08 13:02:58 -0400
committerNick Mathewson <nickm@torproject.org>2010-09-08 13:09:40 -0400
commitc7a06bfaee7f96327779972214e8b744170531ff (patch)
treed600c8d2acb1a54258d4becc5aa8c54111a8a1f9 /evthread-internal.h
parent495ed66705d5790de031f9591b47afcbe4fc1156 (diff)
downloadlibevent-c7a06bfaee7f96327779972214e8b744170531ff.tar.gz
Avoid needlessly calling evthread_notify_base() when the loop is not running
Also make sure that we always hold the base lock when calling evthread_notify_base.
Diffstat (limited to 'evthread-internal.h')
-rw-r--r--evthread-internal.h13
1 files changed, 11 insertions, 2 deletions
diff --git a/evthread-internal.h b/evthread-internal.h
index d710939a..b7286ded 100644
--- a/evthread-internal.h
+++ b/evthread-internal.h
@@ -48,12 +48,20 @@ extern int _evthread_lock_debugging_enabled;
#define EVTHREAD_GET_ID() \
(_evthread_id_fn ? _evthread_id_fn() : 1)
-/** Return true iff we're in the thread that is currently running a given
- * event_base's loop. */
+/** Return true iff we're in the thread that is currently (or most recently)
+ * running a given event_base's loop. Requires lock. */
#define EVBASE_IN_THREAD(base) \
(_evthread_id_fn == NULL || \
(base)->th_owner_id == _evthread_id_fn())
+/** Return true iff we need to notify the base's main thread about changes to
+ * its state, because it's currently running the main loop in another
+ * thread. Requires lock. */
+#define EVBASE_NEED_NOTIFY(base) \
+ (_evthread_id_fn != NULL && \
+ (base)->running_loop && \
+ (base)->th_owner_id != _evthread_id_fn())
+
/** Allocate a new lock, and store it in lockvar, a void*. Sets lockvar to
NULL if locking is not enabled. */
#define EVTHREAD_ALLOC_LOCK(lockvar, locktype) \
@@ -196,6 +204,7 @@ EVLOCK_TRY_LOCK(void *lock)
#define EVLOCK_UNLOCK2(lock1,lock2,mode1,mode2) _EVUTIL_NIL_STMT
#define EVBASE_IN_THREAD(base) 1
+#define EVBASE_NEED_NOTIFY(base) 0
#define EVBASE_ACQUIRE_LOCK(base, lock) _EVUTIL_NIL_STMT
#define EVBASE_RELEASE_LOCK(base, lock) _EVUTIL_NIL_STMT
#define EVLOCK_ASSERT_LOCKED(lock) _EVUTIL_NIL_STMT