Преглед на файлове

fix deadlock when HDF5 Thread mode is not enabled

Corentin Salingue преди 7 години
родител
ревизия
f8116c2e01
променени са 1 файла, в които са добавени 25 реда и са изтрити 8 реда
  1. 25 8
      src/core/disk_ops/disk_hdf5.c

+ 25 - 8
src/core/disk_ops/disk_hdf5.c

@@ -312,14 +312,17 @@ static void * _starpu_hdf5_internal_thread(void * arg)
 			if (work->base_src < work->base_dst)
 			{
 				_starpu_hdf5_protect_start(work->base_src);
-				if (work->base_src != work->base_dst)
-					_starpu_hdf5_protect_start(work->base_dst);
+#ifdef H5_HAVE_THREADSAFE
+				_starpu_hdf5_protect_start(work->base_dst);
+#endif
 			}
 			else
 			{
 				_starpu_hdf5_protect_start(work->base_dst);
+#ifdef H5_HAVE_THREADSAFE
 				if (work->base_src != work->base_dst)
 					_starpu_hdf5_protect_start(work->base_src);
+#endif
 			}
 
                         switch(work->type)
@@ -347,8 +350,22 @@ static void * _starpu_hdf5_internal_thread(void * arg)
                                 default:
                                         STARPU_ABORT();
                         }
-                        _starpu_hdf5_protect_stop(work->base_src);
-                        _starpu_hdf5_protect_stop(work->base_dst);
+
+			if (work->base_src < work->base_dst)
+			{
+				_starpu_hdf5_protect_stop(work->base_src);
+#ifdef H5_HAVE_THREADSAFE
+				_starpu_hdf5_protect_stop(work->base_dst);
+#endif
+			}
+			else
+			{
+				_starpu_hdf5_protect_stop(work->base_dst);
+#ifdef H5_HAVE_THREADSAFE
+				if (work->base_src != work->base_dst)
+					_starpu_hdf5_protect_stop(work->base_src);
+#endif
+			}
 
                         /* Update event to tell it's finished */
                         starpu_sem_post((starpu_sem_t *) work->event);
@@ -357,10 +374,6 @@ static void * _starpu_hdf5_internal_thread(void * arg)
                 }
         }
 
-        STARPU_PTHREAD_MUTEX_LOCK(&HDF5_VAR_MUTEX);
-        STARPU_PTHREAD_COND_BROADCAST(&HDF5_VAR_COND);
-        STARPU_PTHREAD_MUTEX_UNLOCK(&HDF5_VAR_MUTEX);
-
         return NULL;
 }
 
@@ -421,11 +434,13 @@ static void starpu_hdf5_send_work(void *base_src, void *obj_src, off_t offset_sr
         work->size = size;
         work->event = event;
 
+#ifdef H5_HAVE_THREADSAFE
         struct starpu_hdf5_base * fileBase;
 	if (fileBase_src != NULL)
 		fileBase = fileBase_src;
 	else	
 		fileBase = fileBase_dst;
+#endif
 
         STARPU_PTHREAD_MUTEX_LOCK(&HDF5_VAR_MUTEX);
         _starpu_hdf5_work_list_push_front(&HDF5_VAR_WORK_LIST, work);
@@ -614,6 +629,7 @@ static void starpu_hdf5_unplug(void *base)
 		STARPU_PTHREAD_MUTEX_UNLOCK(&HDF5_VAR_MUTEX);
 		STARPU_PTHREAD_JOIN(HDF5_VAR_THREAD, NULL);
 		STARPU_PTHREAD_MUTEX_LOCK(&HDF5_VAR_MUTEX);
+		STARPU_PTHREAD_COND_DESTROY(&HDF5_VAR_COND);
 		STARPU_ASSERT(_starpu_hdf5_work_list_empty(&HDF5_VAR_WORK_LIST));
 		/* the internal thread is deleted */
 #ifndef H5_HAVE_THREADSAFE
@@ -623,6 +639,7 @@ static void starpu_hdf5_unplug(void *base)
         status = H5Fclose(fileBase->fileID);
 
         STARPU_PTHREAD_MUTEX_UNLOCK(&HDF5_VAR_MUTEX);
+
 #ifndef H5_HAVE_THREADSAFE
         if (actual_nb_disk == 0)
 	{