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

Author: Philippe Gerum <r...@xenomai.org>
Date:   Tue Jul 29 09:18:20 2014 +0200

copperplate/threadobj: protect lock in barrier wait

---

 lib/copperplate/threadobj.c |    4 ++++
 1 file changed, 4 insertions(+)

diff --git a/lib/copperplate/threadobj.c b/lib/copperplate/threadobj.c
index 05bb6cb..48aa032 100644
--- a/lib/copperplate/threadobj.c
+++ b/lib/copperplate/threadobj.c
@@ -1045,9 +1045,11 @@ static int wait_on_barrier(struct threadobj *thobj, int 
mask)
                if (status & mask)
                        break;
                oldstate = thobj->cancel_state;
+               push_cleanup_lock(&thobj->lock);
                __threadobj_tag_unlocked(thobj);
                __RT(pthread_cond_wait(&thobj->barrier, &thobj->lock));
                __threadobj_tag_locked(thobj);
+               pop_cleanup_lock(&thobj->lock);
                thobj->cancel_state = oldstate;
        }
 
@@ -1243,9 +1245,11 @@ static void cancel_sync(struct threadobj *thobj) /* 
thobj->lock held */
         */
        while (thobj->status & __THREAD_S_WARMUP) {
                oldstate = thobj->cancel_state;
+               push_cleanup_lock(&thobj->lock);
                __threadobj_tag_unlocked(thobj);
                __RT(pthread_cond_wait(&thobj->barrier, &thobj->lock));
                __threadobj_tag_locked(thobj);
+               pop_cleanup_lock(&thobj->lock);
                thobj->cancel_state = oldstate;
        }
 


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

Reply via email to