This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "MPICH primary repository". The branch, master has been updated via b6b638afede62b245d307d7dfa7dab67364ee8f7 (commit) via 465684106f7545d7cd3bf068c021dc218bc0bb2b (commit) from f08d09bc32bde098cdf1a8ac32a2e876e466ebe0 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- http://git.mpich.org/mpich.git/commitdiff/b6b638afede62b245d307d7dfa7dab6736... commit b6b638afede62b245d307d7dfa7dab67364ee8f7 Author: Antonio J. Pena <[email protected]> Date: Thu May 21 13:41:15 2015 -0500 Fixed the test threads/spawn/th_taskmaster According to the standard, collectives using the same communicator must implement thread safety in the application level. So, if using MPI_Comm_spawn in THREAD_MULTIPLE safety level, it must use different communicators. I've modified the test to use different communicators per thread so that we can still test its thread safety. Fixes #2256 diff --git a/test/mpi/threads/spawn/th_taskmaster.c b/test/mpi/threads/spawn/th_taskmaster.c index a8f6536..3bb3f58 100644 --- a/test/mpi/threads/spawn/th_taskmaster.c +++ b/test/mpi/threads/spawn/th_taskmaster.c @@ -14,6 +14,9 @@ int comm_world_rank; int comm_world_size; +#ifdef USE_THREADS +MPI_Comm th_comms[DEFAULT_TASK_WINDOW]; +#endif #define CHECK_SUCCESS(status) \ { \ @@ -28,7 +31,7 @@ void process_spawn(MPI_Comm * comm, int thread_id) { CHECK_SUCCESS(MPI_Comm_spawn((char*)"./th_taskmaster", (char **)NULL, 1, MPI_INFO_NULL, 0, - MPI_COMM_WORLD, comm, NULL)); + th_comms[thread_id], comm, NULL)); } void process_disconnect(MPI_Comm * comm, int thread_id); @@ -101,6 +104,10 @@ int main(int argc, char *argv[]) #endif /* USE_THREADS */ #ifdef USE_THREADS + /* We need different communicators per thread */ + for (i = 0; i < DEFAULT_TASK_WINDOW; i++) + CHECK_SUCCESS(MPI_Comm_dup(MPI_COMM_WORLD, &th_comms[i])); + /* Create a thread for each task. Each thread will spawn a * child process to perform its task. */ for (i = 0; i < tasks;) { @@ -110,6 +117,9 @@ int main(int argc, char *argv[]) MTest_Join_threads(); i += DEFAULT_TASK_WINDOW; } + + for (i = 0; i < DEFAULT_TASK_WINDOW; i++) + CHECK_SUCCESS(MPI_Comm_free(&th_comms[i])); #else /* Directly spawn a child process to perform each task */ for (i = 0; i < tasks;) { http://git.mpich.org/mpich.git/commitdiff/465684106f7545d7cd3bf068c021dc218b... commit 465684106f7545d7cd3bf068c021dc218bc0bb2b Author: Antonio J. Pena <[email protected]> Date: Thu May 21 16:34:36 2015 -0500 Destroy the handle mutex on finalize It was created but never destroyed. diff --git a/src/mpi/init/initthread.c b/src/mpi/init/initthread.c index aaf20c8..6be0c7b 100644 --- a/src/mpi/init/initthread.c +++ b/src/mpi/init/initthread.c @@ -250,6 +250,8 @@ int MPIR_Thread_CS_Finalize( void ) /* There is a single, global lock, held for the duration of an MPI call */ MPID_Thread_mutex_destroy(&MPIR_ThreadInfo.global_mutex, &err); MPIU_Assert(err == 0); + MPID_Thread_mutex_destroy(&MPIR_ThreadInfo.handle_mutex, &err); + MPIU_Assert(err == 0); #elif MPIU_THREAD_GRANULARITY == MPIU_THREAD_GRANULARITY_PER_OBJECT /* MPIU_THREAD_GRANULARITY_PER_OBJECT: There are multiple locks, ----------------------------------------------------------------------- Summary of changes: src/mpi/init/initthread.c | 2 ++ test/mpi/threads/spawn/th_taskmaster.c | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletions(-) hooks/post-receive -- MPICH primary repository