Fix thread data races
authorMartin Kroeker <martin@ruby.chemie.uni-freiburg.de>
Sat, 9 Sep 2017 17:07:06 +0000 (19:07 +0200)
committerGitHub <noreply@github.com>
Sat, 9 Sep 2017 17:07:06 +0000 (19:07 +0200)
driver/others/blas_server.c

index 9debe17..2e0fe19 100644 (file)
@@ -669,9 +669,15 @@ int exec_blas_async(BLASLONG pos, blas_queue_t *queue){
        } while (1);
 
       } else {
-       while(thread_status[i].queue) {
+       pthread_mutex_lock (&thread_status[i].lock);
+       tsiq = thread_status[i].queue;
+       pthread_mutex_unlock (&thread_status[i].lock);      
+       while(tsiq) {
          i ++;
          if (i >= blas_num_threads - 1) i = 0;
+         pthread_mutex_lock (&thread_status[i].lock);
+         tsiq = thread_status[i].queue;
+         pthread_mutex_unlock (&thread_status[i].lock);
        }
       }
 #else
@@ -960,14 +966,10 @@ int BLASFUNC(blas_thread_shutdown)(void){
 
   for (i = 0; i < blas_num_threads - 1; i++) {
 
-    blas_lock(&exec_queue_lock);
+    pthread_mutex_lock (&thread_status[i].lock);
 
     thread_status[i].queue = (blas_queue_t *)-1;
 
-    blas_unlock(&exec_queue_lock);
-
-    pthread_mutex_lock  (&thread_status[i].lock);
-
     thread_status[i].status = THREAD_STATUS_WAKEUP;
 
     pthread_cond_signal (&thread_status[i].wakeup);