From 3147ec22a7b01be9046755f11baaf8108650cdcd Mon Sep 17 00:00:00 2001
From: Pedro Gonnet <pedro.gonnet@durham.ac.uk>
Date: Wed, 3 Oct 2012 10:59:51 +0000
Subject: [PATCH] force memory barrier on unlock.

Former-commit-id: a0fabfb1a0670c165c72008aee48a98a67f9011d
---
 src/lock.h   | 2 +-
 src/runner.c | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/lock.h b/src/lock.h
index f79583c90f..c3377ce6bc 100644
--- a/src/lock.h
+++ b/src/lock.h
@@ -45,5 +45,5 @@
         return 0;
         }
     #define lock_trylock( l ) ( ( *(l) ) ? 1 : __sync_val_compare_and_swap( l , 0 , 1 ) )
-    #define lock_unlock( l ) ( *l = 0 )
+    #define lock_unlock( l ) ( __sync_lock_test_and_set( l , 0 ) != 1 )
 #endif
diff --git a/src/runner.c b/src/runner.c
index 08ee5701d4..078007ff6f 100644
--- a/src/runner.c
+++ b/src/runner.c
@@ -1371,7 +1371,8 @@ void *runner_main ( void *data ) {
             
             /* Resolve any dependencies. */
             for ( k = 0 ; k < t->nr_unlock_tasks ; k++ )
-                __sync_fetch_and_sub( &t->unlock_tasks[k]->wait , 1 );
+                if ( __sync_fetch_and_sub( &t->unlock_tasks[k]->wait , 1 ) == 0 )
+                    abort();
             for ( k = 0 ; k < t->nr_unlock_cells ; k++ )
                 __sync_fetch_and_sub( &t->unlock_cells[k]->wait , 1 );
         
-- 
GitLab