discomfitor pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=1de5c251d13a7625000d24e7e8e909a45a2dd703
commit 1de5c251d13a7625000d24e7e8e909a45a2dd703 Author: Mike Blumenkrantz <[email protected]> Date: Fri Jun 15 16:56:06 2018 -0400 eina_debug: add function to reset debug subsystem after fork fork() kills this entire subsystem and leaves its internals in an inactive but allocated state, so it's necessary to explicitly restart everything in order to guarantee behavior @feature Differential Revision: https://phab.enlightenment.org/D6307 --- src/lib/eina/eina_debug.c | 11 +++++++++++ src/lib/eina/eina_debug.h | 7 +++++++ src/lib/eina/eina_debug_cpu.c | 3 +++ src/lib/eina/eina_lock.c | 3 +++ 4 files changed, 24 insertions(+) diff --git a/src/lib/eina/eina_debug.c b/src/lib/eina/eina_debug.c index ebfe9b6b5c..b71f422123 100644 --- a/src/lib/eina/eina_debug.c +++ b/src/lib/eina/eina_debug.c @@ -762,3 +762,14 @@ eina_debug_shutdown(void) eina_threads_shutdown(); return EINA_TRUE; } + +EAPI void +eina_debug_fork_reset(void) +{ + extern Eina_Bool fork_resetting; + + fork_resetting = EINA_TRUE; + eina_debug_shutdown(); + eina_debug_init(); + fork_resetting = EINA_FALSE; +} diff --git a/src/lib/eina/eina_debug.h b/src/lib/eina/eina_debug.h index a5ef86b0f3..132f598875 100644 --- a/src/lib/eina/eina_debug.h +++ b/src/lib/eina/eina_debug.h @@ -300,6 +300,13 @@ EAPI Eina_Debug_Timer *eina_debug_timer_add(unsigned int timeout_ms, Eina_Debug_ EAPI void eina_debug_timer_del(Eina_Debug_Timer *timer); /** + * @brief Reset the eina debug system after forking + * + * Call this any time the application forks + * @since 1.21 + * */ +EAPI void eina_debug_fork_reset(void); +/** * @} */ diff --git a/src/lib/eina/eina_debug_cpu.c b/src/lib/eina/eina_debug_cpu.c index 2a8d617584..2cc382d84b 100644 --- a/src/lib/eina/eina_debug_cpu.c +++ b/src/lib/eina/eina_debug_cpu.c @@ -337,9 +337,12 @@ _eina_debug_cpu_init(void) Eina_Bool _eina_debug_cpu_shutdown(void) { + extern Eina_Bool fork_resetting; + if (_eina_debug_sysmon_active) eina_lock_take(&_sysmon_lock); _eina_debug_cpu_active = 0; + if (!fork_resetting) eina_condition_wait(&_exit_cond); eina_condition_free(&_exit_cond); eina_lock_release(&_sysmon_lock); diff --git a/src/lib/eina/eina_lock.c b/src/lib/eina/eina_lock.c index 9c560df38e..aa085cd15a 100644 --- a/src/lib/eina/eina_lock.c +++ b/src/lib/eina/eina_lock.c @@ -52,9 +52,12 @@ _eina_spinlock_macos_release(Eina_Spinlock *spinlock) #endif /* EINA_HAVE_OSX_SPINLOCK */ +Eina_Bool fork_resetting; + EAPI void _eina_lock_debug_abort(int err, const char *fn, const volatile void *ptr) { + if (fork_resetting) return; fprintf(stderr, "EINA ERROR: '%s' on %s %p\n", strerror(err), fn, ptr); #ifdef EINA_HAVE_DEBUG_THREADS abort(); --
