summaryrefslogtreecommitdiff
path: root/event.c
diff options
context:
space:
mode:
authorMark Ellzey <socket@gmail.com>2015-05-15 02:58:14 -0700
committerMark Ellzey <socket@gmail.com>2015-05-15 02:58:14 -0700
commitdcfb19a27b7760299bc9e7291c9abd88c59fd91a (patch)
tree67bd1362a92dcde89186c52492d73bfd4b676c09 /event.c
parent6c8cb5ef7edd72547761d0a62a5e872a1423c8f5 (diff)
downloadlibevent-dcfb19a27b7760299bc9e7291c9abd88c59fd91a.tar.gz
Debug mode option to error on evthread init AFTER other event calls.
- A handy event_enable_debug_mode() feature which will error and abort the application if any thread-aware libevent functions are called BEFORE the evthread API has been initialized (manually, or through evthread_use_windows_threads() / evthread_use_pthreads() - This is done by setting the global debug variable 'event_debug_created_threadable_ctx_' whenever the following functions are called: evthreadimpl_lock_alloc_() evthreadimpl_cond_alloc_() event_base_new_with_config() <- this checks to see if the thread callbacks are enabled first, so we have to manually set the variable. - Example: int main(int argc, char ** argv) { struct event_base * base; event_enable_debug_mode(); base = event_base_new(); evthread_use_pthreads(); return 0; } When executed, the program will throw an error and exit: [err] evthread initialization must be called BEFORE anything else!
Diffstat (limited to 'event.c')
-rw-r--r--event.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/event.c b/event.c
index acef2b24..a932c3bb 100644
--- a/event.c
+++ b/event.c
@@ -199,6 +199,20 @@ eq_debug_entry(const struct event_debug_entry *a,
}
int event_debug_mode_on_ = 0;
+
+
+/**
+ * @brief debug mode variable which is set for any function/structure that needs
+ * to be shared across threads (if thread support is enabled).
+ *
+ * When and if evthreads are initialized, this variable will be evaluated,
+ * and if set to something other than zero, this means the evthread setup
+ * functions were called out of order.
+ *
+ * See: "Locks and threading" in the documentation.
+ */
+int event_debug_created_threadable_ctx_ = 0;
+
/* Set if it's too late to enable event_debug_mode. */
static int event_debug_mode_too_late = 0;
#ifndef EVENT__DISABLE_THREAD_SUPPORT
@@ -656,6 +670,8 @@ event_base_new_with_config(const struct event_config *cfg)
/* prepare for threading */
#ifndef EVENT__DISABLE_THREAD_SUPPORT
+ event_debug_created_threadable_ctx_ = 1;
+
if (EVTHREAD_LOCKING_ENABLED() &&
(!cfg || !(cfg->flags & EVENT_BASE_FLAG_NOLOCK))) {
int r;