diff options
author | Mark Ellzey <socket@gmail.com> | 2015-05-15 02:58:14 -0700 |
---|---|---|
committer | Mark Ellzey <socket@gmail.com> | 2015-05-15 02:58:14 -0700 |
commit | dcfb19a27b7760299bc9e7291c9abd88c59fd91a (patch) | |
tree | 67bd1362a92dcde89186c52492d73bfd4b676c09 /event.c | |
parent | 6c8cb5ef7edd72547761d0a62a5e872a1423c8f5 (diff) | |
download | libevent-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.c | 16 |
1 files changed, 16 insertions, 0 deletions
@@ -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; |