Forráskód Böngészése

mpi/src: protect access to datatype_funcs hashtable

Nathalie Furmento 9 éve
szülő
commit
68f0cd3a99
3 módosított fájl, 20 hozzáadás és 3 törlés
  1. 2 0
      mpi/src/starpu_mpi.c
  2. 15 3
      mpi/src/starpu_mpi_datatype.c
  3. 3 0
      mpi/src/starpu_mpi_datatype.h

+ 2 - 0
mpi/src/starpu_mpi.c

@@ -1275,6 +1275,7 @@ static void *_starpu_mpi_progress_thread_func(void *arg)
 	_starpu_mpi_early_request_init();
 	_starpu_mpi_early_data_init();
 	_starpu_mpi_sync_data_init();
+	_starpu_mpi_datatype_init();
 
 	/* notify the main thread that the progression thread is ready */
 	STARPU_PTHREAD_MUTEX_LOCK(&mutex);
@@ -1488,6 +1489,7 @@ static void *_starpu_mpi_progress_thread_func(void *arg)
 	_starpu_mpi_sync_data_free();
 	_starpu_mpi_early_data_free();
 	_starpu_mpi_early_request_free();
+	_starpu_mpi_datatype_free();
 	free(argc_argv);
 
 	return NULL;

+ 15 - 3
mpi/src/starpu_mpi_datatype.c

@@ -27,8 +27,19 @@ struct _starpu_mpi_datatype_funcs
 	UT_hash_handle hh;
 };
 
+static starpu_pthread_mutex_t _starpu_mpi_datatype_funcs_table_mutex;
 static struct _starpu_mpi_datatype_funcs *_starpu_mpi_datatype_funcs_table = NULL;
 
+void _starpu_mpi_datatype_init(void)
+{
+	STARPU_PTHREAD_MUTEX_INIT(&_starpu_mpi_datatype_funcs_table_mutex, NULL);
+}
+
+void _starpu_mpi_datatype_free(void)
+{
+	STARPU_PTHREAD_MUTEX_DESTROY(&_starpu_mpi_datatype_funcs_table_mutex);
+}
+
 /*
  * 	Matrix
  */
@@ -283,6 +294,7 @@ int starpu_mpi_datatype_register(starpu_data_handle_t handle, starpu_mpi_datatyp
 
 	STARPU_ASSERT_MSG(id >= STARPU_MAX_INTERFACE_ID, "Cannot redefine the MPI datatype for a predefined StarPU datatype");
 
+	STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_datatype_funcs_table_mutex);
 	HASH_FIND_INT(_starpu_mpi_datatype_funcs_table, &id, table);
 	if (table)
 	{
@@ -298,6 +310,7 @@ int starpu_mpi_datatype_register(starpu_data_handle_t handle, starpu_mpi_datatyp
 		HASH_ADD_INT(_starpu_mpi_datatype_funcs_table, id, table);
 	}
 	STARPU_ASSERT_MSG(handle->ops->handle_to_pointer, "The data interface must define the operation 'handle_to_pointer'\n");
+	STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_datatype_funcs_table_mutex);
 	return 0;
 }
 
@@ -308,13 +321,12 @@ int starpu_mpi_datatype_unregister(starpu_data_handle_t handle)
 
 	STARPU_ASSERT_MSG(id >= STARPU_MAX_INTERFACE_ID, "Cannot redefine the MPI datatype for a predefined StarPU datatype");
 
-#ifdef STARPU_DEVEL
-#warning FIXME: concurrency on the _starpu_mpi_datatype_funcs_table hash table with the MPI thread
-#endif
+	STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_datatype_funcs_table_mutex);
 	HASH_FIND_INT(_starpu_mpi_datatype_funcs_table, &id, table);
 	if (table)
 	{
 		HASH_DEL(_starpu_mpi_datatype_funcs_table, table);
 		free(table);
 	}
+	STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_datatype_funcs_table_mutex);
 }

+ 3 - 0
mpi/src/starpu_mpi_datatype.h

@@ -24,6 +24,9 @@
 extern "C" {
 #endif
 
+void _starpu_mpi_datatype_init(void);
+void _starpu_mpi_datatype_free(void);
+
 void _starpu_mpi_handle_allocate_datatype(starpu_data_handle_t data_handle, MPI_Datatype *datatype, int *registered_datatype);
 void _starpu_mpi_handle_free_datatype(starpu_data_handle_t data_handle, MPI_Datatype *datatype);
 char *_starpu_mpi_datatype(MPI_Datatype datatype);