discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=9d2d1a267709a2a20bad312e5a1e1e15a756b70b

commit 9d2d1a267709a2a20bad312e5a1e1e15a756b70b
Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Jun 15 16:51:03 2018 -0400

    eina_debug_cpu: make shutdown perform cleanups and kill the timer thread
    
    this should not remain active after eina has been deactivated, so ensure
    that everything stops as expected
    
    ref T7019
    
    Differential Revision: https://phab.enlightenment.org/D6305
---
 src/lib/eina/eina_debug_cpu.c | 65 ++++++++++++++++++++++++-------------------
 1 file changed, 37 insertions(+), 28 deletions(-)

diff --git a/src/lib/eina/eina_debug_cpu.c b/src/lib/eina/eina_debug_cpu.c
index e21131f083..2a8d617584 100644
--- a/src/lib/eina/eina_debug_cpu.c
+++ b/src/lib/eina/eina_debug_cpu.c
@@ -34,10 +34,11 @@
 volatile int           _eina_debug_sysmon_reset = 0;
 volatile int           _eina_debug_sysmon_active = 0;
 volatile int           _eina_debug_evlog_active = 0;
+volatile int           _eina_debug_cpu_active = 0;
 
 Eina_Lock       _sysmon_lock;
+static Eina_Condition  _exit_cond;
 
-static Eina_Bool       _sysmon_thread_runs = EINA_FALSE;
 static pthread_t       _sysmon_thread;
 
 // this is a DEDICATED thread tojust collect system info and to have the
@@ -77,6 +78,7 @@ _sysmon(void *_data EINA_UNUSED)
         // wait on a mutex that will be locked for as long as this
         // threead is not meant to go running
         eina_lock_take(&_sysmon_lock);
+        if (!_eina_debug_cpu_active) break;
         // if we need to reset as we just started polling system stats...
         if (_eina_debug_sysmon_reset)
           {
@@ -247,6 +249,8 @@ _sysmon(void *_data EINA_UNUSED)
           }
         usleep(1000); // 1ms sleep
      }
+   eina_condition_signal(&_exit_cond);
+   eina_lock_release(&_sysmon_lock);
    return NULL;
 }
 
@@ -294,39 +298,36 @@ EINA_DEBUG_OPCODES_ARRAY_DEFINE(_OPS,
 Eina_Bool
 _eina_debug_cpu_init(void)
 {
-   // if it's already running - we're good.
 #ifndef _WIN32
-   if (!_sysmon_thread_runs)
-     {
-        int err;
-        sigset_t oldset, newset;
+   int err;
+   sigset_t oldset, newset;
 
-        eina_lock_new(&_sysmon_lock);
-        eina_lock_take(&_sysmon_lock);
-        sigemptyset(&newset);
-        sigaddset(&newset, SIGPIPE);
-        sigaddset(&newset, SIGALRM);
-        sigaddset(&newset, SIGCHLD);
-        sigaddset(&newset, SIGUSR1);
-        sigaddset(&newset, SIGUSR2);
-        sigaddset(&newset, SIGHUP);
-        sigaddset(&newset, SIGQUIT);
-        sigaddset(&newset, SIGINT);
-        sigaddset(&newset, SIGTERM);
+   eina_lock_new(&_sysmon_lock);
+   eina_lock_take(&_sysmon_lock);
+   sigemptyset(&newset);
+   sigaddset(&newset, SIGPIPE);
+   sigaddset(&newset, SIGALRM);
+   sigaddset(&newset, SIGCHLD);
+   sigaddset(&newset, SIGUSR1);
+   sigaddset(&newset, SIGUSR2);
+   sigaddset(&newset, SIGHUP);
+   sigaddset(&newset, SIGQUIT);
+   sigaddset(&newset, SIGINT);
+   sigaddset(&newset, SIGTERM);
 #ifdef SIGPWR
-        sigaddset(&newset, SIGPWR);
+   sigaddset(&newset, SIGPWR);
 #endif
-        pthread_sigmask(SIG_BLOCK, &newset, &oldset);
+   pthread_sigmask(SIG_BLOCK, &newset, &oldset);
+   _eina_debug_cpu_active = 1;
+   eina_condition_new(&_exit_cond, &_sysmon_lock);
 
-        err = pthread_create(&_sysmon_thread, NULL, _sysmon, NULL);
+   err = pthread_create(&_sysmon_thread, NULL, _sysmon, NULL);
 
-        pthread_sigmask(SIG_SETMASK, &oldset, NULL);
-        if (err != 0)
-          {
-             e_debug("EINA DEBUG ERROR: Can't create debug sysmon thread!");
-             abort();
-          }
-        _sysmon_thread_runs = EINA_TRUE;
+   pthread_sigmask(SIG_SETMASK, &oldset, NULL);
+   if (err != 0)
+     {
+        e_debug("EINA DEBUG ERROR: Can't create debug sysmon thread!");
+        abort();
      }
    eina_debug_opcodes_register(NULL, _OPS(), NULL, NULL);
 #endif
@@ -336,6 +337,14 @@ _eina_debug_cpu_init(void)
 Eina_Bool
 _eina_debug_cpu_shutdown(void)
 {
+   if (_eina_debug_sysmon_active)
+     eina_lock_take(&_sysmon_lock);
+   _eina_debug_cpu_active = 0;
+     eina_condition_wait(&_exit_cond);
+   eina_condition_free(&_exit_cond);
+   eina_lock_release(&_sysmon_lock);
+   eina_lock_free(&_sysmon_lock);
+   _eina_debug_sysmon_reset = _eina_debug_sysmon_active = 
_eina_debug_evlog_active = 0;
    return EINA_TRUE;
 }
 

-- 


Reply via email to