Module: xenomai-forge
Branch: master
Commit: 6539b8c1641bf9ad31384ba197c82a892c7ed0dc
URL:    
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=6539b8c1641bf9ad31384ba197c82a892c7ed0dc

Author: Philippe Gerum <r...@xenomai.org>
Date:   Mon Nov  7 10:33:02 2011 +0100

copperplate/debug: fix async-unsafe sections

---

 lib/copperplate/debug.c |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/lib/copperplate/debug.c b/lib/copperplate/debug.c
index a02eb3b..fce9455 100644
--- a/lib/copperplate/debug.c
+++ b/lib/copperplate/debug.c
@@ -49,14 +49,17 @@ void backtrace_log(int retval, const char *fn,
 {
        struct backtrace_data *btd;
        struct error_frame *ef;
+       int state;
 
        btd = pthread_getspecific(btkey);
        if (btd == NULL)
                btd = &main_btd;
 
+       pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &state);
+
        ef = xnmalloc(sizeof(*ef));
        if (ef == NULL)
-               return;
+               goto out;
 
        ef->retval = retval;
        ef->lineno = lineno;
@@ -73,14 +76,19 @@ void backtrace_log(int retval, const char *fn,
        btd->inner = ef;
 
        write_unlock(&btd->lock);
+out:
+       pthread_setcanceltype(state, NULL);
 }
 
 static void flush_backtrace(struct backtrace_data *btd)
 {
        struct error_frame *ef, *nef;
+       int state;
 
        /* Locking order must be __printlock, then btlock. */
 
+       pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &state);
+
        write_lock(&btd->lock);
 
        for (ef = btd->inner; ef; ef = nef) {
@@ -90,6 +98,8 @@ static void flush_backtrace(struct backtrace_data *btd)
 
        btd->inner = NULL;
        write_unlock(&btd->lock);
+
+       pthread_setcanceltype(state, NULL);
 }
 
 void backtrace_init_context(struct backtrace_data *btd,


_______________________________________________
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git

Reply via email to