17
17
* and Technology (RIST). All rights reserved.
18
18
* Copyright (c) 2016 Los Alamos National Security, LLC. All rights
19
19
* reserved.
20
- * Copyright (c) 2018-2021 Triad National Security, LLC. All rights
20
+ * Copyright (c) 2018-2024 Triad National Security, LLC. All rights
21
21
* reserved.
22
22
* $COPYRIGHT$
23
23
*
@@ -50,7 +50,7 @@ int MPI_Intercomm_create_from_groups (MPI_Group local_group, int local_leader, M
50
50
int remote_leader , const char * tag , MPI_Info info , MPI_Errhandler errhandler ,
51
51
MPI_Comm * newintercomm )
52
52
{
53
- int rc ;
53
+ int rc , my_grp_rank , remote_grp_size ;
54
54
55
55
MEMCHECKER (
56
56
memchecker_comm (local_comm );
@@ -60,26 +60,43 @@ int MPI_Intercomm_create_from_groups (MPI_Group local_group, int local_leader, M
60
60
if (MPI_PARAM_CHECK ) {
61
61
OMPI_ERR_INIT_FINALIZE (FUNC_NAME );
62
62
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 );
66
69
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 );
70
70
}
71
+
71
72
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 ,
73
74
MPI_ERR_INFO , FUNC_NAME );
74
75
}
75
76
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 ,
77
78
MPI_ERR_TAG , FUNC_NAME );
78
79
}
79
80
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 ,
81
82
MPI_ERR_ARG , FUNC_NAME );
82
83
}
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
+ }
83
100
}
84
101
85
102
rc = ompi_intercomm_create_from_groups (local_group , local_leader , remote_group , remote_leader , tag ,
0 commit comments