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