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