1717 * and Technology (RIST). All rights reserved.
1818 * Copyright (c) 2016 Los Alamos National Security, LLC. All rights
1919 * reserved.
20- * Copyright (c) 2018-2021 Triad National Security, LLC. All rights
20+ * Copyright (c) 2018-2024 Triad National Security, LLC. All rights
2121 * reserved.
2222 * $COPYRIGHT$
2323 *
@@ -50,7 +50,7 @@ int MPI_Intercomm_create_from_groups (MPI_Group local_group, int local_leader, M
5050 int remote_leader , const char * tag , MPI_Info info , MPI_Errhandler errhandler ,
5151 MPI_Comm * newintercomm )
5252{
53- int rc ;
53+ int rc , my_grp_rank , remote_grp_size ;
5454
5555 MEMCHECKER (
5656 memchecker_comm (local_comm );
@@ -60,26 +60,43 @@ int MPI_Intercomm_create_from_groups (MPI_Group local_group, int local_leader, M
6060 if (MPI_PARAM_CHECK ) {
6161 OMPI_ERR_INIT_FINALIZE (FUNC_NAME );
6262
63- if (NULL == errhandler ) {
64- return MPI_ERR_ARG ;
65- }
63+ if (NULL == errhandler ||
64+ MPI_ERRHANDLER_NULL == errhandler ||
65+ ( OMPI_ERRHANDLER_TYPE_COMM != errhandler -> eh_mpi_object_type &&
66+ OMPI_ERRHANDLER_TYPE_PREDEFINED != errhandler -> eh_mpi_object_type ) ) {
67+ return ompi_errhandler_invoke (NULL , MPI_COMM_NULL , OMPI_ERRHANDLER_TYPE_COMM ,
68+ MPI_ERR_ARG ,FUNC_NAME );
6669
67- if (NULL == local_group || NULL == remote_group ) {
68- return ompi_errhandler_invoke (errhandler , MPI_COMM_NULL , errhandler -> eh_mpi_object_type ,
69- MPI_ERR_GROUP , FUNC_NAME );
7070 }
71+
7172 if (NULL == info || ompi_info_is_freed (info )) {
72- return ompi_errhandler_invoke (errhandler , MPI_COMM_NULL , errhandler -> eh_mpi_object_type ,
73+ return ompi_errhandler_invoke (errhandler , MPI_COMM_NULL , OMPI_ERRHANDLER_TYPE_COMM ,
7374 MPI_ERR_INFO , FUNC_NAME );
7475 }
7576 if (NULL == tag ) {
76- return ompi_errhandler_invoke (errhandler , MPI_COMM_NULL , errhandler -> eh_mpi_object_type ,
77+ return ompi_errhandler_invoke (errhandler , MPI_COMM_NULL , OMPI_ERRHANDLER_TYPE_COMM ,
7778 MPI_ERR_TAG , FUNC_NAME );
7879 }
7980 if (NULL == newintercomm ) {
80- return ompi_errhandler_invoke (errhandler , MPI_COMM_NULL , errhandler -> eh_mpi_object_type ,
81+ return ompi_errhandler_invoke (errhandler , MPI_COMM_NULL , OMPI_ERRHANDLER_TYPE_COMM ,
8182 MPI_ERR_ARG , FUNC_NAME );
8283 }
84+
85+ my_grp_rank = ompi_group_rank ((ompi_group_t * )local_group );
86+ if (local_leader == my_grp_rank ) {
87+
88+ if (NULL == local_group || NULL == remote_group ) {
89+ return ompi_errhandler_invoke (errhandler , MPI_COMM_NULL , OMPI_ERRHANDLER_TYPE_COMM ,
90+ MPI_ERR_GROUP , FUNC_NAME );
91+ }
92+
93+ remote_grp_size = ompi_group_size ((ompi_group_t * )remote_group );
94+ if (remote_leader >= remote_grp_size ) {
95+ rc = ompi_errhandler_invoke (errhandler , MPI_COMM_NULL , OMPI_ERRHANDLER_TYPE_COMM ,
96+ MPI_ERR_ARG , FUNC_NAME );
97+ return rc ;
98+ }
99+ }
83100 }
84101
85102 rc = ompi_intercomm_create_from_groups (local_group , local_leader , remote_group , remote_leader , tag ,
0 commit comments