barbieri pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=76c3726ef0709b88f17ca1e1f668345227b3b9c4

commit 76c3726ef0709b88f17ca1e1f668345227b3b9c4
Author: Gustavo Sverzut Barbieri <barbi...@profusion.mobi>
Date:   Fri Sep 16 22:17:25 2016 -0300

    eina_thread: don't leak on pthread_cancel().
    
    if we cancel a thread we should still free the context, so use the new
    EINA_THREAD_CLEANUP_PUSH() and EINA_THREAD_CLEANUP_POP()
---
 src/lib/eina/eina_thread.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/lib/eina/eina_thread.c b/src/lib/eina/eina_thread.c
index f698092..f875504 100644
--- a/src/lib/eina/eina_thread.c
+++ b/src/lib/eina/eina_thread.c
@@ -137,6 +137,8 @@ _eina_internal_call(void *context)
    pthread_t self;
 #endif
 
+   EINA_THREAD_CLEANUP_PUSH(free, c);
+
    if (c->prio == EINA_THREAD_BACKGROUND ||
        c->prio == EINA_THREAD_IDLE)
      eina_sched_prio_drop();
@@ -144,13 +146,14 @@ _eina_internal_call(void *context)
 #ifdef EINA_HAVE_DEBUG
    self = pthread_self();
    _eina_debug_thread_add(&self);
+   EINA_THREAD_CLEANUP_PUSH(_eina_debug_thread_del, &self);
 #endif
    r = c->func((void*) c->data, eina_thread_self());
 #ifdef EINA_HAVE_DEBUG
-   _eina_debug_thread_del(&self);
+   EINA_THREAD_CLEANUP_POP(EINA_TRUE);
 #endif
 
-   free(c);
+   EINA_THREAD_CLEANUP_POP(EINA_TRUE);
 
    return r;
 }

-- 


Reply via email to