summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <zmike@samsung.com>2018-06-15 16:56:06 -0400
committerMike Blumenkrantz <zmike@samsung.com>2018-06-19 13:55:36 -0400
commit1de5c251d13a7625000d24e7e8e909a45a2dd703 (patch)
treeeda0cd34d7d0e76cf9cbe62e9fbbe7190a33d333
parentbd9edfad0090522fb2e729d5574be082ab0ceff5 (diff)
downloadefl-1de5c251d13a7625000d24e7e8e909a45a2dd703.tar.gz
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
-rw-r--r--src/lib/eina/eina_debug.c11
-rw-r--r--src/lib/eina/eina_debug.h7
-rw-r--r--src/lib/eina/eina_debug_cpu.c3
-rw-r--r--src/lib/eina/eina_lock.c3
4 files changed, 24 insertions, 0 deletions
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();