diff --git a/contrib/platform/win32/ConfigFiles/mpi.h.cmake b/contrib/platform/win32/ConfigFiles/mpi.h.cmake index df1afc46ba..d7877e00af 100644 --- a/contrib/platform/win32/ConfigFiles/mpi.h.cmake +++ b/contrib/platform/win32/ConfigFiles/mpi.h.cmake @@ -10,6 +10,7 @@ * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2007-2008 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -476,15 +477,15 @@ enum { /* * NULL handles */ -#define MPI_GROUP_NULL (&ompi_mpi_group_null) -#define MPI_COMM_NULL (&ompi_mpi_comm_null) -#define MPI_REQUEST_NULL (&ompi_request_null) -#define MPI_OP_NULL (&ompi_mpi_op_null) -#define MPI_ERRHANDLER_NULL (&ompi_mpi_errhandler_null) -#define MPI_INFO_NULL (&ompi_mpi_info_null) -#define MPI_WIN_NULL (&ompi_mpi_win_null) +#define MPI_GROUP_NULL (((MPI_Group)&(ompi_mpi_group_null))) +#define MPI_COMM_NULL (((MPI_Comm)&(ompi_mpi_comm_null))) +#define MPI_REQUEST_NULL (((MPI_Request)&(ompi_request_null))) +#define MPI_OP_NULL (((MPI_Op)&(ompi_mpi_op_null))) +#define MPI_ERRHANDLER_NULL (((MPI_Errhandler)&(ompi_mpi_errhandler_null))) +#define MPI_INFO_NULL (((MPI_Info)&(ompi_mpi_info_null))) +#define MPI_WIN_NULL (((MPI_Win)&(ompi_mpi_win_null))) #if OMPI_PROVIDE_MPI_FILE_INTERFACE -#define MPI_FILE_NULL (&ompi_mpi_file_null) +#define MPI_FILE_NULL (((MPI_File)&(ompi_mpi_file_null))) #endif #define MPI_STATUS_IGNORE ((MPI_Status *) 0) @@ -596,107 +597,111 @@ OMPI_DECLSPEC int OMPI_C_MPI_WIN_DUP_FN( MPI_Win window, int win_keyval, /* * External variables */ -OMPI_DECLSPEC extern struct ompi_communicator_t ompi_mpi_comm_world; -OMPI_DECLSPEC extern struct ompi_communicator_t ompi_mpi_comm_self; -OMPI_DECLSPEC extern struct ompi_communicator_t ompi_mpi_comm_null; +OMPI_DECLSPEC extern union ompi_predefined_communicator_t ompi_mpi_comm_world; +OMPI_DECLSPEC extern union ompi_predefined_communicator_t ompi_mpi_comm_self; +OMPI_DECLSPEC extern union ompi_predefined_communicator_t ompi_mpi_comm_null; -OMPI_DECLSPEC extern struct ompi_group_t ompi_mpi_group_empty; -OMPI_DECLSPEC extern struct ompi_group_t ompi_mpi_group_null; +OMPI_DECLSPEC extern union ompi_predefined_group_t ompi_mpi_group_empty; +OMPI_DECLSPEC extern union ompi_predefined_group_t ompi_mpi_group_null; -OMPI_DECLSPEC extern struct ompi_request_t ompi_request_null; +OMPI_DECLSPEC extern union ompi_predefined_request_t ompi_request_null; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_null; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_max, ompi_mpi_op_min; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_sum, ompi_mpi_op_prod; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_land, ompi_mpi_op_band; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_lor, ompi_mpi_op_bor; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_lxor, ompi_mpi_op_bxor; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_maxloc, ompi_mpi_op_minloc; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_replace; +OMPI_DECLSPEC extern union ompi_predefined_op_t ompi_mpi_op_null; +OMPI_DECLSPEC extern union ompi_predefined_op_t ompi_mpi_op_max, ompi_mpi_op_min; +OMPI_DECLSPEC extern union ompi_predefined_op_t ompi_mpi_op_sum; +OMPI_DECLSPEC extern union ompi_predefined_op_t ompi_mpi_op_prod; +OMPI_DECLSPEC extern union ompi_predefined_op_t ompi_mpi_op_land; +OMPI_DECLSPEC extern union ompi_predefined_op_t ompi_mpi_op_band; +OMPI_DECLSPEC extern union ompi_predefined_op_t ompi_mpi_op_lor, ompi_mpi_op_bor; +OMPI_DECLSPEC extern union ompi_predefined_op_t ompi_mpi_op_lxor; +OMPI_DECLSPEC extern union ompi_predefined_op_t ompi_mpi_op_bxor; +OMPI_DECLSPEC extern union ompi_predefined_op_t ompi_mpi_op_maxloc; +OMPI_DECLSPEC extern union ompi_predefined_op_t ompi_mpi_op_minloc; +OMPI_DECLSPEC extern union ompi_predefined_op_t ompi_mpi_op_replace; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_char, ompi_mpi_byte; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_int, ompi_mpi_logic; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_short, ompi_mpi_long; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_float, ompi_mpi_double; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_long_double; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_cplex, ompi_mpi_packed; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_signed_char; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_unsigned_char; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_unsigned_short; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_unsigned, ompi_mpi_datatype_null; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_unsigned_long, ompi_mpi_ldblcplex; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_ub, ompi_mpi_lb; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_float_int, ompi_mpi_double_int; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_long_int, ompi_mpi_2int; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_short_int, ompi_mpi_dblcplex; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_integer, ompi_mpi_real; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_dblprec, ompi_mpi_character; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_2real, ompi_mpi_2dblprec; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_2integer, ompi_mpi_longdbl_int; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_wchar, ompi_mpi_long_long_int; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_unsigned_long_long; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_cxx_cplex, ompi_mpi_cxx_dblcplex; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_cxx_ldblcplex; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_cxx_bool; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_2cplex, ompi_mpi_2dblcplex; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_char, ompi_mpi_byte; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_int, ompi_mpi_logic; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_short, ompi_mpi_long; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_float, ompi_mpi_double; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_long_double; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_cplex, ompi_mpi_packed; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_signed_char; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_unsigned_char; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_unsigned_short; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_unsigned, ompi_mpi_datatype_null; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_unsigned_long, ompi_mpi_ldblcplex; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_ub, ompi_mpi_lb; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_float_int, ompi_mpi_double_int; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_long_int, ompi_mpi_2int; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_short_int, ompi_mpi_dblcplex; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_integer, ompi_mpi_real; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_dblprec, ompi_mpi_character; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_2real, ompi_mpi_2dblprec; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_2integer, ompi_mpi_longdbl_int; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_wchar, ompi_mpi_long_long_int; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_unsigned_long_long; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_cxx_cplex, ompi_mpi_cxx_dblcplex; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_cxx_ldblcplex; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_cxx_bool; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_2cplex, ompi_mpi_2dblcplex; /* other MPI2 datatypes */ #if OMPI_HAVE_FORTRAN_LOGICAL1 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_logical1; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_logical1; #endif #if OMPI_HAVE_FORTRAN_LOGICAL2 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_logical2; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_logical2; #endif #if OMPI_HAVE_FORTRAN_LOGICAL4 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_logical4; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_logical4; #endif #if OMPI_HAVE_FORTRAN_LOGICAL8 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_logical8; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_logical8; #endif #if OMPI_HAVE_FORTRAN_INTEGER1 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_integer1; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_integer1; #endif #if OMPI_HAVE_FORTRAN_INTEGER2 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_integer2; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_integer2; #endif #if OMPI_HAVE_FORTRAN_INTEGER4 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_integer4; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_integer4; #endif #if OMPI_HAVE_FORTRAN_INTEGER8 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_integer8; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_integer8; #endif #if OMPI_HAVE_FORTRAN_INTEGER16 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_integer16; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_integer16; #endif #if OMPI_HAVE_FORTRAN_REAL2 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_real2; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_real2; #endif #if OMPI_HAVE_FORTRAN_REAL4 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_real4; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_real4; #endif #if OMPI_HAVE_FORTRAN_REAL8 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_real8; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_real8; #endif #if OMPI_HAVE_FORTRAN_REAL16 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_real16; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_real16; #endif #if OMPI_HAVE_FORTRAN_REAL4 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_complex8; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_complex8; #endif #if OMPI_HAVE_FORTRAN_REAL8 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_complex16; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_complex16; #endif #if OMPI_HAVE_FORTRAN_REAL16 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_complex32; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_complex32; #endif -OMPI_DECLSPEC extern struct ompi_errhandler_t ompi_mpi_errhandler_null; -OMPI_DECLSPEC extern struct ompi_errhandler_t ompi_mpi_errors_are_fatal; -OMPI_DECLSPEC extern struct ompi_errhandler_t ompi_mpi_errors_return; +OMPI_DECLSPEC extern union ompi_predefined_errhandler_t ompi_mpi_errhandler_null; +OMPI_DECLSPEC extern union ompi_predefined_errhandler_t ompi_mpi_errors_are_fatal; +OMPI_DECLSPEC extern union ompi_predefined_errhandler_t ompi_mpi_errors_return; -OMPI_DECLSPEC extern struct ompi_win_t ompi_mpi_win_null; -OMPI_DECLSPEC extern struct ompi_file_t ompi_mpi_file_null; +OMPI_DECLSPEC extern union ompi_predefined_win_t ompi_mpi_win_null; +OMPI_DECLSPEC extern union ompi_predefined_file_t ompi_mpi_file_null; -OMPI_DECLSPEC extern struct ompi_info_t ompi_mpi_info_null; +OMPI_DECLSPEC extern union ompi_predefined_info_t ompi_mpi_info_null; OMPI_DECLSPEC extern MPI_Fint *MPI_F_STATUS_IGNORE; OMPI_DECLSPEC extern MPI_Fint *MPI_F_STATUSES_IGNORE; @@ -704,117 +709,117 @@ OMPI_DECLSPEC extern MPI_Fint *MPI_F_STATUSES_IGNORE; /* * MPI predefined handles */ -#define MPI_COMM_WORLD (&ompi_mpi_comm_world) -#define MPI_COMM_SELF (&ompi_mpi_comm_self) +#define MPI_COMM_WORLD (((MPI_Comm)&(ompi_mpi_comm_world))) +#define MPI_COMM_SELF (((MPI_Comm)&(ompi_mpi_comm_self))) -#define MPI_GROUP_EMPTY (&ompi_mpi_group_empty) +#define MPI_GROUP_EMPTY (((MPI_Group)&(ompi_mpi_group_empty))) -#define MPI_MAX (&ompi_mpi_op_max) -#define MPI_MIN (&ompi_mpi_op_min) -#define MPI_SUM (&ompi_mpi_op_sum) -#define MPI_PROD (&ompi_mpi_op_prod) -#define MPI_LAND (&ompi_mpi_op_land) -#define MPI_BAND (&ompi_mpi_op_band) -#define MPI_LOR (&ompi_mpi_op_lor) -#define MPI_BOR (&ompi_mpi_op_bor) -#define MPI_LXOR (&ompi_mpi_op_lxor) -#define MPI_BXOR (&ompi_mpi_op_bxor) -#define MPI_MAXLOC (&ompi_mpi_op_maxloc) -#define MPI_MINLOC (&ompi_mpi_op_minloc) -#define MPI_REPLACE (&ompi_mpi_op_replace) +#define MPI_MAX (((MPI_Op)&(ompi_mpi_op_max))) +#define MPI_MIN (((MPI_Op)&(ompi_mpi_op_min))) +#define MPI_SUM (((MPI_Op)&(ompi_mpi_op_sum))) +#define MPI_PROD (((MPI_Op)&(ompi_mpi_op_prod))) +#define MPI_LAND (((MPI_Op)&(ompi_mpi_op_land))) +#define MPI_BAND (((MPI_Op)&(ompi_mpi_op_band))) +#define MPI_LOR (((MPI_Op)&(ompi_mpi_op_lor))) +#define MPI_BOR (((MPI_Op)&(ompi_mpi_op_bor))) +#define MPI_LXOR (((MPI_Op)&(ompi_mpi_op_lxor))) +#define MPI_BXOR (((MPI_Op)&(ompi_mpi_op_bxor))) +#define MPI_MAXLOC (((MPI_Op)&(ompi_mpi_op_maxloc))) +#define MPI_MINLOC (((MPI_Op)&(ompi_mpi_op_minloc))) +#define MPI_REPLACE (((MPI_Op)&(ompi_mpi_op_replace))) /* C datatypes */ -#define MPI_DATATYPE_NULL (&ompi_mpi_datatype_null) -#define MPI_BYTE (&ompi_mpi_byte) -#define MPI_PACKED (&ompi_mpi_packed) -#define MPI_CHAR (&ompi_mpi_char) -#define MPI_SHORT (&ompi_mpi_short) -#define MPI_INT (&ompi_mpi_int) -#define MPI_LONG (&ompi_mpi_long) -#define MPI_FLOAT (&ompi_mpi_float) -#define MPI_DOUBLE (&ompi_mpi_double) -#define MPI_LONG_DOUBLE (&ompi_mpi_long_double) -#define MPI_UNSIGNED_CHAR (&ompi_mpi_unsigned_char) -#define MPI_SIGNED_CHAR (&ompi_mpi_signed_char) -#define MPI_UNSIGNED_SHORT (&ompi_mpi_unsigned_short) -#define MPI_UNSIGNED_LONG (&ompi_mpi_unsigned_long) -#define MPI_UNSIGNED (&ompi_mpi_unsigned) -#define MPI_FLOAT_INT (&ompi_mpi_float_int) -#define MPI_DOUBLE_INT (&ompi_mpi_double_int) -#define MPI_LONG_DOUBLE_INT (&ompi_mpi_longdbl_int) -#define MPI_LONG_INT (&ompi_mpi_long_int) -#define MPI_SHORT_INT (&ompi_mpi_short_int) -#define MPI_2INT (&ompi_mpi_2int) -#define MPI_UB (&ompi_mpi_ub) -#define MPI_LB (&ompi_mpi_lb) -#define MPI_WCHAR (&ompi_mpi_wchar) +#define MPI_DATATYPE_NULL (((MPI_Datatype)&(ompi_mpi_datatype_null))) +#define MPI_BYTE (((MPI_Datatype)&(ompi_mpi_byte))) +#define MPI_PACKED (((MPI_Datatype)&(ompi_mpi_packed))) +#define MPI_CHAR (((MPI_Datatype)&(ompi_mpi_char))) +#define MPI_SHORT (((MPI_Datatype)&(ompi_mpi_short))) +#define MPI_INT (((MPI_Datatype)&(ompi_mpi_int))) +#define MPI_LONG (((MPI_Datatype)&(ompi_mpi_long))) +#define MPI_FLOAT (((MPI_Datatype)&(ompi_mpi_float))) +#define MPI_DOUBLE (((MPI_Datatype)&(ompi_mpi_double))) +#define MPI_LONG_DOUBLE (((MPI_Datatype)&(ompi_mpi_long_double))) +#define MPI_UNSIGNED_CHAR (((MPI_Datatype)&(ompi_mpi_unsigned_char))) +#define MPI_SIGNED_CHAR (((MPI_Datatype)&(ompi_mpi_signed_char))) +#define MPI_UNSIGNED_SHORT (((MPI_Datatype)&(ompi_mpi_unsigned_short))) +#define MPI_UNSIGNED_LONG (((MPI_Datatype)&(ompi_mpi_unsigned_long))) +#define MPI_UNSIGNED (((MPI_Datatype)&(ompi_mpi_unsigned))) +#define MPI_FLOAT_INT (((MPI_Datatype)&(ompi_mpi_float_int))) +#define MPI_DOUBLE_INT (((MPI_Datatype)&(ompi_mpi_double_int))) +#define MPI_LONG_DOUBLE_INT (((MPI_Datatype)&(ompi_mpi_longdbl_int))) +#define MPI_LONG_INT (((MPI_Datatype)&(ompi_mpi_long_int))) +#define MPI_SHORT_INT (((MPI_Datatype)&(ompi_mpi_short_int))) +#define MPI_2INT (((MPI_Datatype)&(ompi_mpi_2int))) +#define MPI_UB (((MPI_Datatype)&(ompi_mpi_ub))) +#define MPI_LB (((MPI_Datatype)&(ompi_mpi_lb))) +#define MPI_WCHAR (((MPI_Datatype)&(ompi_mpi_wchar))) #if OMPI_HAVE_LONG_LONG -#define MPI_LONG_LONG_INT (&ompi_mpi_long_long_int) -#define MPI_LONG_LONG (&ompi_mpi_long_long_int) -#define MPI_UNSIGNED_LONG_LONG (&ompi_mpi_unsigned_long_long) +#define MPI_LONG_LONG_INT (((MPI_Datatype)&(ompi_mpi_long_long_int))) +#define MPI_LONG_LONG (((MPI_Datatype)&(ompi_mpi_long_long_int))) +#define MPI_UNSIGNED_LONG_LONG (((MPI_Datatype)&(ompi_mpi_unsigned_long_long))) #endif /* OMPI_HAVE_LONG_LONG */ -#define MPI_2COMPLEX (&ompi_mpi_2cplex) -#define MPI_2DOUBLE_COMPLEX (&ompi_mpi_2dblcplex) +#define MPI_2COMPLEX (((MPI_Datatype)&(ompi_mpi_2cplex))) +#define MPI_2DOUBLE_COMPLEX (((MPI_Datatype)&(ompi_mpi_2dblcplex))) /* Fortran datatype bindings */ -#define MPI_CHARACTER (&ompi_mpi_character) -#define MPI_LOGICAL (&ompi_mpi_logic) +#define MPI_CHARACTER (((MPI_Datatype)&(ompi_mpi_character))) +#define MPI_LOGICAL (((MPI_Datatype)&(ompi_mpi_logic))) #if OMPI_HAVE_FORTRAN_LOGICAL1 -#define MPI_LOGICAL1 (&ompi_mpi_logical1) +#define MPI_LOGICAL1 (((MPI_Datatype)&(ompi_mpi_logical1))) #endif #if OMPI_HAVE_FORTRAN_LOGICAL2 -#define MPI_LOGICAL2 (&ompi_mpi_logical2) +#define MPI_LOGICAL2 (((MPI_Datatype)&(ompi_mpi_logical2))) #endif #if OMPI_HAVE_FORTRAN_LOGICAL4 -#define MPI_LOGICAL4 (&ompi_mpi_logical4) +#define MPI_LOGICAL4 (((MPI_Datatype)&(ompi_mpi_logical4))) #endif #if OMPI_HAVE_FORTRAN_LOGICAL8 -#define MPI_LOGICAL8 (&ompi_mpi_logical8) +#define MPI_LOGICAL8 (((MPI_Datatype)&(ompi_mpi_logical8))) #endif -#define MPI_INTEGER (&ompi_mpi_integer) +#define MPI_INTEGER (((MPI_Datatype)&(ompi_mpi_integer))) #if OMPI_HAVE_FORTRAN_INTEGER1 -#define MPI_INTEGER1 (&ompi_mpi_integer1) +#define MPI_INTEGER1 (((MPI_Datatype)&(ompi_mpi_integer1))) #endif #if OMPI_HAVE_FORTRAN_INTEGER2 -#define MPI_INTEGER2 (&ompi_mpi_integer2) +#define MPI_INTEGER2 (((MPI_Datatype)&(ompi_mpi_integer2))) #endif #if OMPI_HAVE_FORTRAN_INTEGER4 -#define MPI_INTEGER4 (&ompi_mpi_integer4) +#define MPI_INTEGER4 (((MPI_Datatype)&(ompi_mpi_integer4))) #endif #if OMPI_HAVE_FORTRAN_INTEGER8 -#define MPI_INTEGER8 (&ompi_mpi_integer8) +#define MPI_INTEGER8 (((MPI_Datatype)&(ompi_mpi_integer8))) #endif #if OMPI_HAVE_FORTRAN_INTEGER16 -#define MPI_INTEGER16 (&ompi_mpi_integer16) +#define MPI_INTEGER16 (((MPI_Datatype)&(ompi_mpi_integer16))) #endif -#define MPI_REAL (&ompi_mpi_real) +#define MPI_REAL (((MPI_Datatype)&(ompi_mpi_real))) #if OMPI_HAVE_FORTRAN_REAL4 -#define MPI_REAL4 (&ompi_mpi_real4) +#define MPI_REAL4 (((MPI_Datatype)&(ompi_mpi_real4))) #endif #if OMPI_HAVE_FORTRAN_REAL8 -#define MPI_REAL8 (&ompi_mpi_real8) +#define MPI_REAL8 (((MPI_Datatype)&(ompi_mpi_real8))) #endif #if OMPI_HAVE_FORTRAN_REAL16 -#define MPI_REAL16 (&ompi_mpi_real16) +#define MPI_REAL16 (((MPI_Datatype)&(ompi_mpi_real16))) #endif -#define MPI_DOUBLE_PRECISION (&ompi_mpi_dblprec) -#define MPI_COMPLEX (&ompi_mpi_cplex) +#define MPI_DOUBLE_PRECISION (((MPI_Datatype)&(ompi_mpi_dblprec))) +#define MPI_COMPLEX (((MPI_Datatype)&(ompi_mpi_cplex))) #if OMPI_HAVE_FORTRAN_REAL4 -#define MPI_COMPLEX8 (&ompi_mpi_complex8) +#define MPI_COMPLEX8 (((MPI_Datatype)&(ompi_mpi_complex8))) #endif #if OMPI_HAVE_FORTRAN_REAL8 -#define MPI_COMPLEX16 (&ompi_mpi_complex16) +#define MPI_COMPLEX16 (((MPI_Datatype)&(ompi_mpi_complex16))) #endif #if OMPI_HAVE_FORTRAN_REAL16 -#define MPI_COMPLEX32 (&ompi_mpi_complex32) +#define MPI_COMPLEX32 (((MPI_Datatype)&(ompi_mpi_complex32))) #endif -#define MPI_DOUBLE_COMPLEX (&ompi_mpi_dblcplex) -#define MPI_2REAL (&ompi_mpi_2real) -#define MPI_2DOUBLE_PRECISION (&ompi_mpi_2dblprec) -#define MPI_2INTEGER (&ompi_mpi_2integer) +#define MPI_DOUBLE_COMPLEX (((MPI_Datatype)&(ompi_mpi_dblcplex))) +#define MPI_2REAL (((MPI_Datatype)&(ompi_mpi_2real))) +#define MPI_2DOUBLE_PRECISION (((MPI_Datatype)&(ompi_mpi_2dblprec))) +#define MPI_2INTEGER (((MPI_Datatype)&(ompi_mpi_2integer))) -#define MPI_ERRORS_ARE_FATAL (&ompi_mpi_errors_are_fatal) -#define MPI_ERRORS_RETURN (&ompi_mpi_errors_return) +#define MPI_ERRORS_ARE_FATAL (((MPI_Errhandler)&(ompi_mpi_errors_are_fatal))) +#define MPI_ERRORS_RETURN (((MPI_Errhandler)&(ompi_mpi_errors_return))) /* Typeclass definition for MPI_Type_match_size */ #define MPI_TYPECLASS_INTEGER 1 diff --git a/ompi/communicator/comm.c b/ompi/communicator/comm.c index 937ded09b5..53d075c453 100644 --- a/ompi/communicator/comm.c +++ b/ompi/communicator/comm.c @@ -11,6 +11,7 @@ * All rights reserved. * Copyright (c) 2007-2008 University of Houston. All rights reserved. * Copyright (c) 2007-2008 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -960,7 +961,7 @@ int ompi_comm_free ( ompi_communicator_t **comm ) COMM_NULL. This is according to MPI-2:88-89. */ if (*comm == ompi_mpi_comm_parent && comm != &ompi_mpi_comm_parent) { - ompi_mpi_comm_parent = &ompi_mpi_comm_null; + ompi_mpi_comm_parent = &ompi_mpi_comm_null.comm; } /* Release the communicator */ diff --git a/ompi/communicator/comm_cid.c b/ompi/communicator/comm_cid.c index cdee170425..cccffe59b4 100644 --- a/ompi/communicator/comm_cid.c +++ b/ompi/communicator/comm_cid.c @@ -13,6 +13,7 @@ * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. * Copyright (c) 2007 Voltaire All rights reserved. * Copyright (c) 2006-2008 University of Houston. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -26,6 +27,7 @@ #include "opal/util/convert.h" #include "orte/types.h" #include "ompi/communicator/communicator.h" +#include "ompi/op/op.h" #include "ompi/proc/proc.h" #include "ompi/constants.h" #include "opal/class/opal_pointer_array.h" @@ -497,8 +499,8 @@ static int ompi_comm_allreduce_inter ( int *inbuf, int *outbuf, int *rcounts=NULL, scount=0; int *rdisps=NULL; - if ( &ompi_mpi_op_sum != op && &ompi_mpi_op_prod != op && - &ompi_mpi_op_max != op && &ompi_mpi_op_min != op ) { + if ( &ompi_mpi_op_sum.op != op && &ompi_mpi_op_prod.op != op && + &ompi_mpi_op_max.op != op && &ompi_mpi_op_min.op != op ) { return MPI_ERR_OP; } @@ -552,22 +554,22 @@ static int ompi_comm_allreduce_inter ( int *inbuf, int *outbuf, goto exit; } - if ( &ompi_mpi_op_max == op ) { + if ( &ompi_mpi_op_max.op == op ) { for ( i = 0 ; i < count; i++ ) { if (tmpbuf[i] > outbuf[i]) outbuf[i] = tmpbuf[i]; } } - else if ( &ompi_mpi_op_min == op ) { + else if ( &ompi_mpi_op_min.op == op ) { for ( i = 0 ; i < count; i++ ) { if (tmpbuf[i] < outbuf[i]) outbuf[i] = tmpbuf[i]; } } - else if ( &ompi_mpi_op_sum == op ) { + else if ( &ompi_mpi_op_sum.op == op ) { for ( i = 0 ; i < count; i++ ) { outbuf[i] += tmpbuf[i]; } } - else if ( &ompi_mpi_op_prod == op ) { + else if ( &ompi_mpi_op_prod.op == op ) { for ( i = 0 ; i < count; i++ ) { outbuf[i] *= tmpbuf[i]; } @@ -620,8 +622,8 @@ static int ompi_comm_allreduce_intra_bridge (int *inbuf, int *outbuf, local_leader = (*((int*)lleader)); remote_leader = (*((int*)rleader)); - if ( &ompi_mpi_op_sum != op && &ompi_mpi_op_prod != op && - &ompi_mpi_op_max != op && &ompi_mpi_op_min != op ) { + if ( &ompi_mpi_op_sum.op != op && &ompi_mpi_op_prod.op != op && + &ompi_mpi_op_max.op != op && &ompi_mpi_op_min.op != op ) { return MPI_ERR_OP; } @@ -659,22 +661,22 @@ static int ompi_comm_allreduce_intra_bridge (int *inbuf, int *outbuf, goto exit; } - if ( &ompi_mpi_op_max == op ) { + if ( &ompi_mpi_op_max.op == op ) { for ( i = 0 ; i < count; i++ ) { if (tmpbuf[i] > outbuf[i]) outbuf[i] = tmpbuf[i]; } } - else if ( &ompi_mpi_op_min == op ) { + else if ( &ompi_mpi_op_min.op == op ) { for ( i = 0 ; i < count; i++ ) { if (tmpbuf[i] < outbuf[i]) outbuf[i] = tmpbuf[i]; } } - else if ( &ompi_mpi_op_sum == op ) { + else if ( &ompi_mpi_op_sum.op == op ) { for ( i = 0 ; i < count; i++ ) { outbuf[i] += tmpbuf[i]; } } - else if ( &ompi_mpi_op_prod == op ) { + else if ( &ompi_mpi_op_prod.op == op ) { for ( i = 0 ; i < count; i++ ) { outbuf[i] *= tmpbuf[i]; } @@ -718,8 +720,8 @@ static int ompi_comm_allreduce_intra_oob (int *inbuf, int *outbuf, remote_leader = (orte_process_name_t*)rleader; size_count = count; - if ( &ompi_mpi_op_sum != op && &ompi_mpi_op_prod != op && - &ompi_mpi_op_max != op && &ompi_mpi_op_min != op ) { + if ( &ompi_mpi_op_sum.op != op && &ompi_mpi_op_prod.op != op && + &ompi_mpi_op_max.op != op && &ompi_mpi_op_min.op != op ) { return MPI_ERR_OP; } @@ -773,22 +775,22 @@ static int ompi_comm_allreduce_intra_oob (int *inbuf, int *outbuf, OBJ_RELEASE(rbuf); count = (int)size_count; - if ( &ompi_mpi_op_max == op ) { + if ( &ompi_mpi_op_max.op == op ) { for ( i = 0 ; i < count; i++ ) { if (tmpbuf[i] > outbuf[i]) outbuf[i] = tmpbuf[i]; } } - else if ( &ompi_mpi_op_min == op ) { + else if ( &ompi_mpi_op_min.op == op ) { for ( i = 0 ; i < count; i++ ) { if (tmpbuf[i] < outbuf[i]) outbuf[i] = tmpbuf[i]; } } - else if ( &ompi_mpi_op_sum == op ) { + else if ( &ompi_mpi_op_sum.op == op ) { for ( i = 0 ; i < count; i++ ) { outbuf[i] += tmpbuf[i]; } } - else if ( &ompi_mpi_op_prod == op ) { + else if ( &ompi_mpi_op_prod.op == op ) { for ( i = 0 ; i < count; i++ ) { outbuf[i] *= tmpbuf[i]; } diff --git a/ompi/communicator/comm_init.c b/ompi/communicator/comm_init.c index aeeab417ef..3a6a00bb3a 100644 --- a/ompi/communicator/comm_init.c +++ b/ompi/communicator/comm_init.c @@ -12,6 +12,7 @@ * All rights reserved. * Copyright (c) 2006-2007 University of Houston. All rights reserved. * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -43,9 +44,9 @@ */ opal_pointer_array_t ompi_mpi_communicators; -ompi_communicator_t ompi_mpi_comm_world; -ompi_communicator_t ompi_mpi_comm_self; -ompi_communicator_t ompi_mpi_comm_null; +ompi_predefined_communicator_t ompi_mpi_comm_world; +ompi_predefined_communicator_t ompi_mpi_comm_self; +ompi_predefined_communicator_t ompi_mpi_comm_null; ompi_communicator_t *ompi_mpi_comm_parent; static void ompi_comm_construct(ompi_communicator_t* comm); @@ -84,31 +85,31 @@ int ompi_comm_init(void) ompi_set_group_rank(group, ompi_proc_local()); ompi_group_increment_proc_count (group); - ompi_mpi_comm_world.c_contextid = 0; - ompi_mpi_comm_world.c_id_start_index = 4; - ompi_mpi_comm_world.c_id_available = 4; - ompi_mpi_comm_world.c_f_to_c_index = 0; - ompi_mpi_comm_world.c_my_rank = group->grp_my_rank; - ompi_mpi_comm_world.c_local_group = group; - ompi_mpi_comm_world.c_remote_group = group; - OBJ_RETAIN(ompi_mpi_comm_world.c_remote_group); - ompi_mpi_comm_world.c_cube_dim = opal_cube_dim((int)size); - ompi_mpi_comm_world.error_handler = &ompi_mpi_errors_are_fatal; - OBJ_RETAIN( &ompi_mpi_errors_are_fatal ); - OMPI_COMM_SET_PML_ADDED(&ompi_mpi_comm_world); + ompi_mpi_comm_world.comm.c_contextid = 0; + ompi_mpi_comm_world.comm.c_id_start_index = 4; + ompi_mpi_comm_world.comm.c_id_available = 4; + ompi_mpi_comm_world.comm.c_f_to_c_index = 0; + ompi_mpi_comm_world.comm.c_my_rank = group->grp_my_rank; + ompi_mpi_comm_world.comm.c_local_group = group; + ompi_mpi_comm_world.comm.c_remote_group = group; + OBJ_RETAIN(ompi_mpi_comm_world.comm.c_remote_group); + ompi_mpi_comm_world.comm.c_cube_dim = opal_cube_dim((int)size); + ompi_mpi_comm_world.comm.error_handler = &ompi_mpi_errors_are_fatal.eh; + OBJ_RETAIN( &ompi_mpi_errors_are_fatal.eh ); + OMPI_COMM_SET_PML_ADDED(&ompi_mpi_comm_world.comm); opal_pointer_array_set_item (&ompi_mpi_communicators, 0, &ompi_mpi_comm_world); - MEMCHECKER (memset (ompi_mpi_comm_world.c_name, 0, MPI_MAX_OBJECT_NAME)); - strncpy (ompi_mpi_comm_world.c_name, "MPI_COMM_WORLD", + MEMCHECKER (memset (ompi_mpi_comm_world.comm.c_name, 0, MPI_MAX_OBJECT_NAME)); + strncpy (ompi_mpi_comm_world.comm.c_name, "MPI_COMM_WORLD", strlen("MPI_COMM_WORLD")+1 ); - ompi_mpi_comm_world.c_flags |= OMPI_COMM_NAMEISSET; - ompi_mpi_comm_world.c_flags |= OMPI_COMM_INTRINSIC; + ompi_mpi_comm_world.comm.c_flags |= OMPI_COMM_NAMEISSET; + ompi_mpi_comm_world.comm.c_flags |= OMPI_COMM_INTRINSIC; /* We have to create a hash (although it is legal to leave this filed NULL -- the attribute accessor functions will intepret this as "there are no attributes cached on this object") because MPI_COMM_WORLD has some predefined attributes. */ - ompi_attr_hash_init(&ompi_mpi_comm_world.c_keyhash); + ompi_attr_hash_init(&ompi_mpi_comm_world.comm.c_keyhash); /* Setup MPI_COMM_SELF */ OBJ_CONSTRUCT(&ompi_mpi_comm_self, ompi_communicator_t); @@ -119,54 +120,54 @@ int ompi_comm_init(void) OMPI_GROUP_SET_INTRINSIC (group); OMPI_GROUP_SET_DENSE (group); - ompi_mpi_comm_self.c_contextid = 1; - ompi_mpi_comm_self.c_f_to_c_index = 1; - ompi_mpi_comm_self.c_id_start_index = 20; - ompi_mpi_comm_self.c_id_available = 20; - ompi_mpi_comm_self.c_my_rank = group->grp_my_rank; - ompi_mpi_comm_self.c_local_group = group; - ompi_mpi_comm_self.c_remote_group = group; - OBJ_RETAIN(ompi_mpi_comm_self.c_remote_group); - ompi_mpi_comm_self.error_handler = &ompi_mpi_errors_are_fatal; - OBJ_RETAIN( &ompi_mpi_errors_are_fatal ); - OMPI_COMM_SET_PML_ADDED(&ompi_mpi_comm_self); + ompi_mpi_comm_self.comm.c_contextid = 1; + ompi_mpi_comm_self.comm.c_f_to_c_index = 1; + ompi_mpi_comm_self.comm.c_id_start_index = 20; + ompi_mpi_comm_self.comm.c_id_available = 20; + ompi_mpi_comm_self.comm.c_my_rank = group->grp_my_rank; + ompi_mpi_comm_self.comm.c_local_group = group; + ompi_mpi_comm_self.comm.c_remote_group = group; + OBJ_RETAIN(ompi_mpi_comm_self.comm.c_remote_group); + ompi_mpi_comm_self.comm.error_handler = &ompi_mpi_errors_are_fatal.eh; + OBJ_RETAIN( &ompi_mpi_errors_are_fatal.eh ); + OMPI_COMM_SET_PML_ADDED(&ompi_mpi_comm_self.comm); opal_pointer_array_set_item (&ompi_mpi_communicators, 1, &ompi_mpi_comm_self); - MEMCHECKER (memset (ompi_mpi_comm_self.c_name, 0, MPI_MAX_OBJECT_NAME)); - strncpy(ompi_mpi_comm_self.c_name,"MPI_COMM_SELF",strlen("MPI_COMM_SELF")+1); - ompi_mpi_comm_self.c_flags |= OMPI_COMM_NAMEISSET; - ompi_mpi_comm_self.c_flags |= OMPI_COMM_INTRINSIC; + MEMCHECKER (memset (ompi_mpi_comm_self.comm.c_name, 0, MPI_MAX_OBJECT_NAME)); + strncpy(ompi_mpi_comm_self.comm.c_name,"MPI_COMM_SELF",strlen("MPI_COMM_SELF")+1); + ompi_mpi_comm_self.comm.c_flags |= OMPI_COMM_NAMEISSET; + ompi_mpi_comm_self.comm.c_flags |= OMPI_COMM_INTRINSIC; /* We can set MPI_COMM_SELF's keyhash to NULL because it has no predefined attributes. If a user defines an attribute on MPI_COMM_SELF, the keyhash will automatically be created. */ - ompi_mpi_comm_self.c_keyhash = NULL; + ompi_mpi_comm_self.comm.c_keyhash = NULL; /* Setup MPI_COMM_NULL */ OBJ_CONSTRUCT(&ompi_mpi_comm_null, ompi_communicator_t); - ompi_mpi_comm_null.c_local_group = &ompi_mpi_group_null; - ompi_mpi_comm_null.c_remote_group = &ompi_mpi_group_null; - OBJ_RETAIN(&ompi_mpi_group_null); - OBJ_RETAIN(&ompi_mpi_group_null); + ompi_mpi_comm_null.comm.c_local_group = &ompi_mpi_group_null.group; + ompi_mpi_comm_null.comm.c_remote_group = &ompi_mpi_group_null.group; + OBJ_RETAIN(&ompi_mpi_group_null.group); + OBJ_RETAIN(&ompi_mpi_group_null.group); - ompi_mpi_comm_null.c_contextid = 2; - ompi_mpi_comm_null.c_f_to_c_index = 2; - ompi_mpi_comm_null.c_my_rank = MPI_PROC_NULL; + ompi_mpi_comm_null.comm.c_contextid = 2; + ompi_mpi_comm_null.comm.c_f_to_c_index = 2; + ompi_mpi_comm_null.comm.c_my_rank = MPI_PROC_NULL; - ompi_mpi_comm_null.error_handler = &ompi_mpi_errors_are_fatal; - OBJ_RETAIN( &ompi_mpi_errors_are_fatal ); + ompi_mpi_comm_null.comm.error_handler = &ompi_mpi_errors_are_fatal.eh; + OBJ_RETAIN( &ompi_mpi_errors_are_fatal.eh ); opal_pointer_array_set_item (&ompi_mpi_communicators, 2, &ompi_mpi_comm_null); - MEMCHECKER (memset (ompi_mpi_comm_null.c_name, 0, MPI_MAX_OBJECT_NAME)); - strncpy(ompi_mpi_comm_null.c_name,"MPI_COMM_NULL",strlen("MPI_COMM_NULL")+1); - ompi_mpi_comm_null.c_flags |= OMPI_COMM_NAMEISSET; - ompi_mpi_comm_null.c_flags |= OMPI_COMM_INTRINSIC; + MEMCHECKER (memset (ompi_mpi_comm_null.comm.c_name, 0, MPI_MAX_OBJECT_NAME)); + strncpy(ompi_mpi_comm_null.comm.c_name,"MPI_COMM_NULL",strlen("MPI_COMM_NULL")+1); + ompi_mpi_comm_null.comm.c_flags |= OMPI_COMM_NAMEISSET; + ompi_mpi_comm_null.comm.c_flags |= OMPI_COMM_INTRINSIC; /* Initialize the parent communicator to MPI_COMM_NULL */ - ompi_mpi_comm_parent = &ompi_mpi_comm_null; + ompi_mpi_comm_parent = &ompi_mpi_comm_null.comm; OBJ_RETAIN(&ompi_mpi_comm_null); - OBJ_RETAIN(&ompi_mpi_group_null); - OBJ_RETAIN(&ompi_mpi_errors_are_fatal); + OBJ_RETAIN(&ompi_mpi_group_null.group); + OBJ_RETAIN(&ompi_mpi_errors_are_fatal.eh); /* initialize the comm_reg stuff for multi-threaded comm_cid allocation */ @@ -216,7 +217,7 @@ int ompi_comm_finalize(void) OBJ_DESTRUCT( &ompi_mpi_comm_world ); /* Shut down the parent communicator, if it exists */ - if( ompi_mpi_comm_parent != &ompi_mpi_comm_null ) { + if( ompi_mpi_comm_parent != &ompi_mpi_comm_null.comm ) { /* Note that we pass ompi_mpi_comm_parent here (vs. &ompi_mpi_comm_parent) because it is of type (ompi_communicator_t*), *NOT* (ompi_communicator_t). This diff --git a/ompi/communicator/communicator.h b/ompi/communicator/communicator.h index 3eb86b6db0..48d8de16d2 100644 --- a/ompi/communicator/communicator.h +++ b/ompi/communicator/communicator.h @@ -12,6 +12,7 @@ * All rights reserved. * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. * Copyright (c) 2006-2008 University of Houston. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -104,7 +105,7 @@ struct ompi_communicator_t { int c_id_available; /* the currently available Cid for allocation to a child*/ int c_id_start_index; /* the starting index of the block of cids - allocated to tthis communicator*/ + allocated to this communicator*/ ompi_group_t *c_local_group; ompi_group_t *c_remote_group; @@ -156,8 +157,79 @@ struct ompi_communicator_t { mca_coll_base_comm_coll_t c_coll; }; typedef struct ompi_communicator_t ompi_communicator_t; + +/** + * Padded struct to maintain back compatibiltiy. + * + * The following ompi_predefined_xxx_t structure is used to maintain + * backwards binary compatibility for MPI applications compiled + * against one version of OMPI library but dynamically linked at + * runtime with another. The issue is between versions the actual + * structure may change in size (even between debug and optimized + * compilation -- the structure contents change, and therefore the + * overall size changes). + * + * This is problematic with predefined handles because the storage of + * the structure ends up being located to an application's BSS. This + * causes problems because if one version has the predefined as size X + * and then the application is dynamically linked with a version that + * has a size of Y (where X != Y) then the application will + * unintentionally overrun the memory initially allocated for the + * structure. + * + * The solution we are using below creates a parent structure + * (ompi_predefined_xxx_t) that contains the base structure + * (ompi_xxx_t) followed by a character padding that is the size of + * the total size we choose to preallocate for the structure minus the + * amount used by the base structure. In this way, we've normalized + * the size of each predefined handle across multiple versions and + * configurations of Open MPI (e.g., MPI_COMM_WORLD will refer to a + * back-end struct that is X bytes long, even if we change the + * back-end ompi_communicator_t between version A.B and version C.D in + * Open MPI). When we come close to filling up the the padding we can + * add a pointer at the back end of the base structure to point to an + * extension of the type. Or we can just increase the padding and + * break backwards binary compatibility. + * + * The above method was decided after several failed attempts + * described below. + * + * - Original implementation - suffered that the base structure seemed + * to always change in size between Open MPI versions and/or + * configurations (e.g., optimized vs. debugging build). + * + * - Convert all predefined handles to run-time-assigned pointers + * (i.e., global variables) - This worked except in cases where an MPI + * application wanted to assign the predefined handle value to a + * global variable -- we could not guarantee to have the global + * variable filled until MPI_INIT was called (recall that MPI + * predefined handles must be assignable before MPI_INIT; e.g., + * "MPI_Comm foo = MPI_COMM_WORLD"). + * + * - union of struct and padding - Similar to current implementation + * except using a union for the parent. This worked except in cases + * where the compilers did not support C99 union static initalizers. + * It would have been a pain to convert a bunch of the code to use + * non-static initializers (e.g., MPI datatypes). + */ + +/* Define for the preallocated size of the predefined handle. + * Note that we are using a pointer type as the base memory chunk + * size so when the bitness changes the size of the handle changes. + * This is done so we don't end up needing a structure that is + * incredibly larger than necessary because of the bitness. + */ +#define PREDEFINED_COMMUNICATOR_PAD (sizeof(void*) * 96) + +struct ompi_predefined_communicator_t { + struct ompi_communicator_t comm; + char padding[PREDEFINED_COMMUNICATOR_PAD - sizeof(ompi_communicator_t)]; +}; +typedef struct ompi_predefined_communicator_t ompi_predefined_communicator_t; + OMPI_DECLSPEC extern ompi_communicator_t *ompi_mpi_comm_parent; -OMPI_DECLSPEC extern ompi_communicator_t ompi_mpi_comm_null; +OMPI_DECLSPEC extern ompi_predefined_communicator_t ompi_mpi_comm_null; + /** diff --git a/ompi/datatype/datatype.h b/ompi/datatype/datatype.h index c9e8927be5..0bf94411b9 100644 --- a/ompi/datatype/datatype.h +++ b/ompi/datatype/datatype.h @@ -12,6 +12,7 @@ * All rights reserved. * Copyright (c) 2007 Los Alamos National Security, LLC. All rights * reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -95,15 +96,15 @@ typedef struct dt_type_desc { */ typedef struct ompi_datatype_t { opal_object_t super; /**< basic superclass */ + uint16_t flags; /**< the flags */ + uint16_t id; /**< data id, normally the index in the data array. */ size_t size; /**< total size in bytes of the memory used by the data if - * the data is put on a contiguous buffer */ - uint32_t align; /**< data should be aligned to */ + the data is put on a contiguous buffer */ ptrdiff_t true_lb; ptrdiff_t true_ub; /**< the true ub of the data without user defined lb and ub */ ptrdiff_t lb; /**< lower bound in memory */ ptrdiff_t ub; /**< upper bound in memory */ - uint16_t flags; /**< the flags */ - uint16_t id; /**< data id, normally the index in the data array. */ + uint32_t align; /**< data should be aligned to */ uint32_t nbElems; /**< total number of elements inside the datatype */ uint64_t bdt_used; /**< which basic datatypes are used in the data description */ @@ -124,6 +125,25 @@ typedef struct ompi_datatype_t { OMPI_DECLSPEC OBJ_CLASS_DECLARATION( ompi_datatype_t ); +/** + * Padded struct to maintain back compatibiltiy. + * See ompi/communicator/communicator.h comments with struct ompi_communicator_t + * for full explanation why we chose the following padding construct for predefines. + */ + +/* Using set constant for padding of the DATATYPE handles because the size of + * base structure is very close to being the same no matter the bitness. + */ +#define PREDEFINED_DATATYPE_PAD (512) + +struct ompi_predefined_datatype_t { + struct ompi_datatype_t dt; + char padding[PREDEFINED_DATATYPE_PAD - sizeof(ompi_datatype_t)]; +}; + +typedef struct ompi_predefined_datatype_t ompi_predefined_datatype_t; + + int ompi_ddt_register_params(void); OMPI_DECLSPEC int32_t ompi_ddt_init( void ); OMPI_DECLSPEC int32_t ompi_ddt_finalize( void ); diff --git a/ompi/datatype/dt_create_dup.c b/ompi/datatype/dt_create_dup.c index d789f9f9c5..1907172ec4 100644 --- a/ompi/datatype/dt_create_dup.c +++ b/ompi/datatype/dt_create_dup.c @@ -10,6 +10,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2006 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -75,7 +76,7 @@ int32_t ompi_ddt_create_contiguous( int count, const ompi_datatype_t* oldType, if( 0 == count ) { pdt = ompi_ddt_create( 0 ); - ompi_ddt_add( pdt, &ompi_mpi_datatype_null, 0, 0, 0 ); + ompi_ddt_add( pdt, &ompi_mpi_datatype_null.dt, 0, 0, 0 ); } else { pdt = ompi_ddt_create( oldType->desc.used + 2 ); ompi_ddt_add( pdt, oldType, count, 0, (oldType->ub - oldType->lb) ); diff --git a/ompi/datatype/dt_create_indexed.c b/ompi/datatype/dt_create_indexed.c index ef810cf62d..b67e6116bd 100644 --- a/ompi/datatype/dt_create_indexed.c +++ b/ompi/datatype/dt_create_indexed.c @@ -10,6 +10,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2006 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -31,7 +32,7 @@ int32_t ompi_ddt_create_indexed( int count, const int* pBlockLength, const int* if( 0 == count ) { *newType = ompi_ddt_create( 0 ); - ompi_ddt_add( *newType, &ompi_mpi_datatype_null, 0, 0, 0); + ompi_ddt_add( *newType, &ompi_mpi_datatype_null.dt, 0, 0, 0); return OMPI_SUCCESS; } @@ -73,7 +74,7 @@ int32_t ompi_ddt_create_hindexed( int count, const int* pBlockLength, const MPI_ if( 0 == count ) { *newType = ompi_ddt_create( 0 ); - ompi_ddt_add( *newType, &ompi_mpi_datatype_null, 0, 0, 0); + ompi_ddt_add( *newType, &ompi_mpi_datatype_null.dt, 0, 0, 0); return OMPI_SUCCESS; } @@ -114,7 +115,7 @@ int32_t ompi_ddt_create_indexed_block( int count, int bLength, const int* pDisp, if( (count == 0) || (bLength == 0) ) { *newType = ompi_ddt_create(1); if( 0 == count ) - ompi_ddt_add( *newType, &ompi_mpi_datatype_null, 0, 0, 0 ); + ompi_ddt_add( *newType, &ompi_mpi_datatype_null.dt, 0, 0, 0 ); else ompi_ddt_add( *newType, oldType, 0, pDisp[0] * extent, extent ); return OMPI_SUCCESS; diff --git a/ompi/datatype/dt_create_struct.c b/ompi/datatype/dt_create_struct.c index 42a43b0e19..241d714360 100644 --- a/ompi/datatype/dt_create_struct.c +++ b/ompi/datatype/dt_create_struct.c @@ -10,6 +10,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2006 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -31,7 +32,7 @@ int32_t ompi_ddt_create_struct( int count, const int* pBlockLength, const MPI_Ai if( 0 == count ) { *newType = ompi_ddt_create( 0 ); - ompi_ddt_add( *newType, &ompi_mpi_datatype_null, 0, 0, 0); + ompi_ddt_add( *newType, &ompi_mpi_datatype_null.dt, 0, 0, 0); return OMPI_SUCCESS; } diff --git a/ompi/datatype/dt_create_vector.c b/ompi/datatype/dt_create_vector.c index 8782285518..5af0525598 100644 --- a/ompi/datatype/dt_create_vector.c +++ b/ompi/datatype/dt_create_vector.c @@ -10,6 +10,8 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2006 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. + * $COPYRIGHT$ * * Additional copyrights may follow @@ -35,7 +37,7 @@ int32_t ompi_ddt_create_vector( int count, int bLength, int stride, if( 0 == count ) { *newType = ompi_ddt_create( 0 ); - ompi_ddt_add( *newType, &ompi_mpi_datatype_null, 0, 0, 0); + ompi_ddt_add( *newType, &ompi_mpi_datatype_null.dt, 0, 0, 0); return OMPI_SUCCESS; } @@ -65,7 +67,7 @@ int32_t ompi_ddt_create_hvector( int count, int bLength, MPI_Aint stride, if( 0 == count ) { *newType = ompi_ddt_create( 0 ); - ompi_ddt_add( *newType, &ompi_mpi_datatype_null, 0, 0, 0); + ompi_ddt_add( *newType, &ompi_mpi_datatype_null.dt, 0, 0, 0); return OMPI_SUCCESS; } diff --git a/ompi/datatype/dt_match_size.c b/ompi/datatype/dt_match_size.c index f339fa8310..8fd976ddf6 100644 --- a/ompi/datatype/dt_match_size.c +++ b/ompi/datatype/dt_match_size.c @@ -10,6 +10,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2006 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -47,5 +48,5 @@ ompi_ddt_match_size( int size, uint16_t datakind, uint16_t datalang ) return datatype; } } - return &ompi_mpi_datatype_null; + return &ompi_mpi_datatype_null.dt; } diff --git a/ompi/datatype/dt_module.c b/ompi/datatype/dt_module.c index 042b1dde15..1f5fbafe8b 100644 --- a/ompi/datatype/dt_module.c +++ b/ompi/datatype/dt_module.c @@ -11,6 +11,7 @@ * Copyright (c) 2004-2006 The Regents of the University of California. * All rights reserved. * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -53,37 +54,35 @@ int ompi_ddt_dfd = -1; * correct information. This macro should be used for all composed types. */ #define INIT_BASIC_TYPE( TYPE, NAME ) \ - { BASEOBJ_DATA, 0/*size*/, 0 /*align*/, 0/*true_lb*/, 0/*true_ub*/, \ - 0/*lb*/, 0/*ub*/, DT_FLAG_PREDEFINED, TYPE, 1, \ + { BASEOBJ_DATA, DT_FLAG_PREDEFINED, TYPE, 0/*size*/, \ + 0/*true_lb*/, 0/*true_ub*/, 0/*lb*/, 0/*ub*/, 0 /* align */, 1, \ (((uint64_t)1)<<(TYPE)), EMPTY_DATA(NAME) } -#define INIT_BASIC_DATA( TYPE, ALIGN, NAME, FLAGS ) \ - { BASEOBJ_DATA, sizeof(TYPE), ALIGN, 0, sizeof(TYPE), \ - 0, sizeof(TYPE), DT_FLAG_BASIC | (FLAGS), \ - DT_##NAME, 1, (((uint64_t)1)<<(DT_##NAME)), EMPTY_DATA(NAME) } +#define INIT_BASIC_DATA( TYPE, ALIGN, NAME, FLAGS ) \ + { BASEOBJ_DATA, DT_FLAG_BASIC | (FLAGS), DT_##NAME, sizeof(TYPE), 0, \ + sizeof(TYPE), 0, sizeof(TYPE), (ALIGN), \ + 1, (((uint64_t)1)<<(DT_##NAME)), EMPTY_DATA(NAME) } -#define INIT_BASIC_DATA_WITH_NAME( TYPE, ALIGN, INTERNAL_NAME, NAME, FLAGS ) \ - { BASEOBJ_DATA, sizeof(TYPE), ALIGN, 0, sizeof(TYPE), \ - 0, sizeof(TYPE), DT_FLAG_BASIC | (FLAGS), \ - DT_##INTERNAL_NAME, 1, (((uint64_t)1)<<(DT_##INTERNAL_NAME)), \ - EMPTY_DATA(NAME) } +#define INIT_BASIC_DATA_WITH_NAME( TYPE, ALIGN, INTERNAL_NAME, NAME, FLAGS ) \ + { BASEOBJ_DATA, DT_FLAG_BASIC | (FLAGS),DT_##INTERNAL_NAME, sizeof(TYPE), \ + 0, sizeof(TYPE), 0, sizeof(TYPE), (ALIGN), \ + 1, (((uint64_t)1)<<(DT_##INTERNAL_NAME)), EMPTY_DATA(NAME) } #define INIT_UNAVAILABLE_DATA( NAME ) \ - { BASEOBJ_DATA, 0, 0, 0, 0, 0, 0, DT_FLAG_UNAVAILABLE | DT_FLAG_PREDEFINED, \ - DT_UNAVAILABLE, 1, 0, EMPTY_DATA( "UNAVAILABLE_" # NAME ) } + { BASEOBJ_DATA, DT_FLAG_UNAVAILABLE | DT_FLAG_PREDEFINED, DT_UNAVAILABLE, 0,\ + 0, 0, 0, 0, 0, 1, 0, EMPTY_DATA( "UNAVAILABLE_" # NAME ) } /* The upper bound and the true UB are set to the size of the datatype. * If it's not the case then they should be modified in the initialization * function. */ #if OMPI_WANT_F77_BINDINGS -#define INIT_BASIC_FORTRAN_TYPE( TYPE, NAME, SIZE, ALIGN, FLAGS ) \ - { BASEOBJ_DATA, SIZE, ALIGN, 0/*true_lb*/, SIZE/*true_ub*/, \ - 0/*lb*/, SIZE/*ub*/, \ - DT_FLAG_BASIC | DT_FLAG_DATA_FORTRAN | (FLAGS), \ - (TYPE), 1, (((uint64_t)1)<<(TYPE)), EMPTY_DATA(NAME) } +#define INIT_BASIC_FORTRAN_TYPE( TYPE, NAME, SIZE, ALIGN, FLAGS ) \ + { BASEOBJ_DATA, DT_FLAG_BASIC | DT_FLAG_DATA_FORTRAN | (FLAGS), \ + (TYPE), SIZE, 0/*true_lb*/, SIZE/*true_ub*/, 0/*lb*/, SIZE/*ub*/, \ + (ALIGN), 1, (((uint64_t)1)<<(TYPE)), EMPTY_DATA(NAME) } #else -#define INIT_BASIC_FORTRAN_TYPE( TYPE, NAME, SIZE, ALIGN, FLAGS ) \ +#define INIT_BASIC_FORTRAN_TYPE( TYPE, NAME, SIZE, ALIGN, FLAGS ) \ INIT_BASIC_TYPE( TYPE, NAME ) #endif /* OMPI_WANT_F77_BINDINGS */ @@ -93,170 +92,169 @@ int ompi_ddt_dfd = -1; */ int32_t ompi_ddt_number_of_predefined_data = 0; -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_datatype_null = - { BASEOBJ_DATA, 0, 0, 0, 0, - 0, 0, DT_FLAG_PREDEFINED, 0, 1, - ((long long)0), EMPTY_DATA(DATATYPE_NULL) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_datatype_null = { + { BASEOBJ_DATA, DT_FLAG_PREDEFINED, 0, 0, 0, 0, + 0, 0, 0, 1, ((long long)0), EMPTY_DATA(DATATYPE_NULL) }}; OMPI_DECLSPEC ompi_datatype_t ompi_mpi_loop = INIT_BASIC_TYPE( DT_LOOP, LOOP ); OMPI_DECLSPEC ompi_datatype_t ompi_mpi_end_loop = INIT_BASIC_TYPE( DT_END_LOOP, END_LOOP ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_ub = INIT_BASIC_TYPE( DT_UB, UB ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_lb = INIT_BASIC_TYPE( DT_LB, LB ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_char = INIT_BASIC_DATA( char, OMPI_ALIGNMENT_CHAR, CHAR, DT_FLAG_DATA_C ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_character = INIT_BASIC_DATA( char, OMPI_ALIGNMENT_CHAR, CHARACTER, DT_FLAG_DATA_FORTRAN ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_unsigned_char = INIT_BASIC_DATA( unsigned char, OMPI_ALIGNMENT_CHAR, UNSIGNED_CHAR, DT_FLAG_DATA_C ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_signed_char = INIT_BASIC_DATA( signed char, OMPI_ALIGNMENT_CHAR, SIGNED_CHAR, DT_FLAG_DATA_C | DT_FLAG_DATA_INT ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_byte = INIT_BASIC_DATA( unsigned char, OMPI_ALIGNMENT_CHAR, BYTE, DT_FLAG_DATA_C | DT_FLAG_DATA_INT ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_short = INIT_BASIC_DATA( short, OMPI_ALIGNMENT_SHORT, SHORT, DT_FLAG_DATA_C | DT_FLAG_DATA_INT ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_unsigned_short = INIT_BASIC_DATA( unsigned short, OMPI_ALIGNMENT_SHORT, UNSIGNED_SHORT, DT_FLAG_DATA_C | DT_FLAG_DATA_INT ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_int = INIT_BASIC_DATA( int, OMPI_ALIGNMENT_INT, INT, DT_FLAG_DATA_C | DT_FLAG_DATA_INT ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_unsigned = INIT_BASIC_DATA_WITH_NAME( unsigned int, OMPI_ALIGNMENT_INT, UNSIGNED_INT, UNSIGNED, DT_FLAG_DATA_C | DT_FLAG_DATA_INT ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_long = INIT_BASIC_DATA( long, OMPI_ALIGNMENT_LONG, LONG, DT_FLAG_DATA_C | DT_FLAG_DATA_INT ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_unsigned_long = INIT_BASIC_DATA( unsigned long, OMPI_ALIGNMENT_LONG, UNSIGNED_LONG, DT_FLAG_DATA_C | DT_FLAG_DATA_INT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_ub = { INIT_BASIC_TYPE( DT_UB, UB) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_lb = { INIT_BASIC_TYPE( DT_LB, LB) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_char = { INIT_BASIC_DATA( char, OMPI_ALIGNMENT_CHAR, CHAR, DT_FLAG_DATA_C ) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_character = { INIT_BASIC_DATA( char, OMPI_ALIGNMENT_CHAR, CHARACTER, DT_FLAG_DATA_FORTRAN) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_unsigned_char = { INIT_BASIC_DATA( unsigned char, OMPI_ALIGNMENT_CHAR, UNSIGNED_CHAR, DT_FLAG_DATA_C) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_signed_char = { INIT_BASIC_DATA( signed char, OMPI_ALIGNMENT_CHAR, SIGNED_CHAR, DT_FLAG_DATA_C | DT_FLAG_DATA_INT) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_byte = { INIT_BASIC_DATA( unsigned char, OMPI_ALIGNMENT_CHAR, BYTE, DT_FLAG_DATA_C | DT_FLAG_DATA_INT ) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_short = { INIT_BASIC_DATA( short, OMPI_ALIGNMENT_SHORT, SHORT, DT_FLAG_DATA_C | DT_FLAG_DATA_INT) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_unsigned_short = { INIT_BASIC_DATA( unsigned short, OMPI_ALIGNMENT_SHORT, UNSIGNED_SHORT, DT_FLAG_DATA_C | DT_FLAG_DATA_INT) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_int = { INIT_BASIC_DATA( int, OMPI_ALIGNMENT_INT, INT, DT_FLAG_DATA_C | DT_FLAG_DATA_INT) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_unsigned = { INIT_BASIC_DATA_WITH_NAME( unsigned int, OMPI_ALIGNMENT_INT, UNSIGNED_INT, UNSIGNED, DT_FLAG_DATA_C | DT_FLAG_DATA_INT) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_long = { INIT_BASIC_DATA( long, OMPI_ALIGNMENT_LONG, LONG, DT_FLAG_DATA_C | DT_FLAG_DATA_INT) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_unsigned_long = { INIT_BASIC_DATA( unsigned long, OMPI_ALIGNMENT_LONG, UNSIGNED_LONG, DT_FLAG_DATA_C | DT_FLAG_DATA_INT) }; #if HAVE_LONG_LONG -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_long_long_int = INIT_BASIC_DATA_WITH_NAME( long long, OMPI_ALIGNMENT_LONG_LONG, LONG_LONG_INT, LONG_LONG, DT_FLAG_DATA_C | DT_FLAG_DATA_INT ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_unsigned_long_long = INIT_BASIC_DATA( unsigned long long, OMPI_ALIGNMENT_LONG_LONG, UNSIGNED_LONG_LONG, DT_FLAG_DATA_C | DT_FLAG_DATA_INT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_long_long_int = { INIT_BASIC_DATA_WITH_NAME( long long, OMPI_ALIGNMENT_LONG_LONG, LONG_LONG_INT, LONG_LONG, DT_FLAG_DATA_C | DT_FLAG_DATA_INT) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_unsigned_long_long = { INIT_BASIC_DATA( unsigned long long, OMPI_ALIGNMENT_LONG_LONG, UNSIGNED_LONG_LONG, DT_FLAG_DATA_C | DT_FLAG_DATA_INT) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_long_long_int = INIT_UNAVAILABLE_DATA( LONG_LONG_INT ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_unsigned_long_long = INIT_UNAVAILABLE_DATA( UNIGNED_LONG_LONG ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_long_long_int = { INIT_UNAVAILABLE_DATA( LONG_LONG_INT) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_unsigned_long_long = { INIT_UNAVAILABLE_DATA( UNIGNED_LONG_LONG) }; #endif /* HAVE_LONG_LONG */ -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_float = INIT_BASIC_DATA( float, OMPI_ALIGNMENT_FLOAT, FLOAT, DT_FLAG_DATA_C | DT_FLAG_DATA_FLOAT ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_double = INIT_BASIC_DATA( double, OMPI_ALIGNMENT_DOUBLE, DOUBLE, DT_FLAG_DATA_C | DT_FLAG_DATA_FLOAT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_float = { INIT_BASIC_DATA( float, OMPI_ALIGNMENT_FLOAT, FLOAT, DT_FLAG_DATA_C | DT_FLAG_DATA_FLOAT) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_double = { INIT_BASIC_DATA( double, OMPI_ALIGNMENT_DOUBLE, DOUBLE, DT_FLAG_DATA_C | DT_FLAG_DATA_FLOAT) }; #if HAVE_LONG_DOUBLE -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_long_double = INIT_BASIC_DATA( long double, OMPI_ALIGNMENT_LONG_DOUBLE, LONG_DOUBLE, DT_FLAG_DATA_C | DT_FLAG_DATA_FLOAT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_long_double = { INIT_BASIC_DATA( long double, OMPI_ALIGNMENT_LONG_DOUBLE, LONG_DOUBLE, DT_FLAG_DATA_C | DT_FLAG_DATA_FLOAT) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_long_double = INIT_UNAVAILABLE_DATA( LONG_DOUBLE ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_long_double = { INIT_UNAVAILABLE_DATA( LONG_DOUBLE) }; #endif /* HAVE_LONG_DOUBLE */ -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_packed = INIT_BASIC_DATA( char, OMPI_ALIGNMENT_CHAR, PACKED, 0 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_packed = { INIT_BASIC_DATA( char, OMPI_ALIGNMENT_CHAR, PACKED, 0) }; #if OMPI_ALIGNMENT_WCHAR != 0 -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_wchar = INIT_BASIC_DATA( wchar_t, OMPI_ALIGNMENT_WCHAR, WCHAR, DT_FLAG_DATA_C ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_wchar = { INIT_BASIC_DATA( wchar_t, OMPI_ALIGNMENT_WCHAR, WCHAR, DT_FLAG_DATA_C) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_wchar = INIT_UNAVAILABLE_DATA( WCHAR ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_wchar = { INIT_UNAVAILABLE_DATA( WCHAR) }; #endif /* OMPI_ALIGNMENT_WCHAR */ -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_cxx_bool = INIT_BASIC_DATA( bool, OMPI_ALIGNMENT_CXX_BOOL, CXX_BOOL, DT_FLAG_DATA_CPP ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_logic = INIT_BASIC_FORTRAN_TYPE( DT_LOGIC, LOGIC, OMPI_SIZEOF_FORTRAN_LOGICAL, OMPI_ALIGNMENT_FORTRAN_LOGICAL, 0 ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_integer = INIT_BASIC_FORTRAN_TYPE( DT_INTEGER, INTEGER, OMPI_SIZEOF_FORTRAN_INTEGER, OMPI_ALIGNMENT_FORTRAN_INTEGER, DT_FLAG_DATA_INT ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_real = INIT_BASIC_FORTRAN_TYPE( DT_REAL, REAL, OMPI_SIZEOF_FORTRAN_REAL, OMPI_ALIGNMENT_FORTRAN_REAL, DT_FLAG_DATA_FLOAT ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_dblprec = INIT_BASIC_FORTRAN_TYPE( DT_DBLPREC, DOUBLE_PRECISION, OMPI_SIZEOF_FORTRAN_DOUBLE_PRECISION, OMPI_ALIGNMENT_FORTRAN_DOUBLE_PRECISION, DT_FLAG_DATA_FLOAT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_cxx_bool = { INIT_BASIC_DATA( bool, OMPI_ALIGNMENT_CXX_BOOL, CXX_BOOL, DT_FLAG_DATA_CPP) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_logic = { INIT_BASIC_FORTRAN_TYPE( DT_LOGIC, LOGIC, OMPI_SIZEOF_FORTRAN_LOGICAL, OMPI_ALIGNMENT_FORTRAN_LOGICAL, 0) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_integer = { INIT_BASIC_FORTRAN_TYPE( DT_INTEGER, INTEGER, OMPI_SIZEOF_FORTRAN_INTEGER, OMPI_ALIGNMENT_FORTRAN_INTEGER, DT_FLAG_DATA_INT) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_real = { INIT_BASIC_FORTRAN_TYPE( DT_REAL, REAL, OMPI_SIZEOF_FORTRAN_REAL, OMPI_ALIGNMENT_FORTRAN_REAL, DT_FLAG_DATA_FLOAT) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_dblprec = { INIT_BASIC_FORTRAN_TYPE( DT_DBLPREC, DOUBLE_PRECISION, OMPI_SIZEOF_FORTRAN_DOUBLE_PRECISION, OMPI_ALIGNMENT_FORTRAN_DOUBLE_PRECISION, DT_FLAG_DATA_FLOAT) }; #if HAVE_LONG_DOUBLE -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_ldblcplex = INIT_BASIC_DATA( ompi_complex_long_double_t, OMPI_ALIGNMENT_LONG_DOUBLE, COMPLEX_LONG_DOUBLE, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_COMPLEX ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_ldblcplex = { INIT_BASIC_DATA( ompi_complex_long_double_t, OMPI_ALIGNMENT_LONG_DOUBLE, COMPLEX_LONG_DOUBLE, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_COMPLEX) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_ldblcplex = INIT_UNAVAILABLE_DATA( COMPLEX_LONG_DOUBLE ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_ldblcplex = { INIT_UNAVAILABLE_DATA( COMPLEX_LONG_DOUBLE) }; #endif /* HAVE_LONG_DOUBLE */ -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_cplex = INIT_BASIC_DATA( ompi_complex_float_t, OMPI_ALIGNMENT_FLOAT, COMPLEX_FLOAT, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_COMPLEX ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_dblcplex = INIT_BASIC_DATA( ompi_complex_double_t, OMPI_ALIGNMENT_DOUBLE, COMPLEX_DOUBLE, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_COMPLEX ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_float_int = INIT_BASIC_TYPE( DT_FLOAT_INT, FLOAT_INT ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_double_int = INIT_BASIC_TYPE( DT_DOUBLE_INT, DOUBLE_INT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_cplex = { INIT_BASIC_DATA( ompi_complex_float_t, OMPI_ALIGNMENT_FLOAT, COMPLEX_FLOAT, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_COMPLEX) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_dblcplex = { INIT_BASIC_DATA( ompi_complex_double_t, OMPI_ALIGNMENT_DOUBLE, COMPLEX_DOUBLE, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_COMPLEX) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_float_int = { INIT_BASIC_TYPE( DT_FLOAT_INT, FLOAT_INT) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_double_int = { INIT_BASIC_TYPE( DT_DOUBLE_INT, DOUBLE_INT) }; #if HAVE_LONG_DOUBLE -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_longdbl_int = INIT_BASIC_TYPE( DT_LONG_DOUBLE_INT, LONG_DOUBLE_INT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_longdbl_int = { INIT_BASIC_TYPE( DT_LONG_DOUBLE_INT, LONG_DOUBLE_INT) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_longdbl_int = INIT_UNAVAILABLE_DATA( LONG_DOUBLE_INT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_longdbl_int = { INIT_UNAVAILABLE_DATA( LONG_DOUBLE_INT) }; #endif /* HAVE_LONG_DOUBLE */ -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_long_int = INIT_BASIC_TYPE( DT_LONG_INT, LONG_INT ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_short_int = INIT_BASIC_TYPE( DT_SHORT_INT, SHORT_INT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_long_int = { INIT_BASIC_TYPE( DT_LONG_INT, LONG_INT) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_short_int = { INIT_BASIC_TYPE( DT_SHORT_INT, SHORT_INT) }; -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_2int = INIT_BASIC_TYPE( DT_2INT, 2INT ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_2real = INIT_BASIC_TYPE( DT_2REAL, 2REAL ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_2dblprec = INIT_BASIC_TYPE( DT_2DBLPREC, 2DBLPREC ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_2integer = INIT_BASIC_TYPE( DT_2INTEGER, 2INTEGER ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_2int = { INIT_BASIC_TYPE( DT_2INT, 2INT) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_2real = { INIT_BASIC_TYPE( DT_2REAL, 2REAL) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_2dblprec = { INIT_BASIC_TYPE( DT_2DBLPREC, 2DBLPREC) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_2integer = { INIT_BASIC_TYPE( DT_2INTEGER, 2INTEGER) }; -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_cxx_cplex = INIT_BASIC_DATA( ompi_complex_float_t, OMPI_ALIGNMENT_FLOAT, COMPLEX_FLOAT, DT_FLAG_DATA_CPP | DT_FLAG_DATA_COMPLEX ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_cxx_dblcplex = INIT_BASIC_DATA( ompi_complex_double_t, OMPI_ALIGNMENT_DOUBLE, COMPLEX_DOUBLE, DT_FLAG_DATA_CPP | DT_FLAG_DATA_COMPLEX ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_cxx_cplex = { INIT_BASIC_DATA( ompi_complex_float_t, OMPI_ALIGNMENT_FLOAT, COMPLEX_FLOAT, DT_FLAG_DATA_CPP | DT_FLAG_DATA_COMPLEX) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_cxx_dblcplex = { INIT_BASIC_DATA( ompi_complex_double_t, OMPI_ALIGNMENT_DOUBLE, COMPLEX_DOUBLE, DT_FLAG_DATA_CPP | DT_FLAG_DATA_COMPLEX) }; #if HAVE_LONG_DOUBLE -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_cxx_ldblcplex = INIT_BASIC_DATA( ompi_complex_long_double_t, OMPI_ALIGNMENT_LONG_DOUBLE, COMPLEX_LONG_DOUBLE, DT_FLAG_DATA_CPP | DT_FLAG_DATA_COMPLEX ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_cxx_ldblcplex = { INIT_BASIC_DATA( ompi_complex_long_double_t, OMPI_ALIGNMENT_LONG_DOUBLE, COMPLEX_LONG_DOUBLE, DT_FLAG_DATA_CPP | DT_FLAG_DATA_COMPLEX) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_cxx_ldblcplex = INIT_UNAVAILABLE_DATA( COMPLEX_LONG_DOUBLE ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_cxx_ldblcplex = { INIT_UNAVAILABLE_DATA( COMPLEX_LONG_DOUBLE) }; #endif /* HAVE_LONG_DOUBLE */ -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_2cplex = INIT_BASIC_TYPE( DT_2COMPLEX, 2COMPLEX ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_2dblcplex = INIT_BASIC_TYPE( DT_2DOUBLE_COMPLEX, 2DOUBLE_COMPLEX ); -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_unavailable = INIT_UNAVAILABLE_DATA( UNAVAILABLE ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_2cplex = { INIT_BASIC_TYPE( DT_2COMPLEX, 2COMPLEX) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_2dblcplex = { INIT_BASIC_TYPE( DT_2DOUBLE_COMPLEX, 2DOUBLE_COMPLEX) }; +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_unavailable = { INIT_UNAVAILABLE_DATA( UNAVAILABLE) }; #if OMPI_HAVE_FORTRAN_LOGICAL1 -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_logical1 = INIT_BASIC_FORTRAN_TYPE( DT_LOGIC, LOGICAL1, OMPI_SIZEOF_FORTRAN_LOGICAL1, OMPI_ALIGNMENT_FORTRAN_LOGICAL1, 0 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_logical1 = { INIT_BASIC_FORTRAN_TYPE( DT_LOGIC, LOGICAL1, OMPI_SIZEOF_FORTRAN_LOGICAL1, OMPI_ALIGNMENT_FORTRAN_LOGICAL1, 0) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_logical1 = INIT_UNAVAILABLE_DATA( LOGICAL1 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_logical1 = { INIT_UNAVAILABLE_DATA( LOGICAL1) }; #endif /* OMPI_HAVE_FORTRAN_LOGICAL1 */ #if OMPI_HAVE_FORTRAN_LOGICAL2 -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_logical2 = INIT_BASIC_FORTRAN_TYPE( DT_LOGIC, LOGICAL2, OMPI_SIZEOF_FORTRAN_LOGICAL2, OMPI_ALIGNMENT_FORTRAN_LOGICAL2, 0 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_logical2 = { INIT_BASIC_FORTRAN_TYPE( DT_LOGIC, LOGICAL2, OMPI_SIZEOF_FORTRAN_LOGICAL2, OMPI_ALIGNMENT_FORTRAN_LOGICAL2, 0) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_logical2 = INIT_UNAVAILABLE_DATA( LOGICAL2 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_logical2 = { INIT_UNAVAILABLE_DATA( LOGICAL2) }; #endif /* OMPI_HAVE_FORTRAN_LOGICAL2 */ #if OMPI_HAVE_FORTRAN_LOGICAL4 -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_logical4 = INIT_BASIC_FORTRAN_TYPE( DT_LOGIC, LOGICAL4, OMPI_SIZEOF_FORTRAN_LOGICAL4, OMPI_ALIGNMENT_FORTRAN_LOGICAL4, 0 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_logical4 = { INIT_BASIC_FORTRAN_TYPE( DT_LOGIC, LOGICAL4, OMPI_SIZEOF_FORTRAN_LOGICAL4, OMPI_ALIGNMENT_FORTRAN_LOGICAL4, 0) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_logical4 = INIT_UNAVAILABLE_DATA( LOGICAL4 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_logical4 = { INIT_UNAVAILABLE_DATA( LOGICAL4) }; #endif /* OMPI_HAVE_FORTRAN_LOGICAL4 */ #if OMPI_HAVE_FORTRAN_LOGICAL8 -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_logical8 = INIT_BASIC_FORTRAN_TYPE( DT_LOGIC, LOGICAL8, OMPI_SIZEOF_FORTRAN_LOGICAL8, OMPI_ALIGNMENT_FORTRAN_LOGICAL8, 0 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_logical8 = { INIT_BASIC_FORTRAN_TYPE( DT_LOGIC, LOGICAL8, OMPI_SIZEOF_FORTRAN_LOGICAL8, OMPI_ALIGNMENT_FORTRAN_LOGICAL8, 0) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_logical8 = INIT_UNAVAILABLE_DATA( LOGICAL8 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_logical8 = { INIT_UNAVAILABLE_DATA( LOGICAL8) }; #endif /* OMPI_HAVE_FORTRAN_LOGICAL8 */ #if OMPI_HAVE_FORTRAN_REAL2 -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_real2 = INIT_BASIC_FORTRAN_TYPE( DT_FLOAT, REAL2, OMPI_SIZEOF_FORTRAN_REAL2, OMPI_ALIGNMENT_FORTRAN_REAL2, DT_FLAG_DATA_FLOAT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_real2 = { INIT_BASIC_FORTRAN_TYPE( DT_FLOAT, REAL2, OMPI_SIZEOF_FORTRAN_REAL2, OMPI_ALIGNMENT_FORTRAN_REAL2, DT_FLAG_DATA_FLOAT) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_real2 = INIT_UNAVAILABLE_DATA( REAL2 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_real2 = { INIT_UNAVAILABLE_DATA( REAL2) }; #endif #if OMPI_HAVE_FORTRAN_REAL4 -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_real4 = INIT_BASIC_FORTRAN_TYPE( DT_FLOAT, REAL4, OMPI_SIZEOF_FORTRAN_REAL4, OMPI_ALIGNMENT_FORTRAN_REAL4, DT_FLAG_DATA_FLOAT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_real4 = { INIT_BASIC_FORTRAN_TYPE( DT_FLOAT, REAL4, OMPI_SIZEOF_FORTRAN_REAL4, OMPI_ALIGNMENT_FORTRAN_REAL4, DT_FLAG_DATA_FLOAT) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_real4 = INIT_UNAVAILABLE_DATA( REAL4 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_real4 = { INIT_UNAVAILABLE_DATA( REAL4) }; #endif #if OMPI_HAVE_FORTRAN_REAL8 -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_real8 = INIT_BASIC_FORTRAN_TYPE( DT_DOUBLE, REAL8, OMPI_SIZEOF_FORTRAN_REAL8, OMPI_ALIGNMENT_FORTRAN_REAL8, DT_FLAG_DATA_FLOAT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_real8 = { INIT_BASIC_FORTRAN_TYPE( DT_DOUBLE, REAL8, OMPI_SIZEOF_FORTRAN_REAL8, OMPI_ALIGNMENT_FORTRAN_REAL8, DT_FLAG_DATA_FLOAT) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_real8 = INIT_UNAVAILABLE_DATA( REAL8 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_real8 = { INIT_UNAVAILABLE_DATA( REAL8) }; #endif #if OMPI_HAVE_FORTRAN_REAL16 && OMPI_REAL16_MATCHES_C -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_real16 = INIT_BASIC_FORTRAN_TYPE( DT_LONG_DOUBLE, REAL16, OMPI_SIZEOF_FORTRAN_REAL16, OMPI_ALIGNMENT_FORTRAN_REAL16, DT_FLAG_DATA_FLOAT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_real16 = { INIT_BASIC_FORTRAN_TYPE( DT_LONG_DOUBLE, REAL16, OMPI_SIZEOF_FORTRAN_REAL16, OMPI_ALIGNMENT_FORTRAN_REAL16, DT_FLAG_DATA_FLOAT) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_real16 = INIT_UNAVAILABLE_DATA( REAL16 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_real16 = { INIT_UNAVAILABLE_DATA( REAL16) }; #endif #if OMPI_HAVE_FORTRAN_INTEGER1 -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_integer1 = INIT_BASIC_FORTRAN_TYPE( DT_CHAR, INTEGER1, OMPI_SIZEOF_FORTRAN_INTEGER1, OMPI_ALIGNMENT_FORTRAN_INTEGER1, DT_FLAG_DATA_INT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_integer1 = { INIT_BASIC_FORTRAN_TYPE( DT_CHAR, INTEGER1, OMPI_SIZEOF_FORTRAN_INTEGER1, OMPI_ALIGNMENT_FORTRAN_INTEGER1, DT_FLAG_DATA_INT) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_integer1 = INIT_UNAVAILABLE_DATA( INTEGER1 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_integer1 = { INIT_UNAVAILABLE_DATA( INTEGER1) }; #endif #if OMPI_HAVE_FORTRAN_INTEGER2 -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_integer2 = INIT_BASIC_FORTRAN_TYPE( DT_SHORT, INTEGER2, OMPI_SIZEOF_FORTRAN_INTEGER2, OMPI_ALIGNMENT_FORTRAN_INTEGER2, DT_FLAG_DATA_INT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_integer2 = { INIT_BASIC_FORTRAN_TYPE( DT_SHORT, INTEGER2, OMPI_SIZEOF_FORTRAN_INTEGER2, OMPI_ALIGNMENT_FORTRAN_INTEGER2, DT_FLAG_DATA_INT) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_integer2 = INIT_UNAVAILABLE_DATA( INTEGER2 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_integer2 = { INIT_UNAVAILABLE_DATA( INTEGER2) }; #endif #if OMPI_HAVE_FORTRAN_INTEGER4 -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_integer4 = INIT_BASIC_FORTRAN_TYPE( DT_INT, INTEGER4, OMPI_SIZEOF_FORTRAN_INTEGER4, OMPI_ALIGNMENT_FORTRAN_INTEGER4, DT_FLAG_DATA_INT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_integer4 = { INIT_BASIC_FORTRAN_TYPE( DT_INT, INTEGER4, OMPI_SIZEOF_FORTRAN_INTEGER4, OMPI_ALIGNMENT_FORTRAN_INTEGER4, DT_FLAG_DATA_INT) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_integer4 = INIT_UNAVAILABLE_DATA( INTEGER4 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_integer4 = { INIT_UNAVAILABLE_DATA( INTEGER4) }; #endif #if OMPI_HAVE_FORTRAN_INTEGER8 -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_integer8 = INIT_BASIC_FORTRAN_TYPE( DT_LONG_LONG_INT, INTEGER8, OMPI_SIZEOF_FORTRAN_INTEGER8, OMPI_ALIGNMENT_FORTRAN_INTEGER8, DT_FLAG_DATA_INT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_integer8 = { INIT_BASIC_FORTRAN_TYPE( DT_LONG_LONG_INT, INTEGER8, OMPI_SIZEOF_FORTRAN_INTEGER8, OMPI_ALIGNMENT_FORTRAN_INTEGER8, DT_FLAG_DATA_INT) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_integer8 = INIT_UNAVAILABLE_DATA( INTEGER8 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_integer8 = { INIT_UNAVAILABLE_DATA( INTEGER8) }; #endif #if OMPI_HAVE_FORTRAN_INTEGER16 -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_integer16 = INIT_BASIC_FORTRAN_TYPE( DT_LONG_LONG_INT, INTEGER16, OMPI_SIZEOF_FORTRAN_INTEGER16, OMPI_ALIGNMENT_FORTRAN_INTEGER16, DT_FLAG_DATA_INT ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_integer16 = { INIT_BASIC_FORTRAN_TYPE( DT_LONG_LONG_INT, INTEGER16, OMPI_SIZEOF_FORTRAN_INTEGER16, OMPI_ALIGNMENT_FORTRAN_INTEGER16, DT_FLAG_DATA_INT) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_integer16 = INIT_UNAVAILABLE_DATA( INTEGER16 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_integer16 = { INIT_UNAVAILABLE_DATA( INTEGER16) }; #endif #if OMPI_HAVE_FORTRAN_REAL4 && OMPI_HAVE_FORTRAN_COMPLEX8 -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_complex8 = INIT_BASIC_FORTRAN_TYPE( DT_COMPLEX_FLOAT, COMPLEX8, OMPI_SIZEOF_FORTRAN_COMPLEX, OMPI_ALIGNMENT_FORTRAN_REAL, DT_FLAG_DATA_COMPLEX ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_complex8 = { INIT_BASIC_FORTRAN_TYPE( DT_COMPLEX_FLOAT, COMPLEX8, OMPI_SIZEOF_FORTRAN_COMPLEX, OMPI_ALIGNMENT_FORTRAN_REAL, DT_FLAG_DATA_COMPLEX) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_complex8 = INIT_UNAVAILABLE_DATA( COMPLEX8 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_complex8 = { INIT_UNAVAILABLE_DATA( COMPLEX8) }; #endif #if OMPI_HAVE_FORTRAN_REAL8 && OMPI_HAVE_FORTRAN_COMPLEX16 -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_complex16 = INIT_BASIC_FORTRAN_TYPE( DT_COMPLEX_DOUBLE, COMPLEX16, OMPI_SIZEOF_FORTRAN_COMPLEX16, OMPI_ALIGNMENT_FORTRAN_COMPLEX16, DT_FLAG_DATA_COMPLEX ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_complex16 = { INIT_BASIC_FORTRAN_TYPE( DT_COMPLEX_DOUBLE, COMPLEX16, OMPI_SIZEOF_FORTRAN_COMPLEX16, OMPI_ALIGNMENT_FORTRAN_COMPLEX16, DT_FLAG_DATA_COMPLEX) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_complex16 = INIT_UNAVAILABLE_DATA( COMPLEX16 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_complex16 = { INIT_UNAVAILABLE_DATA( COMPLEX16) }; #endif #if OMPI_HAVE_FORTRAN_REAL16 && OMPI_HAVE_FORTRAN_COMPLEX32 && OMPI_REAL16_MATCHES_C -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_complex32 = INIT_BASIC_FORTRAN_TYPE( DT_COMPLEX_LONG_DOUBLE, COMPLEX32, OMPI_SIZEOF_FORTRAN_COMPLEX32, OMPI_ALIGNMENT_FORTRAN_COMPLEX32, DT_FLAG_DATA_COMPLEX ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_complex32 = { INIT_BASIC_FORTRAN_TYPE( DT_COMPLEX_LONG_DOUBLE, COMPLEX32, OMPI_SIZEOF_FORTRAN_COMPLEX32, OMPI_ALIGNMENT_FORTRAN_COMPLEX32, DT_FLAG_DATA_COMPLEX) }; #else -OMPI_DECLSPEC ompi_datatype_t ompi_mpi_complex32 = INIT_UNAVAILABLE_DATA( COMPLEX32 ); +OMPI_DECLSPEC ompi_predefined_datatype_t ompi_mpi_complex32 = { INIT_UNAVAILABLE_DATA( COMPLEX32) }; #endif /* @@ -266,46 +264,46 @@ OMPI_DECLSPEC ompi_datatype_t ompi_mpi_complex32 = INIT_UNAVAILABLE_DATA( COMPLE const ompi_datatype_t* ompi_ddt_basicDatatypes[DT_MAX_PREDEFINED] = { &ompi_mpi_loop, &ompi_mpi_end_loop, - &ompi_mpi_lb, - &ompi_mpi_ub, - &ompi_mpi_char, - &ompi_mpi_character, - &ompi_mpi_unsigned_char, - &ompi_mpi_signed_char, - &ompi_mpi_byte, - &ompi_mpi_short, - &ompi_mpi_unsigned_short, - &ompi_mpi_int, - &ompi_mpi_unsigned, - &ompi_mpi_long, - &ompi_mpi_unsigned_long, - &ompi_mpi_long_long_int, - &ompi_mpi_unsigned_long_long, - &ompi_mpi_float, - &ompi_mpi_double, - &ompi_mpi_long_double, - &ompi_mpi_packed, - &ompi_mpi_wchar, - &ompi_mpi_cxx_bool, - &ompi_mpi_logic, - &ompi_mpi_integer, - &ompi_mpi_real, - &ompi_mpi_dblprec, - &ompi_mpi_cplex, - &ompi_mpi_dblcplex, - &ompi_mpi_ldblcplex, - &ompi_mpi_2int, - &ompi_mpi_2integer, - &ompi_mpi_2real, - &ompi_mpi_2dblprec, - &ompi_mpi_2cplex, - &ompi_mpi_2dblcplex, - &ompi_mpi_float_int, - &ompi_mpi_double_int, - &ompi_mpi_longdbl_int, - &ompi_mpi_long_int, - &ompi_mpi_short_int, - &ompi_mpi_unavailable + &ompi_mpi_lb.dt, + &ompi_mpi_ub.dt, + &ompi_mpi_char.dt, + &ompi_mpi_character.dt, + &ompi_mpi_unsigned_char.dt, + &ompi_mpi_signed_char.dt, + &ompi_mpi_byte.dt, + &ompi_mpi_short.dt, + &ompi_mpi_unsigned_short.dt, + &ompi_mpi_int.dt, + &ompi_mpi_unsigned.dt, + &ompi_mpi_long.dt, + &ompi_mpi_unsigned_long.dt, + &ompi_mpi_long_long_int.dt, + &ompi_mpi_unsigned_long_long.dt, + &ompi_mpi_float.dt, + &ompi_mpi_double.dt, + &ompi_mpi_long_double.dt, + &ompi_mpi_packed.dt, + &ompi_mpi_wchar.dt, + &ompi_mpi_cxx_bool.dt, + &ompi_mpi_logic.dt, + &ompi_mpi_integer.dt, + &ompi_mpi_real.dt, + &ompi_mpi_dblprec.dt, + &ompi_mpi_cplex.dt, + &ompi_mpi_dblcplex.dt, + &ompi_mpi_ldblcplex.dt, + &ompi_mpi_2int.dt, + &ompi_mpi_2integer.dt, + &ompi_mpi_2real.dt, + &ompi_mpi_2dblprec.dt, + &ompi_mpi_2cplex.dt, + &ompi_mpi_2dblcplex.dt, + &ompi_mpi_float_int.dt, + &ompi_mpi_double_int.dt, + &ompi_mpi_longdbl_int.dt, + &ompi_mpi_long_int.dt, + &ompi_mpi_short_int.dt, + &ompi_mpi_unavailable.dt }; opal_pointer_array_t ompi_datatype_f_to_c_table; @@ -314,14 +312,14 @@ size_t ompi_ddt_local_sizes[DT_MAX_PREDEFINED]; #define COPY_DATA_DESC( PDST, PSRC ) \ do { \ + (PDST)->flags = (PSRC)->flags; \ + (PDST)->id = (PSRC)->id; \ (PDST)->size = (PSRC)->size; \ (PDST)->true_lb = (PSRC)->true_lb; \ (PDST)->true_ub = (PSRC)->true_ub; \ - (PDST)->align = (PSRC)->align; \ (PDST)->lb = (PSRC)->lb; \ (PDST)->ub = (PSRC)->ub; \ - (PDST)->flags = (PSRC)->flags; \ - (PDST)->id = (PSRC)->id; \ + (PDST)->align = (PSRC)->align; \ (PDST)->nbElems = (PSRC)->nbElems; \ (PDST)->bdt_used = (PSRC)->bdt_used; \ if( NULL != (PDST)->desc.desc ) \ @@ -467,41 +465,41 @@ int32_t ompi_ddt_init( void ) */ /* the 2 complex datatypes (float and double) */ - DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_cplex, DT_COMPLEX_FLOAT, "MPI_COMPLEX", + DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_cplex.dt, DT_COMPLEX_FLOAT, "MPI_COMPLEX", float, float, DT_FLOAT, DT_FLOAT, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_FLOAT ); - DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_dblcplex, DT_COMPLEX_DOUBLE, "MPI_DOUBLE_COMPLEX", + DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_dblcplex.dt, DT_COMPLEX_DOUBLE, "MPI_DOUBLE_COMPLEX", double, double, DT_DOUBLE, DT_DOUBLE, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_FLOAT ); #if HAVE_LONG_DOUBLE - DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_ldblcplex, DT_COMPLEX_LONG_DOUBLE, "MPI_LONG_DOUBLE_COMPLEX", + DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_ldblcplex.dt, DT_COMPLEX_LONG_DOUBLE, "MPI_LONG_DOUBLE_COMPLEX", long double, long double, DT_LONG_DOUBLE, DT_LONG_DOUBLE, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_FLOAT ); #endif /* HAVE_LONG_DOUBLE */ /* Now the predefined MPI2 datatypes (they should last forever!) */ - DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_float_int, DT_FLOAT_INT, "MPI_FLOAT_INT", + DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_float_int.dt, DT_FLOAT_INT, "MPI_FLOAT_INT", float, int, DT_FLOAT, DT_INT, DT_FLAG_DATA_C ); - DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_double_int, DT_DOUBLE_INT, "MPI_DOUBLE_INT", + DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_double_int.dt, DT_DOUBLE_INT, "MPI_DOUBLE_INT", double, int, DT_DOUBLE, DT_INT, DT_FLAG_DATA_C ); - DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_long_int, DT_LONG_INT, "MPI_LONG_INT", + DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_long_int.dt, DT_LONG_INT, "MPI_LONG_INT", long, int, DT_LONG, DT_INT, DT_FLAG_DATA_C | DT_FLAG_DATA_INT ); - DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_short_int, DT_SHORT_INT, "MPI_SHORT_INT", + DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_short_int.dt, DT_SHORT_INT, "MPI_SHORT_INT", short, int, DT_SHORT, DT_INT, DT_FLAG_DATA_C | DT_FLAG_DATA_INT ); - DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_longdbl_int, DT_LONG_DOUBLE_INT, "MPI_LONG_DOUBLE_INT", + DECLARE_MPI2_COMPOSED_STRUCT_DDT( &ompi_mpi_longdbl_int.dt, DT_LONG_DOUBLE_INT, "MPI_LONG_DOUBLE_INT", long double, int, DT_LONG_DOUBLE, DT_INT, DT_FLAG_DATA_C ); - DECLARE_MPI2_COMPOSED_BLOCK_DDT( &ompi_mpi_2int, DT_2INT, "MPI_2INT", DT_INT, + DECLARE_MPI2_COMPOSED_BLOCK_DDT( &ompi_mpi_2int.dt, DT_2INT, "MPI_2INT", DT_INT, DT_FLAG_DATA_C | DT_FLAG_DATA_INT ); - DECLARE_MPI2_COMPOSED_BLOCK_DDT( &ompi_mpi_2integer, DT_2INTEGER, "MPI_2INTEGER", DT_INT, + DECLARE_MPI2_COMPOSED_BLOCK_DDT( &ompi_mpi_2integer.dt, DT_2INTEGER, "MPI_2INTEGER", DT_INT, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_INT); - DECLARE_MPI2_COMPOSED_BLOCK_DDT( &ompi_mpi_2real, DT_2REAL, "MPI_2REAL", DT_FLOAT, + DECLARE_MPI2_COMPOSED_BLOCK_DDT( &ompi_mpi_2real.dt, DT_2REAL, "MPI_2REAL", DT_FLOAT, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_FLOAT ); - DECLARE_MPI2_COMPOSED_BLOCK_DDT( &ompi_mpi_2dblprec, DT_2DBLPREC, "MPI_2DOUBLE_PRECISION", DT_DOUBLE, + DECLARE_MPI2_COMPOSED_BLOCK_DDT( &ompi_mpi_2dblprec.dt, DT_2DBLPREC, "MPI_2DOUBLE_PRECISION", DT_DOUBLE, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_FLOAT ); - DECLARE_MPI2_COMPOSED_BLOCK_DDT( &ompi_mpi_2cplex, DT_2COMPLEX, "MPI_2COMPLEX", DT_COMPLEX_FLOAT, + DECLARE_MPI2_COMPOSED_BLOCK_DDT( &ompi_mpi_2cplex.dt, DT_2COMPLEX, "MPI_2COMPLEX", DT_COMPLEX_FLOAT, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_FLOAT); - DECLARE_MPI2_COMPOSED_BLOCK_DDT( &ompi_mpi_2dblcplex, DT_2DOUBLE_COMPLEX, "MPI_2DOUBLE_COMPLEX", + DECLARE_MPI2_COMPOSED_BLOCK_DDT( &ompi_mpi_2dblcplex.dt, DT_2DOUBLE_COMPLEX, "MPI_2DOUBLE_COMPLEX", DT_COMPLEX_DOUBLE, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_FLOAT ); for( i = 0; i < DT_MAX_PREDEFINED; ++i ) { @@ -512,206 +510,206 @@ int32_t ompi_ddt_init( void ) the synonym types */ /* C++ complex types */ - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_cxx_cplex, "MPI_CXX_COMPLEX", &ompi_mpi_cplex ); - ompi_mpi_cxx_cplex.flags |= DT_FLAG_DATA_CPP | DT_FLAG_DATA_COMPLEX; - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_cxx_dblcplex, "MPI_CXX_DOUBLE_COMPLEX", &ompi_mpi_dblcplex ); - ompi_mpi_cxx_dblcplex.flags |= DT_FLAG_DATA_CPP | DT_FLAG_DATA_COMPLEX; + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_cxx_cplex.dt, "MPI_CXX_COMPLEX", &ompi_mpi_cplex.dt ); + ompi_mpi_cxx_cplex.dt.flags |= DT_FLAG_DATA_CPP | DT_FLAG_DATA_COMPLEX; + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_cxx_dblcplex.dt, "MPI_CXX_DOUBLE_COMPLEX", &ompi_mpi_dblcplex.dt ); + ompi_mpi_cxx_dblcplex.dt.flags |= DT_FLAG_DATA_CPP | DT_FLAG_DATA_COMPLEX; #if HAVE_LONG_DOUBLE - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_cxx_ldblcplex, "MPI_CXX_LONG_DOUBLE_COMPLEX", &ompi_mpi_ldblcplex ); - ompi_mpi_cxx_ldblcplex.flags |= DT_FLAG_DATA_CPP | DT_FLAG_DATA_COMPLEX; + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_cxx_ldblcplex.dt, "MPI_CXX_LONG_DOUBLE_COMPLEX", &ompi_mpi_ldblcplex.dt ); + ompi_mpi_cxx_ldblcplex.dt.flags |= DT_FLAG_DATA_CPP | DT_FLAG_DATA_COMPLEX; #endif /* HAVE_LONG_DOUBLE */ /* Optional Fortran LOGICAL types */ #if OMPI_HAVE_FORTRAN_LOGICAL1 #if (OMPI_SIZEOF_FORTRAN_LOGICAL1 == SIZEOF_CHAR) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical1, "MPI_LOGICAL1", &ompi_mpi_char ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical1.dt, "MPI_LOGICAL1", &ompi_mpi_char.dt ); #elif (OMPI_SIZEOF_FORTRAN_LOGICAL1 == SIZEOF_SHORT) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical1, "MPI_LOGICAL1", &ompi_mpi_short ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical1.dt, "MPI_LOGICAL1", &ompi_mpi_short.dt ); #elif (OMPI_SIZEOF_FORTRAN_LOGICAL1 == SIZEOF_INT) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical1, "MPI_LOGICAL1", &ompi_mpi_int ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical1.dt, "MPI_LOGICAL1", &ompi_mpi_int.dt ); #else # warning "No proper C type found for LOGICAL1" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical1, "MPI_LOGICAL1", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical1.dt, "MPI_LOGICAL1", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_logical1.flags |= DT_FLAG_DATA_FORTRAN; + ompi_mpi_logical1.dt.flags |= DT_FLAG_DATA_FORTRAN; #endif /* OMPI_HAVE_FORTRAN_LOGICAL1 */ #if OMPI_HAVE_FORTRAN_LOGICAL2 #if (OMPI_SIZEOF_FORTRAN_LOGICAL2 == SIZEOF_SHORT) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical2, "MPI_LOGICAL2", &ompi_mpi_short ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical2.dt, "MPI_LOGICAL2", &ompi_mpi_short.dt ); #elif (OMPI_SIZEOF_FORTRAN_LOGICAL2 == SIZEOF_INT) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical2, "MPI_LOGICAL2", &ompi_mpi_int ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical2.dt, "MPI_LOGICAL2", &ompi_mpi_int.dt ); #else # warning "No proper C type found for LOGICAL2" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical2, "MPI_LOGICAL2", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical2.dt, "MPI_LOGICAL2", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_logical2.flags |= DT_FLAG_DATA_FORTRAN; + ompi_mpi_logical2.dt.flags |= DT_FLAG_DATA_FORTRAN; #endif /* OMPI_HAVE_FORTRAN_LOGICAL2 */ #if OMPI_HAVE_FORTRAN_LOGICAL4 #if (OMPI_SIZEOF_FORTRAN_LOGICAL4 == SIZEOF_INT) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical4, "MPI_LOGICAL4", &ompi_mpi_int ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical4.dt, "MPI_LOGICAL4", &ompi_mpi_int.dt ); #elif (OMPI_SIZEOF_FORTRAN_LOGICAL4 == SIZEOF_LONG) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical4, "MPI_LOGICAL4", &ompi_mpi_long ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical4.dt, "MPI_LOGICAL4", &ompi_mpi_long.dt ); #else # warning "No proper C type found for LOGICAL4" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical4, "MPI_LOGICAL4", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical4.dt, "MPI_LOGICAL4", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_logical4.flags |= DT_FLAG_DATA_FORTRAN; + ompi_mpi_logical4.dt.flags |= DT_FLAG_DATA_FORTRAN; #endif /* OMPI_HAVE_FORTRAN_LOGICAL4 */ #if OMPI_HAVE_FORTRAN_LOGICAL8 #if (OMPI_SIZEOF_FORTRAN_LOGICAL8 == SIZEOF_LONG) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical8, "MPI_LOGICAL8", &ompi_mpi_long ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical8.dt, "MPI_LOGICAL8", &ompi_mpi_long.dt ); #elif (OMPI_SIZEOF_FORTRAN_LOGICAL8 == SIZEOF_LONG_LONG) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical8, "MPI_LOGICAL8", &ompi_mpi_long_long_int ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical8.dt, "MPI_LOGICAL8", &ompi_mpi_long_long_int.dt ); #else # warning "No proper C type found for LOGICAL8" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical8, "MPI_LOGICAL8", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_logical8.dt, "MPI_LOGICAL8", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_logical8.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_INT; + ompi_mpi_logical8.dt.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_INT; #endif /* OMPI_HAVE_FORTRAN_INTEGER8 */ /* Optional Fortran REAL types */ #if OMPI_HAVE_FORTRAN_REAL2 #if (OMPI_SIZEOF_FORTRAN_REAL2 == SIZEOF_FLOAT) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real2, "MPI_REAL2", &ompi_mpi_float ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real2.dt, "MPI_REAL2", &ompi_mpi_float.dt ); #else # warning "No proper C type found for REAL2" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real2, "MPI_REAL2", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real2.dt, "MPI_REAL2", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_real2.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_FLOAT; + ompi_mpi_real2.dt.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_FLOAT; #endif /* OMPI_HAVE_FORTRAN_REAL2 */ #if OMPI_HAVE_FORTRAN_REAL4 #if (OMPI_SIZEOF_FORTRAN_REAL4 == SIZEOF_FLOAT) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real4, "MPI_REAL4", &ompi_mpi_float ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real4.dt, "MPI_REAL4", &ompi_mpi_float.dt ); #else # warning "No proper C type found for REAL4" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real4, "MPI_REAL4", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real4.dt, "MPI_REAL4", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_real4.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_FLOAT; + ompi_mpi_real4.dt.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_FLOAT; #endif /* OMPI_HAVE_FORTRAN_REAL4 */ #if OMPI_HAVE_FORTRAN_REAL8 #if (OMPI_SIZEOF_FORTRAN_REAL8 == SIZEOF_FLOAT) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real8, "MPI_REAL8", &ompi_mpi_float ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real8.dt, "MPI_REAL8", &ompi_mpi_float.dt ); #elif (OMPI_SIZEOF_FORTRAN_REAL8 == SIZEOF_DOUBLE) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real8, "MPI_REAL8", &ompi_mpi_double ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real8.dt, "MPI_REAL8", &ompi_mpi_double.dt ); #elif (OMPI_SIZEOF_FORTRAN_REAL8 == SIZEOF_LONG_DOUBLE) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real8, "MPI_REAL8", &ompi_mpi_long_double ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real8.dt, "MPI_REAL8", &ompi_mpi_long_double.dt ); #else # warning "No proper C type found for REAL8" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real8, "MPI_REAL8", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real8.dt, "MPI_REAL8", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_real8.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_FLOAT; + ompi_mpi_real8.dt.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_FLOAT; #endif /* OMPI_HAVE_FORTRAN_REAL8 */ #if OMPI_HAVE_FORTRAN_REAL16 #if (OMPI_SIZEOF_FORTRAN_REAL16 == SIZEOF_LONG_DOUBLE) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real16, "MPI_REAL16", &ompi_mpi_long_double ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real16.dt, "MPI_REAL16", &ompi_mpi_long_double.dt ); #else # warning "No proper C type found for REAL16" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real16, "MPI_REAL16", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_real16.dt, "MPI_REAL16", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_real16.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_FLOAT; + ompi_mpi_real16.dt.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_FLOAT; #endif /* OMPI_HAVE_FORTRAN_REAL16 */ /* Optional Fortran INTEGER types */ #if OMPI_HAVE_FORTRAN_INTEGER1 #if (OMPI_SIZEOF_FORTRAN_INTEGER1 == SIZEOF_CHAR) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer1, "MPI_INTEGER1", &ompi_mpi_char ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer1.dt, "MPI_INTEGER1", &ompi_mpi_char.dt ); #elif (OMPI_SIZEOF_FORTRAN_INTEGER1 == SIZEOF_SHORT) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer1, "MPI_INTEGER1", &ompi_mpi_short ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer1.dt, "MPI_INTEGER1", &ompi_mpi_short.dt ); #elif (OMPI_SIZEOF_FORTRAN_INTEGER1 == SIZEOF_INT) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer1, "MPI_INTEGER1", &ompi_mpi_int ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer1.dt, "MPI_INTEGER1", &ompi_mpi_int.dt ); #else # warning "No proper C type found for INTEGER1" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer1, "MPI_INTEGER1", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer1.dt, "MPI_INTEGER1", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_integer1.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_INT; + ompi_mpi_integer1.dt.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_INT; #endif /* OMPI_HAVE_FORTRAN_INTEGER1 */ #if OMPI_HAVE_FORTRAN_INTEGER2 #if (OMPI_SIZEOF_FORTRAN_INTEGER2 == SIZEOF_SHORT) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer2, "MPI_INTEGER2", &ompi_mpi_short ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer2.dt, "MPI_INTEGER2", &ompi_mpi_short.dt ); #elif (OMPI_SIZEOF_FORTRAN_INTEGER2 == SIZEOF_INT) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer2, "MPI_INTEGER2", &ompi_mpi_int ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer2.dt, "MPI_INTEGER2", &ompi_mpi_int.dt ); #else # warning "No proper C type found for INTEGER2" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer2, "MPI_INTEGER2", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer2.dt, "MPI_INTEGER2", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_integer2.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_INT; + ompi_mpi_integer2.dt.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_INT; #endif /* OMPI_HAVE_FORTRAN_INTEGER2 */ #if OMPI_HAVE_FORTRAN_INTEGER4 #if (OMPI_SIZEOF_FORTRAN_INTEGER4 == SIZEOF_INT) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer4, "MPI_INTEGER4", &ompi_mpi_int ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer4.dt, "MPI_INTEGER4", &ompi_mpi_int.dt ); #elif (OMPI_SIZEOF_FORTRAN_INTEGER4 == SIZEOF_LONG) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer4, "MPI_INTEGER4", &ompi_mpi_long ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer4.dt, "MPI_INTEGER4", &ompi_mpi_long.dt ); #else # warning "No proper C type found for INTEGER4" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer4, "MPI_INTEGER4", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer4.dt, "MPI_INTEGER4", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_integer4.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_INT; + ompi_mpi_integer4.dt.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_INT; #endif /* OMPI_HAVE_FORTRAN_INTEGER4 */ #if OMPI_HAVE_FORTRAN_INTEGER8 #if (OMPI_SIZEOF_FORTRAN_INTEGER8 == SIZEOF_LONG) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer8, "MPI_INTEGER8", &ompi_mpi_long ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer8.dt, "MPI_INTEGER8", &ompi_mpi_long.dt ); #elif (OMPI_SIZEOF_FORTRAN_INTEGER8 == SIZEOF_LONG_LONG) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer8, "MPI_INTEGER8", &ompi_mpi_long_long_int ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer8.dt, "MPI_INTEGER8", &ompi_mpi_long_long_int.dt ); #else # warning "No proper C type found for INTEGER8" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer8, "MPI_INTEGER8", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer8.dt, "MPI_INTEGER8", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_integer8.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_INT; + ompi_mpi_integer8.dt.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_INT; #endif /* OMPI_HAVE_FORTRAN_INTEGER8 */ #if OMPI_HAVE_FORTRAN_INTEGER16 #if (OMPI_SIZEOF_FORTRAN_INTEGER16 == SIZEOF_LONG_LONG) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer16, "MPI_INTEGER16", &ompi_mpi_long_long_int ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer16.dt, "MPI_INTEGER16", &ompi_mpi_long_long_int.dt ); #else # warning "No proper C type found for INTEGER16" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer16, "MPI_INTEGER16", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_integer16.dt, "MPI_INTEGER16", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_integer16.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_INT; + ompi_mpi_integer16.dt.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_INT; #endif /* OMPI_HAVE_FORTRAN_INTEGER16 */ /* Optional Fortran COMPLEX types */ #if OMPI_HAVE_FORTRAN_COMPLEX8 #if (OMPI_SIZEOF_FORTRAN_COMPLEX8 == 2*SIZEOF_FLOAT) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_complex8, "MPI_COMPLEX8", &ompi_mpi_cplex ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_complex8.dt, "MPI_COMPLEX8", &ompi_mpi_cplex.dt ); #else # warning "No proper C type found for COMPLEX8" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_complex8, "MPI_COMPLEX8", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_complex8.dt, "MPI_COMPLEX8", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_complex8.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_COMPLEX; + ompi_mpi_complex8.dt.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_COMPLEX; #endif /* OMPI_HAVE_FORTRAN_COMPLEX8 */ #if OMPI_HAVE_FORTRAN_COMPLEX16 #if (OMPI_SIZEOF_FORTRAN_COMPLEX16 == 2*SIZEOF_FLOAT) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_complex16, "MPI_COMPLEX16", &ompi_mpi_cplex ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_complex16.dt, "MPI_COMPLEX16", &ompi_mpi_cplex.dt ); #elif (OMPI_SIZEOF_FORTRAN_COMPLEX16 == 2*SIZEOF_DOUBLE) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_complex16, "MPI_COMPLEX16", &ompi_mpi_dblcplex ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_complex16.dt, "MPI_COMPLEX16", &ompi_mpi_dblcplex.dt ); #else # warning "No proper C type found for COMPLEX16" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_complex16, "MPI_COMPLEX16", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_complex16.dt, "MPI_COMPLEX16", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_complex16.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_COMPLEX; + ompi_mpi_complex16.dt.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_COMPLEX; #endif /* OMPI_HAVE_FORTRAN_COMPLEX16 */ #if OMPI_HAVE_FORTRAN_COMPLEX32 #if OMPI_REAL16_MATCHES_C && (OMPI_SIZEOF_FORTRAN_COMPLEX32 == 2*SIZEOF_LONG_DOUBLE) - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_complex32, "MPI_COMPLEX32", &ompi_mpi_ldblcplex ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_complex32.dt, "MPI_COMPLEX32", &ompi_mpi_ldblcplex.dt ); #else # warning "No proper C type found for COMPLEX32" - DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_complex32, "MPI_COMPLEX32", &ompi_mpi_unavailable ); + DECLARE_MPI_SYNONYM_DDT( &ompi_mpi_complex32.dt, "MPI_COMPLEX32", &ompi_mpi_unavailable.dt ); #endif - ompi_mpi_complex32.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_COMPLEX; + ompi_mpi_complex32.dt.flags |= DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_COMPLEX; #endif /* OMPI_HAVE_FORTRAN_COMPLEX32 */ /* Start to populate the f2c index translation table */ @@ -726,10 +724,10 @@ int32_t ompi_ddt_init( void ) #define MOOG(name) \ { \ - ompi_mpi_##name.d_f_to_c_index = \ + ompi_mpi_##name.dt.d_f_to_c_index = \ opal_pointer_array_add(&ompi_datatype_f_to_c_table, &ompi_mpi_##name); \ - if( ompi_ddt_number_of_predefined_data < (ompi_mpi_##name).d_f_to_c_index ) \ - ompi_ddt_number_of_predefined_data = (ompi_mpi_##name).d_f_to_c_index; \ + if( ompi_ddt_number_of_predefined_data < (ompi_mpi_##name).dt.d_f_to_c_index ) \ + ompi_ddt_number_of_predefined_data = (ompi_mpi_##name).dt.d_f_to_c_index; \ } /* @@ -803,7 +801,7 @@ int32_t ompi_ddt_init( void ) MOOG(cxx_dblcplex); MOOG(cxx_ldblcplex); - for( i = 0; i < ompi_mpi_cxx_ldblcplex.d_f_to_c_index; i++ ) { + for( i = 0; i < ompi_mpi_cxx_ldblcplex.dt.d_f_to_c_index; i++ ) { ompi_datatype_t* datatype = (ompi_datatype_t*)opal_pointer_array_get_item(&ompi_datatype_f_to_c_table, i ); if( (datatype->ub - datatype->lb) == (ptrdiff_t)datatype->size ) { diff --git a/ompi/errhandler/errhandler.c b/ompi/errhandler/errhandler.c index 327ecac7ba..7dbb61256f 100644 --- a/ompi/errhandler/errhandler.c +++ b/ompi/errhandler/errhandler.c @@ -11,6 +11,7 @@ * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -48,10 +49,10 @@ OBJ_CLASS_INSTANCE(ompi_errhandler_t, opal_object_t, ompi_errhandler_construct, ompi_errhandler_destruct); -ompi_errhandler_t ompi_mpi_errhandler_null; -ompi_errhandler_t ompi_mpi_errors_are_fatal; -ompi_errhandler_t ompi_mpi_errors_return; -ompi_errhandler_t ompi_mpi_errors_throw_exceptions; +ompi_predefined_errhandler_t ompi_mpi_errhandler_null; +ompi_predefined_errhandler_t ompi_mpi_errors_are_fatal; +ompi_predefined_errhandler_t ompi_mpi_errors_return; +ompi_predefined_errhandler_t ompi_mpi_errors_throw_exceptions; /* * Local state to know when the three intrinsics have been freed; see @@ -77,41 +78,41 @@ int ompi_errhandler_init(void) } /* Initialize the predefined error handlers */ - OBJ_CONSTRUCT( &ompi_mpi_errhandler_null, ompi_errhandler_t ); - if( ompi_mpi_errhandler_null.eh_f_to_c_index != OMPI_ERRHANDLER_NULL_FORTRAN ) + OBJ_CONSTRUCT( &ompi_mpi_errhandler_null.eh, ompi_errhandler_t ); + if( ompi_mpi_errhandler_null.eh.eh_f_to_c_index != OMPI_ERRHANDLER_NULL_FORTRAN ) return OMPI_ERROR; - ompi_mpi_errhandler_null.eh_mpi_object_type = OMPI_ERRHANDLER_TYPE_PREDEFINED; - ompi_mpi_errhandler_null.eh_lang = OMPI_ERRHANDLER_LANG_C; - ompi_mpi_errhandler_null.eh_comm_fn = NULL; - ompi_mpi_errhandler_null.eh_file_fn = NULL; - ompi_mpi_errhandler_null.eh_win_fn = NULL ; - ompi_mpi_errhandler_null.eh_fort_fn = NULL; - strncpy (ompi_mpi_errhandler_null.eh_name, "MPI_ERRHANDLER_NULL", + ompi_mpi_errhandler_null.eh.eh_mpi_object_type = OMPI_ERRHANDLER_TYPE_PREDEFINED; + ompi_mpi_errhandler_null.eh.eh_lang = OMPI_ERRHANDLER_LANG_C; + ompi_mpi_errhandler_null.eh.eh_comm_fn = NULL; + ompi_mpi_errhandler_null.eh.eh_file_fn = NULL; + ompi_mpi_errhandler_null.eh.eh_win_fn = NULL ; + ompi_mpi_errhandler_null.eh.eh_fort_fn = NULL; + strncpy (ompi_mpi_errhandler_null.eh.eh_name, "MPI_ERRHANDLER_NULL", strlen("MPI_ERRHANDLER_NULL")+1 ); - OBJ_CONSTRUCT( &ompi_mpi_errors_are_fatal, ompi_errhandler_t ); - if( ompi_mpi_errors_are_fatal.eh_f_to_c_index != OMPI_ERRORS_ARE_FATAL_FORTRAN ) + OBJ_CONSTRUCT( &ompi_mpi_errors_are_fatal.eh, ompi_errhandler_t ); + if( ompi_mpi_errors_are_fatal.eh.eh_f_to_c_index != OMPI_ERRORS_ARE_FATAL_FORTRAN ) return OMPI_ERROR; - ompi_mpi_errors_are_fatal.eh_mpi_object_type = OMPI_ERRHANDLER_TYPE_PREDEFINED; - ompi_mpi_errors_are_fatal.eh_lang = OMPI_ERRHANDLER_LANG_C; - ompi_mpi_errors_are_fatal.eh_comm_fn = ompi_mpi_errors_are_fatal_comm_handler; - ompi_mpi_errors_are_fatal.eh_file_fn = ompi_mpi_errors_are_fatal_file_handler; - ompi_mpi_errors_are_fatal.eh_win_fn = ompi_mpi_errors_are_fatal_win_handler ; - ompi_mpi_errors_are_fatal.eh_fort_fn = NULL; - strncpy (ompi_mpi_errors_are_fatal.eh_name, "MPI_ERRORS_ARE_FATAL", + ompi_mpi_errors_are_fatal.eh.eh_mpi_object_type = OMPI_ERRHANDLER_TYPE_PREDEFINED; + ompi_mpi_errors_are_fatal.eh.eh_lang = OMPI_ERRHANDLER_LANG_C; + ompi_mpi_errors_are_fatal.eh.eh_comm_fn = ompi_mpi_errors_are_fatal_comm_handler; + ompi_mpi_errors_are_fatal.eh.eh_file_fn = ompi_mpi_errors_are_fatal_file_handler; + ompi_mpi_errors_are_fatal.eh.eh_win_fn = ompi_mpi_errors_are_fatal_win_handler ; + ompi_mpi_errors_are_fatal.eh.eh_fort_fn = NULL; + strncpy (ompi_mpi_errors_are_fatal.eh.eh_name, "MPI_ERRORS_ARE_FATAL", strlen("MPI_ERRORS_ARE_FATAL")+1 ); - OBJ_CONSTRUCT( &ompi_mpi_errors_return, ompi_errhandler_t ); - if( ompi_mpi_errors_return.eh_f_to_c_index != OMPI_ERRORS_RETURN_FORTRAN ) + OBJ_CONSTRUCT( &ompi_mpi_errors_return.eh, ompi_errhandler_t ); + if( ompi_mpi_errors_return.eh.eh_f_to_c_index != OMPI_ERRORS_RETURN_FORTRAN ) return OMPI_ERROR; - ompi_mpi_errors_return.eh_mpi_object_type = OMPI_ERRHANDLER_TYPE_PREDEFINED; - ompi_mpi_errors_return.eh_lang = OMPI_ERRHANDLER_LANG_C; - ompi_mpi_errors_return.eh_comm_fn = ompi_mpi_errors_return_comm_handler; - ompi_mpi_errors_return.eh_file_fn = ompi_mpi_errors_return_file_handler; - ompi_mpi_errors_return.eh_win_fn = ompi_mpi_errors_return_win_handler; - ompi_mpi_errors_return.eh_fort_fn = NULL; - strncpy (ompi_mpi_errors_return.eh_name, "MPI_ERRORS_RETURN", + ompi_mpi_errors_return.eh.eh_mpi_object_type = OMPI_ERRHANDLER_TYPE_PREDEFINED; + ompi_mpi_errors_return.eh.eh_lang = OMPI_ERRHANDLER_LANG_C; + ompi_mpi_errors_return.eh.eh_comm_fn = ompi_mpi_errors_return_comm_handler; + ompi_mpi_errors_return.eh.eh_file_fn = ompi_mpi_errors_return_file_handler; + ompi_mpi_errors_return.eh.eh_win_fn = ompi_mpi_errors_return_win_handler; + ompi_mpi_errors_return.eh.eh_fort_fn = NULL; + strncpy (ompi_mpi_errors_return.eh.eh_name, "MPI_ERRORS_RETURN", strlen("MPI_ERRORS_RETURN")+1 ); /* If we're going to use C++, functions will be fixed up during @@ -119,19 +120,18 @@ int ompi_errhandler_init(void) the dispatch function is in C (although in libmpi_cxx); the conversion from C handles to C++ handles happens in that dispatch function -- not the errhandler_invoke.c stuff here in libmpi. */ - OBJ_CONSTRUCT( &ompi_mpi_errors_throw_exceptions, ompi_errhandler_t ); - ompi_mpi_errors_throw_exceptions.eh_mpi_object_type = + OBJ_CONSTRUCT( &ompi_mpi_errors_throw_exceptions.eh, ompi_errhandler_t ); + ompi_mpi_errors_throw_exceptions.eh.eh_mpi_object_type = OMPI_ERRHANDLER_TYPE_PREDEFINED; - ompi_mpi_errors_throw_exceptions.eh_lang = OMPI_ERRHANDLER_LANG_C; - ompi_mpi_errors_throw_exceptions.eh_comm_fn = + ompi_mpi_errors_throw_exceptions.eh.eh_lang = OMPI_ERRHANDLER_LANG_C; + ompi_mpi_errors_throw_exceptions.eh.eh_comm_fn = ompi_mpi_errors_are_fatal_comm_handler; - ompi_mpi_errors_throw_exceptions.eh_file_fn = + ompi_mpi_errors_throw_exceptions.eh.eh_file_fn = ompi_mpi_errors_are_fatal_file_handler; - ompi_mpi_errors_throw_exceptions.eh_win_fn = + ompi_mpi_errors_throw_exceptions.eh.eh_win_fn = ompi_mpi_errors_are_fatal_win_handler ; - ompi_mpi_errors_throw_exceptions.eh_fort_fn = NULL; - strncpy (ompi_mpi_errors_throw_exceptions.eh_name, - "MPI_ERRORS_THROW_EXCEPTIONS", + ompi_mpi_errors_throw_exceptions.eh.eh_fort_fn = NULL; + strncpy (ompi_mpi_errors_throw_exceptions.eh.eh_name, "MPI_ERRORS_THROW_EXCEPTIONS", strlen("MPI_ERRORS_THROW_EXCEPTIONS")+1 ); /* All done */ @@ -154,16 +154,16 @@ int ompi_errhandler_finalize(void) freed. */ while (!null_freed) { - OBJ_DESTRUCT(&ompi_mpi_errhandler_null); + OBJ_DESTRUCT(&ompi_mpi_errhandler_null.eh); } while (!fatal_freed) { - OBJ_DESTRUCT(&ompi_mpi_errors_are_fatal); + OBJ_DESTRUCT(&ompi_mpi_errors_are_fatal.eh); } while (!return_freed) { - OBJ_DESTRUCT(&ompi_mpi_errors_return); + OBJ_DESTRUCT(&ompi_mpi_errors_return.eh); } while (!throw_freed) { - OBJ_DESTRUCT(&ompi_mpi_errors_throw_exceptions); + OBJ_DESTRUCT(&ompi_mpi_errors_throw_exceptions.eh); } /* JMS Add stuff here checking for unreleased errorhandlers, @@ -281,13 +281,13 @@ static void ompi_errhandler_destruct(ompi_errhandler_t *errhandler) /* Reset the static state if we're releasing one of the intrinsics */ - if (&ompi_mpi_errhandler_null == errhandler) { + if (&ompi_mpi_errhandler_null.eh == errhandler) { null_freed = true; - } else if (&ompi_mpi_errors_are_fatal == errhandler) { + } else if (&ompi_mpi_errors_are_fatal.eh == errhandler) { fatal_freed = true; - } else if (&ompi_mpi_errors_return == errhandler) { + } else if (&ompi_mpi_errors_return.eh == errhandler) { return_freed = true; - } else if (&ompi_mpi_errors_throw_exceptions == errhandler) { + } else if (&ompi_mpi_errors_throw_exceptions.eh == errhandler) { throw_freed = true; } } diff --git a/ompi/errhandler/errhandler.h b/ompi/errhandler/errhandler.h index a08fb94692..04f3e0c0f8 100644 --- a/ompi/errhandler/errhandler.h +++ b/ompi/errhandler/errhandler.h @@ -11,7 +11,7 @@ * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2008-2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -127,27 +127,41 @@ struct ompi_errhandler_t { }; typedef struct ompi_errhandler_t ompi_errhandler_t; +/** + * Padded struct to maintain back compatibiltiy. + * See ompi/communicator/communicator.h comments with struct ompi_communicator_t + * for full explanation why we chose the following padding construct for predefines. + */ +#define PREDEFINED_ERRHANDLER_PAD 1024 + +struct ompi_predefined_errhandler_t { + struct ompi_errhandler_t eh; + char padding[PREDEFINED_ERRHANDLER_PAD - sizeof(ompi_errhandler_t)]; +}; + +typedef struct ompi_predefined_errhandler_t ompi_predefined_errhandler_t; + /** * Global variable for MPI_ERRHANDLER_NULL */ -OMPI_DECLSPEC extern ompi_errhandler_t ompi_mpi_errhandler_null; +OMPI_DECLSPEC extern ompi_predefined_errhandler_t ompi_mpi_errhandler_null; /** * Global variable for MPI_ERRORS_ARE_FATAL */ -OMPI_DECLSPEC extern ompi_errhandler_t ompi_mpi_errors_are_fatal; +OMPI_DECLSPEC extern ompi_predefined_errhandler_t ompi_mpi_errors_are_fatal; /** * Global variable for MPI_ERRORS_RETURN */ -OMPI_DECLSPEC extern ompi_errhandler_t ompi_mpi_errors_return; +OMPI_DECLSPEC extern ompi_predefined_errhandler_t ompi_mpi_errors_return; /** * Global variable for MPI::ERRORS_THROW_EXCEPTIONS. Will abort if * MPI_INIT wasn't called as MPI::INIT */ -OMPI_DECLSPEC extern ompi_errhandler_t ompi_mpi_errors_throw_exceptions; +OMPI_DECLSPEC extern ompi_predefined_errhandler_t ompi_mpi_errors_throw_exceptions; /** * Table for Fortran <-> C errhandler handle conversion diff --git a/ompi/errhandler/errhandler_predefined.c b/ompi/errhandler/errhandler_predefined.c index fc9cff12cb..a666b27c43 100644 --- a/ompi/errhandler/errhandler_predefined.c +++ b/ompi/errhandler/errhandler_predefined.c @@ -11,6 +11,7 @@ * All rights reserved. * Copyright (c) 2006 University of Houston. All rights reserved. * Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -292,7 +293,7 @@ static void backend_fatal(char *type, struct ompi_communicator_t *comm, /* Should we do something more intelligent than just using COMM_SELF? */ if (comm == NULL) { - comm = &ompi_mpi_comm_self; + comm = &ompi_mpi_comm_self.comm; } if (NULL != error_code) { diff --git a/ompi/file/file.c b/ompi/file/file.c index fd3c729b45..3195d514ab 100644 --- a/ompi/file/file.c +++ b/ompi/file/file.c @@ -10,7 +10,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. - * Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2008-2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -20,6 +20,7 @@ #include "ompi_config.h" +#include "ompi/communicator/communicator.h" #include "ompi/file/file.h" #include "opal/class/opal_list.h" #include "opal/util/output.h" @@ -35,7 +36,7 @@ opal_pointer_array_t ompi_file_f_to_c_table; /* * MPI_FILE_NULL */ -ompi_file_t ompi_mpi_file_null; +ompi_predefined_file_t ompi_mpi_file_null; /* @@ -70,12 +71,12 @@ int ompi_file_init(void) /* Setup MPI_FILE_NULL. Note that it will have the default error handler of MPI_ERRORS_RETURN, per MPI-2:9.7 (p265). */ - OBJ_CONSTRUCT(&ompi_mpi_file_null, ompi_file_t); - ompi_mpi_file_null.f_comm = &ompi_mpi_comm_null; - OBJ_RETAIN(ompi_mpi_file_null.f_comm); - ompi_mpi_file_null.f_f_to_c_index = 0; + OBJ_CONSTRUCT(&ompi_mpi_file_null.file, ompi_file_t); + ompi_mpi_file_null.file.f_comm = &ompi_mpi_comm_null.comm; + OBJ_RETAIN(ompi_mpi_file_null.file.f_comm); + ompi_mpi_file_null.file.f_f_to_c_index = 0; opal_pointer_array_set_item(&ompi_file_f_to_c_table, 0, - &ompi_mpi_file_null); + &ompi_mpi_file_null.file); /* All done */ @@ -145,7 +146,7 @@ int ompi_file_close(ompi_file_t **file) mca_io_base_component_del(&((*file)->f_io_selected_component)); mca_io_base_request_return(*file); OBJ_RELEASE(*file); - *file = &ompi_mpi_file_null; + *file = &ompi_mpi_file_null.file; return OMPI_SUCCESS; } @@ -164,7 +165,7 @@ int ompi_file_finalize(void) report on it. Plus, it's statically allocated, so we don't want to call OBJ_RELEASE on it. */ - OBJ_DESTRUCT(&ompi_mpi_file_null); + OBJ_DESTRUCT(&ompi_mpi_file_null.file); opal_pointer_array_set_item(&ompi_file_f_to_c_table, 0, NULL); /* Iterate through all the file handles and destroy them. Note @@ -239,10 +240,10 @@ static void file_constructor(ompi_file_t *file) MPI_FILE_NULL). */ file->errhandler_type = OMPI_ERRHANDLER_TYPE_FILE; - if (file != &ompi_mpi_file_null) { - file->error_handler = ompi_mpi_file_null.error_handler; + if (file != &ompi_mpi_file_null.file) { + file->error_handler = ompi_mpi_file_null.file.error_handler; } else { - file->error_handler = &ompi_mpi_errors_return; + file->error_handler = &ompi_mpi_errors_return.eh; } OBJ_RETAIN(file->error_handler); diff --git a/ompi/file/file.h b/ompi/file/file.h index aa75751adf..815cb907a5 100644 --- a/ompi/file/file.h +++ b/ompi/file/file.h @@ -10,6 +10,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -96,11 +97,23 @@ struct ompi_file_t { */ typedef struct ompi_file_t ompi_file_t; +/** + * Padded struct to maintain back compatibiltiy. + * See ompi/communicator/communicator.h comments with struct ompi_communicator_t + * for full explanation why we chose the following padding construct for predefines. + */ +#define PREDEFINED_FILE_PAD (sizeof(void*) * 192) + +struct ompi_predefined_file_t { + struct ompi_file_t file; + char padding[PREDEFINED_FILE_PAD - sizeof(ompi_file_t)]; +}; +typedef struct ompi_predefined_file_t ompi_predefined_file_t; /** * Back-end instances for MPI_FILE_NULL */ -OMPI_DECLSPEC extern ompi_file_t ompi_mpi_file_null; +OMPI_DECLSPEC extern ompi_predefined_file_t ompi_mpi_file_null; /** @@ -193,7 +206,7 @@ int ompi_file_finalize(void); static inline bool ompi_file_invalid(ompi_file_t *file) { return (NULL == file || - &ompi_mpi_file_null == file || + &ompi_mpi_file_null.file == file || 0 != (file->f_flags & OMPI_FILE_ISCLOSED)); } diff --git a/ompi/group/group.h b/ompi/group/group.h index e8d80decad..86ca625c18 100644 --- a/ompi/group/group.h +++ b/ompi/group/group.h @@ -12,6 +12,7 @@ * All rights reserved. * Copyright (c) 2006-2007 University of Houston. All rights reserved. * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -96,6 +97,19 @@ struct ompi_group_t { typedef struct ompi_group_t ompi_group_t; OMPI_DECLSPEC OBJ_CLASS_DECLARATION(ompi_group_t); +/** + * Padded struct to maintain back compatibiltiy. + * See ompi/communicator/communicator.h comments with struct ompi_communicator_t + * for full explanation why we chose the following padding construct for predefines. + */ +#define PREDEFINED_GROUP_PAD (sizeof(void*) * 32) + +struct ompi_predefined_group_t { + struct ompi_group_t group; + char padding[PREDEFINED_GROUP_PAD - sizeof(ompi_group_t)]; +}; + +typedef struct ompi_predefined_group_t ompi_predefined_group_t; /* Some definitions for the flags */ #define OMPI_GROUP_ISFREED 0x00000001 @@ -122,11 +136,12 @@ OMPI_DECLSPEC OBJ_CLASS_DECLARATION(ompi_group_t); * Table for Fortran <-> C group handle conversion */ OMPI_DECLSPEC extern struct opal_pointer_array_t ompi_group_f_to_c_table; -OMPI_DECLSPEC extern ompi_group_t ompi_mpi_group_null; +OMPI_DECLSPEC extern struct ompi_predefined_group_t ompi_mpi_group_null; /* - * function prototypes + * function prototype +s */ /** diff --git a/ompi/group/group_init.c b/ompi/group/group_init.c index 1dcf730607..c157c6e191 100644 --- a/ompi/group/group_init.c +++ b/ompi/group/group_init.c @@ -12,6 +12,7 @@ * All rights reserved. * Copyright (c) 2006-2007 University of Houston. All rights reserved. * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -41,8 +42,8 @@ opal_pointer_array_t ompi_group_f_to_c_table; /* * Predefined group objects */ -ompi_group_t ompi_mpi_group_empty; -ompi_group_t ompi_mpi_group_null; +ompi_predefined_group_t ompi_mpi_group_empty; +ompi_predefined_group_t ompi_mpi_group_null; /* @@ -313,19 +314,19 @@ int ompi_group_init(void) /* add MPI_GROUP_NULL to table */ OBJ_CONSTRUCT(&ompi_mpi_group_null, ompi_group_t); - ompi_mpi_group_null.grp_proc_count = 0; - ompi_mpi_group_null.grp_my_rank = MPI_PROC_NULL; - ompi_mpi_group_null.grp_proc_pointers = NULL; - ompi_mpi_group_null.grp_flags |= OMPI_GROUP_DENSE; - ompi_mpi_group_null.grp_flags |= OMPI_GROUP_INTRINSIC; + ompi_mpi_group_null.group.grp_proc_count = 0; + ompi_mpi_group_null.group.grp_my_rank = MPI_PROC_NULL; + ompi_mpi_group_null.group.grp_proc_pointers = NULL; + ompi_mpi_group_null.group.grp_flags |= OMPI_GROUP_DENSE; + ompi_mpi_group_null.group.grp_flags |= OMPI_GROUP_INTRINSIC; /* add MPI_GROUP_EMPTRY to table */ OBJ_CONSTRUCT(&ompi_mpi_group_empty, ompi_group_t); - ompi_mpi_group_empty.grp_proc_count = 0; - ompi_mpi_group_empty.grp_my_rank = MPI_UNDEFINED; - ompi_mpi_group_empty.grp_proc_pointers = NULL; - ompi_mpi_group_empty.grp_flags |= OMPI_GROUP_DENSE; - ompi_mpi_group_empty.grp_flags |= OMPI_GROUP_INTRINSIC; + ompi_mpi_group_empty.group.grp_proc_count = 0; + ompi_mpi_group_empty.group.grp_my_rank = MPI_UNDEFINED; + ompi_mpi_group_empty.group.grp_proc_pointers = NULL; + ompi_mpi_group_empty.group.grp_flags |= OMPI_GROUP_DENSE; + ompi_mpi_group_empty.group.grp_flags |= OMPI_GROUP_INTRINSIC; return OMPI_SUCCESS; } @@ -336,10 +337,10 @@ int ompi_group_init(void) */ int ompi_group_finalize(void) { - ompi_mpi_group_null.grp_flags = 0; + ompi_mpi_group_null.group.grp_flags = 0; OBJ_DESTRUCT(&ompi_mpi_group_null); - ompi_mpi_group_null.grp_flags = 0; + ompi_mpi_group_null.group.grp_flags = 0; OBJ_DESTRUCT(&ompi_mpi_group_empty); OBJ_DESTRUCT(&ompi_group_f_to_c_table); diff --git a/ompi/include/mpi.h.in b/ompi/include/mpi.h.in index fe0c66ab4e..a0db404c82 100644 --- a/ompi/include/mpi.h.in +++ b/ompi/include/mpi.h.in @@ -10,7 +10,7 @@ * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2007-2009 Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2008-2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -480,15 +480,15 @@ enum { /* * NULL handles */ -#define MPI_GROUP_NULL (&ompi_mpi_group_null) -#define MPI_COMM_NULL (&ompi_mpi_comm_null) -#define MPI_REQUEST_NULL (&ompi_request_null) -#define MPI_OP_NULL (&ompi_mpi_op_null) -#define MPI_ERRHANDLER_NULL (&ompi_mpi_errhandler_null) -#define MPI_INFO_NULL (&ompi_mpi_info_null) -#define MPI_WIN_NULL (&ompi_mpi_win_null) +#define MPI_GROUP_NULL (((MPI_Group)&(ompi_mpi_group_null))) +#define MPI_COMM_NULL (((MPI_Comm)&(ompi_mpi_comm_null))) +#define MPI_REQUEST_NULL (((MPI_Request)&(ompi_request_null))) +#define MPI_OP_NULL (((MPI_Op)&(ompi_mpi_op_null))) +#define MPI_ERRHANDLER_NULL (((MPI_Errhandler)&(ompi_mpi_errhandler_null))) +#define MPI_INFO_NULL (((MPI_Info)&(ompi_mpi_info_null))) +#define MPI_WIN_NULL (((MPI_Win)&(ompi_mpi_win_null))) #if OMPI_PROVIDE_MPI_FILE_INTERFACE -#define MPI_FILE_NULL (&ompi_mpi_file_null) +#define MPI_FILE_NULL (((MPI_File)&(ompi_mpi_file_null))) #endif #define MPI_STATUS_IGNORE ((MPI_Status *) 0) @@ -596,111 +596,119 @@ OMPI_DECLSPEC int OMPI_C_MPI_WIN_DUP_FN( MPI_Win window, int win_keyval, void* attribute_val_out, int* flag ); - /* * External variables + * + * The below externs use the ompi_predefined_xxx_t structures to maintain + * back compatibility between MPI library versions. + * See ompi/communicator/communicator.h comments with struct ompi_communicator_t + * for full explanation why we chose to use the ompi_predefined_xxx_t structure. */ -OMPI_DECLSPEC extern struct ompi_communicator_t ompi_mpi_comm_world; -OMPI_DECLSPEC extern struct ompi_communicator_t ompi_mpi_comm_self; -OMPI_DECLSPEC extern struct ompi_communicator_t ompi_mpi_comm_null; +OMPI_DECLSPEC extern struct ompi_predefined_communicator_t ompi_mpi_comm_world; +OMPI_DECLSPEC extern struct ompi_predefined_communicator_t ompi_mpi_comm_self; +OMPI_DECLSPEC extern struct ompi_predefined_communicator_t ompi_mpi_comm_null; -OMPI_DECLSPEC extern struct ompi_group_t ompi_mpi_group_empty; -OMPI_DECLSPEC extern struct ompi_group_t ompi_mpi_group_null; +OMPI_DECLSPEC extern struct ompi_predefined_group_t ompi_mpi_group_empty; +OMPI_DECLSPEC extern struct ompi_predefined_group_t ompi_mpi_group_null; -OMPI_DECLSPEC extern struct ompi_request_t ompi_request_null; +OMPI_DECLSPEC extern struct ompi_predefined_request_t ompi_request_null; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_null; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_max, ompi_mpi_op_min; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_sum, ompi_mpi_op_prod; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_land, ompi_mpi_op_band; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_lor, ompi_mpi_op_bor; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_lxor, ompi_mpi_op_bxor; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_maxloc, ompi_mpi_op_minloc; -OMPI_DECLSPEC extern struct ompi_op_t ompi_mpi_op_replace; +OMPI_DECLSPEC extern struct ompi_predefined_op_t ompi_mpi_op_null; +OMPI_DECLSPEC extern struct ompi_predefined_op_t ompi_mpi_op_max, ompi_mpi_op_min; +OMPI_DECLSPEC extern struct ompi_predefined_op_t ompi_mpi_op_sum; +OMPI_DECLSPEC extern struct ompi_predefined_op_t ompi_mpi_op_prod; +OMPI_DECLSPEC extern struct ompi_predefined_op_t ompi_mpi_op_land; +OMPI_DECLSPEC extern struct ompi_predefined_op_t ompi_mpi_op_band; +OMPI_DECLSPEC extern struct ompi_predefined_op_t ompi_mpi_op_lor, ompi_mpi_op_bor; +OMPI_DECLSPEC extern struct ompi_predefined_op_t ompi_mpi_op_lxor; +OMPI_DECLSPEC extern struct ompi_predefined_op_t ompi_mpi_op_bxor; +OMPI_DECLSPEC extern struct ompi_predefined_op_t ompi_mpi_op_maxloc; +OMPI_DECLSPEC extern struct ompi_predefined_op_t ompi_mpi_op_minloc; +OMPI_DECLSPEC extern struct ompi_predefined_op_t ompi_mpi_op_replace; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_char, ompi_mpi_byte; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_int, ompi_mpi_logic; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_short, ompi_mpi_long; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_float, ompi_mpi_double; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_long_double; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_cplex, ompi_mpi_packed; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_signed_char; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_unsigned_char; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_unsigned_short; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_unsigned, ompi_mpi_datatype_null; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_unsigned_long, ompi_mpi_ldblcplex; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_ub, ompi_mpi_lb; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_float_int, ompi_mpi_double_int; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_long_int, ompi_mpi_2int; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_short_int, ompi_mpi_dblcplex; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_integer, ompi_mpi_real; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_dblprec, ompi_mpi_character; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_2real, ompi_mpi_2dblprec; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_2integer, ompi_mpi_longdbl_int; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_wchar, ompi_mpi_long_long_int; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_unsigned_long_long; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_cxx_cplex, ompi_mpi_cxx_dblcplex; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_cxx_ldblcplex; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_cxx_bool; -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_2cplex, ompi_mpi_2dblcplex; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_char, ompi_mpi_byte; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_int, ompi_mpi_logic; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_short, ompi_mpi_long; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_float, ompi_mpi_double; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_long_double; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_cplex, ompi_mpi_packed; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_signed_char; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_unsigned_char; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_unsigned_short; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_unsigned, ompi_mpi_datatype_null; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_unsigned_long, ompi_mpi_ldblcplex; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_ub, ompi_mpi_lb; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_float_int, ompi_mpi_double_int; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_long_int, ompi_mpi_2int; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_short_int, ompi_mpi_dblcplex; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_integer, ompi_mpi_real; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_dblprec, ompi_mpi_character; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_2real, ompi_mpi_2dblprec; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_2integer, ompi_mpi_longdbl_int; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_wchar, ompi_mpi_long_long_int; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_unsigned_long_long; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_cxx_cplex, ompi_mpi_cxx_dblcplex; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_cxx_ldblcplex; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_cxx_bool; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_2cplex, ompi_mpi_2dblcplex; /* other MPI2 datatypes */ #if OMPI_HAVE_FORTRAN_LOGICAL1 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_logical1; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_logical1; #endif #if OMPI_HAVE_FORTRAN_LOGICAL2 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_logical2; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_logical2; #endif #if OMPI_HAVE_FORTRAN_LOGICAL4 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_logical4; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_logical4; #endif #if OMPI_HAVE_FORTRAN_LOGICAL8 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_logical8; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_logical8; #endif #if OMPI_HAVE_FORTRAN_INTEGER1 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_integer1; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_integer1; #endif #if OMPI_HAVE_FORTRAN_INTEGER2 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_integer2; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_integer2; #endif #if OMPI_HAVE_FORTRAN_INTEGER4 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_integer4; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_integer4; #endif #if OMPI_HAVE_FORTRAN_INTEGER8 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_integer8; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_integer8; #endif #if OMPI_HAVE_FORTRAN_INTEGER16 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_integer16; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_integer16; #endif #if OMPI_HAVE_FORTRAN_REAL2 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_real2; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_real2; #endif #if OMPI_HAVE_FORTRAN_REAL4 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_real4; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_real4; #endif #if OMPI_HAVE_FORTRAN_REAL8 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_real8; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_real8; #endif #if OMPI_HAVE_FORTRAN_REAL16 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_real16; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_real16; #endif #if OMPI_HAVE_FORTRAN_REAL4 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_complex8; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_complex8; #endif #if OMPI_HAVE_FORTRAN_REAL8 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_complex16; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_complex16; #endif #if OMPI_HAVE_FORTRAN_REAL16 -OMPI_DECLSPEC extern struct ompi_datatype_t ompi_mpi_complex32; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_complex32; #endif -OMPI_DECLSPEC extern struct ompi_errhandler_t ompi_mpi_errhandler_null; -OMPI_DECLSPEC extern struct ompi_errhandler_t ompi_mpi_errors_are_fatal; -OMPI_DECLSPEC extern struct ompi_errhandler_t ompi_mpi_errors_return; +OMPI_DECLSPEC extern struct ompi_predefined_errhandler_t ompi_mpi_errhandler_null; +OMPI_DECLSPEC extern struct ompi_predefined_errhandler_t ompi_mpi_errors_are_fatal; +OMPI_DECLSPEC extern struct ompi_predefined_errhandler_t ompi_mpi_errors_return; -OMPI_DECLSPEC extern struct ompi_win_t ompi_mpi_win_null; -OMPI_DECLSPEC extern struct ompi_file_t ompi_mpi_file_null; +OMPI_DECLSPEC extern struct ompi_predefined_win_t ompi_mpi_win_null; +OMPI_DECLSPEC extern struct ompi_predefined_file_t ompi_mpi_file_null; -OMPI_DECLSPEC extern struct ompi_info_t ompi_mpi_info_null; +OMPI_DECLSPEC extern struct ompi_predefined_info_t ompi_mpi_info_null; OMPI_DECLSPEC extern MPI_Fint *MPI_F_STATUS_IGNORE; OMPI_DECLSPEC extern MPI_Fint *MPI_F_STATUSES_IGNORE; @@ -708,117 +716,117 @@ OMPI_DECLSPEC extern MPI_Fint *MPI_F_STATUSES_IGNORE; /* * MPI predefined handles */ -#define MPI_COMM_WORLD (&ompi_mpi_comm_world) -#define MPI_COMM_SELF (&ompi_mpi_comm_self) +#define MPI_COMM_WORLD (((MPI_Comm)&(ompi_mpi_comm_world))) +#define MPI_COMM_SELF (((MPI_Comm)&(ompi_mpi_comm_self))) -#define MPI_GROUP_EMPTY (&ompi_mpi_group_empty) +#define MPI_GROUP_EMPTY (((MPI_Group)&(ompi_mpi_group_empty))) -#define MPI_MAX (&ompi_mpi_op_max) -#define MPI_MIN (&ompi_mpi_op_min) -#define MPI_SUM (&ompi_mpi_op_sum) -#define MPI_PROD (&ompi_mpi_op_prod) -#define MPI_LAND (&ompi_mpi_op_land) -#define MPI_BAND (&ompi_mpi_op_band) -#define MPI_LOR (&ompi_mpi_op_lor) -#define MPI_BOR (&ompi_mpi_op_bor) -#define MPI_LXOR (&ompi_mpi_op_lxor) -#define MPI_BXOR (&ompi_mpi_op_bxor) -#define MPI_MAXLOC (&ompi_mpi_op_maxloc) -#define MPI_MINLOC (&ompi_mpi_op_minloc) -#define MPI_REPLACE (&ompi_mpi_op_replace) +#define MPI_MAX (((MPI_Op)&(ompi_mpi_op_max))) +#define MPI_MIN (((MPI_Op)&(ompi_mpi_op_min))) +#define MPI_SUM (((MPI_Op)&(ompi_mpi_op_sum))) +#define MPI_PROD (((MPI_Op)&(ompi_mpi_op_prod))) +#define MPI_LAND (((MPI_Op)&(ompi_mpi_op_land))) +#define MPI_BAND (((MPI_Op)&(ompi_mpi_op_band))) +#define MPI_LOR (((MPI_Op)&(ompi_mpi_op_lor))) +#define MPI_BOR (((MPI_Op)&(ompi_mpi_op_bor))) +#define MPI_LXOR (((MPI_Op)&(ompi_mpi_op_lxor))) +#define MPI_BXOR (((MPI_Op)&(ompi_mpi_op_bxor))) +#define MPI_MAXLOC (((MPI_Op)&(ompi_mpi_op_maxloc))) +#define MPI_MINLOC (((MPI_Op)&(ompi_mpi_op_minloc))) +#define MPI_REPLACE (((MPI_Op)&(ompi_mpi_op_replace))) /* C datatypes */ -#define MPI_DATATYPE_NULL (&ompi_mpi_datatype_null) -#define MPI_BYTE (&ompi_mpi_byte) -#define MPI_PACKED (&ompi_mpi_packed) -#define MPI_CHAR (&ompi_mpi_char) -#define MPI_SHORT (&ompi_mpi_short) -#define MPI_INT (&ompi_mpi_int) -#define MPI_LONG (&ompi_mpi_long) -#define MPI_FLOAT (&ompi_mpi_float) -#define MPI_DOUBLE (&ompi_mpi_double) -#define MPI_LONG_DOUBLE (&ompi_mpi_long_double) -#define MPI_UNSIGNED_CHAR (&ompi_mpi_unsigned_char) -#define MPI_SIGNED_CHAR (&ompi_mpi_signed_char) -#define MPI_UNSIGNED_SHORT (&ompi_mpi_unsigned_short) -#define MPI_UNSIGNED_LONG (&ompi_mpi_unsigned_long) -#define MPI_UNSIGNED (&ompi_mpi_unsigned) -#define MPI_FLOAT_INT (&ompi_mpi_float_int) -#define MPI_DOUBLE_INT (&ompi_mpi_double_int) -#define MPI_LONG_DOUBLE_INT (&ompi_mpi_longdbl_int) -#define MPI_LONG_INT (&ompi_mpi_long_int) -#define MPI_SHORT_INT (&ompi_mpi_short_int) -#define MPI_2INT (&ompi_mpi_2int) -#define MPI_UB (&ompi_mpi_ub) -#define MPI_LB (&ompi_mpi_lb) -#define MPI_WCHAR (&ompi_mpi_wchar) +#define MPI_DATATYPE_NULL (((MPI_Datatype)&(ompi_mpi_datatype_null))) +#define MPI_BYTE (((MPI_Datatype)&(ompi_mpi_byte))) +#define MPI_PACKED (((MPI_Datatype)&(ompi_mpi_packed))) +#define MPI_CHAR (((MPI_Datatype)&(ompi_mpi_char))) +#define MPI_SHORT (((MPI_Datatype)&(ompi_mpi_short))) +#define MPI_INT (((MPI_Datatype)&(ompi_mpi_int))) +#define MPI_LONG (((MPI_Datatype)&(ompi_mpi_long))) +#define MPI_FLOAT (((MPI_Datatype)&(ompi_mpi_float))) +#define MPI_DOUBLE (((MPI_Datatype)&(ompi_mpi_double))) +#define MPI_LONG_DOUBLE (((MPI_Datatype)&(ompi_mpi_long_double))) +#define MPI_UNSIGNED_CHAR (((MPI_Datatype)&(ompi_mpi_unsigned_char))) +#define MPI_SIGNED_CHAR (((MPI_Datatype)&(ompi_mpi_signed_char))) +#define MPI_UNSIGNED_SHORT (((MPI_Datatype)&(ompi_mpi_unsigned_short))) +#define MPI_UNSIGNED_LONG (((MPI_Datatype)&(ompi_mpi_unsigned_long))) +#define MPI_UNSIGNED (((MPI_Datatype)&(ompi_mpi_unsigned))) +#define MPI_FLOAT_INT (((MPI_Datatype)&(ompi_mpi_float_int))) +#define MPI_DOUBLE_INT (((MPI_Datatype)&(ompi_mpi_double_int))) +#define MPI_LONG_DOUBLE_INT (((MPI_Datatype)&(ompi_mpi_longdbl_int))) +#define MPI_LONG_INT (((MPI_Datatype)&(ompi_mpi_long_int))) +#define MPI_SHORT_INT (((MPI_Datatype)&(ompi_mpi_short_int))) +#define MPI_2INT (((MPI_Datatype)&(ompi_mpi_2int))) +#define MPI_UB (((MPI_Datatype)&(ompi_mpi_ub))) +#define MPI_LB (((MPI_Datatype)&(ompi_mpi_lb))) +#define MPI_WCHAR (((MPI_Datatype)&(ompi_mpi_wchar))) #if OMPI_HAVE_LONG_LONG -#define MPI_LONG_LONG_INT (&ompi_mpi_long_long_int) -#define MPI_LONG_LONG (&ompi_mpi_long_long_int) -#define MPI_UNSIGNED_LONG_LONG (&ompi_mpi_unsigned_long_long) +#define MPI_LONG_LONG_INT (((MPI_Datatype)&(ompi_mpi_long_long_int))) +#define MPI_LONG_LONG (((MPI_Datatype)&(ompi_mpi_long_long_int))) +#define MPI_UNSIGNED_LONG_LONG (((MPI_Datatype)&(ompi_mpi_unsigned_long_long))) #endif /* OMPI_HAVE_LONG_LONG */ -#define MPI_2COMPLEX (&ompi_mpi_2cplex) -#define MPI_2DOUBLE_COMPLEX (&ompi_mpi_2dblcplex) +#define MPI_2COMPLEX (((MPI_Datatype)&(ompi_mpi_2cplex))) +#define MPI_2DOUBLE_COMPLEX (((MPI_Datatype)&(ompi_mpi_2dblcplex))) /* Fortran datatype bindings */ -#define MPI_CHARACTER (&ompi_mpi_character) -#define MPI_LOGICAL (&ompi_mpi_logic) +#define MPI_CHARACTER (((MPI_Datatype)&(ompi_mpi_character))) +#define MPI_LOGICAL (((MPI_Datatype)&(ompi_mpi_logic))) #if OMPI_HAVE_FORTRAN_LOGICAL1 -#define MPI_LOGICAL1 (&ompi_mpi_logical1) +#define MPI_LOGICAL1 (((MPI_Datatype)&(ompi_mpi_logical1))) #endif #if OMPI_HAVE_FORTRAN_LOGICAL2 -#define MPI_LOGICAL2 (&ompi_mpi_logical2) +#define MPI_LOGICAL2 (((MPI_Datatype)&(ompi_mpi_logical2))) #endif #if OMPI_HAVE_FORTRAN_LOGICAL4 -#define MPI_LOGICAL4 (&ompi_mpi_logical4) +#define MPI_LOGICAL4 (((MPI_Datatype)&(ompi_mpi_logical4))) #endif #if OMPI_HAVE_FORTRAN_LOGICAL8 -#define MPI_LOGICAL8 (&ompi_mpi_logical8) +#define MPI_LOGICAL8 (((MPI_Datatype)&(ompi_mpi_logical8))) #endif -#define MPI_INTEGER (&ompi_mpi_integer) +#define MPI_INTEGER (((MPI_Datatype)&(ompi_mpi_integer))) #if OMPI_HAVE_FORTRAN_INTEGER1 -#define MPI_INTEGER1 (&ompi_mpi_integer1) +#define MPI_INTEGER1 (((MPI_Datatype)&(ompi_mpi_integer1))) #endif #if OMPI_HAVE_FORTRAN_INTEGER2 -#define MPI_INTEGER2 (&ompi_mpi_integer2) +#define MPI_INTEGER2 (((MPI_Datatype)&(ompi_mpi_integer2))) #endif #if OMPI_HAVE_FORTRAN_INTEGER4 -#define MPI_INTEGER4 (&ompi_mpi_integer4) +#define MPI_INTEGER4 (((MPI_Datatype)&(ompi_mpi_integer4))) #endif #if OMPI_HAVE_FORTRAN_INTEGER8 -#define MPI_INTEGER8 (&ompi_mpi_integer8) +#define MPI_INTEGER8 (((MPI_Datatype)&(ompi_mpi_integer8))) #endif #if OMPI_HAVE_FORTRAN_INTEGER16 -#define MPI_INTEGER16 (&ompi_mpi_integer16) +#define MPI_INTEGER16 (((MPI_Datatype)&(ompi_mpi_integer16))) #endif -#define MPI_REAL (&ompi_mpi_real) +#define MPI_REAL (((MPI_Datatype)&(ompi_mpi_real))) #if OMPI_HAVE_FORTRAN_REAL4 -#define MPI_REAL4 (&ompi_mpi_real4) +#define MPI_REAL4 (((MPI_Datatype)&(ompi_mpi_real4))) #endif #if OMPI_HAVE_FORTRAN_REAL8 -#define MPI_REAL8 (&ompi_mpi_real8) +#define MPI_REAL8 (((MPI_Datatype)&(ompi_mpi_real8))) #endif #if OMPI_HAVE_FORTRAN_REAL16 -#define MPI_REAL16 (&ompi_mpi_real16) +#define MPI_REAL16 (((MPI_Datatype)&(ompi_mpi_real16))) #endif -#define MPI_DOUBLE_PRECISION (&ompi_mpi_dblprec) -#define MPI_COMPLEX (&ompi_mpi_cplex) +#define MPI_DOUBLE_PRECISION (((MPI_Datatype)&(ompi_mpi_dblprec))) +#define MPI_COMPLEX (((MPI_Datatype)&(ompi_mpi_cplex))) #if OMPI_HAVE_FORTRAN_REAL4 -#define MPI_COMPLEX8 (&ompi_mpi_complex8) +#define MPI_COMPLEX8 (((MPI_Datatype)&(ompi_mpi_complex8))) #endif #if OMPI_HAVE_FORTRAN_REAL8 -#define MPI_COMPLEX16 (&ompi_mpi_complex16) +#define MPI_COMPLEX16 (((MPI_Datatype)&(ompi_mpi_complex16))) #endif #if OMPI_HAVE_FORTRAN_REAL16 -#define MPI_COMPLEX32 (&ompi_mpi_complex32) +#define MPI_COMPLEX32 (((MPI_Datatype)&(ompi_mpi_complex32))) #endif -#define MPI_DOUBLE_COMPLEX (&ompi_mpi_dblcplex) -#define MPI_2REAL (&ompi_mpi_2real) -#define MPI_2DOUBLE_PRECISION (&ompi_mpi_2dblprec) -#define MPI_2INTEGER (&ompi_mpi_2integer) +#define MPI_DOUBLE_COMPLEX (((MPI_Datatype)&(ompi_mpi_dblcplex))) +#define MPI_2REAL (((MPI_Datatype)&(ompi_mpi_2real))) +#define MPI_2DOUBLE_PRECISION (((MPI_Datatype)&(ompi_mpi_2dblprec))) +#define MPI_2INTEGER (((MPI_Datatype)&(ompi_mpi_2integer))) -#define MPI_ERRORS_ARE_FATAL (&ompi_mpi_errors_are_fatal) -#define MPI_ERRORS_RETURN (&ompi_mpi_errors_return) +#define MPI_ERRORS_ARE_FATAL (((MPI_Errhandler)&(ompi_mpi_errors_are_fatal))) +#define MPI_ERRORS_RETURN (((MPI_Errhandler)&(ompi_mpi_errors_return))) /* Typeclass definition for MPI_Type_match_size */ #define MPI_TYPECLASS_INTEGER 1 @@ -992,7 +1000,7 @@ OMPI_DECLSPEC int MPI_File_get_byte_offset(MPI_File fh, MPI_Offset offset, OMPI_DECLSPEC int MPI_File_read_shared(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status); OMPI_DECLSPEC int MPI_File_write_shared(MPI_File fh, void *buf, int count, - MPI_Datatype datatype, MPI_Status *status); + MPI_Datatype datatype, MPI_Status *status); OMPI_DECLSPEC int MPI_File_iread_shared(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Request *request); OMPI_DECLSPEC int MPI_File_iwrite_shared(MPI_File fh, void *buf, int count, diff --git a/ompi/info/info.c b/ompi/info/info.c index 5f158ade94..0b2484611c 100644 --- a/ompi/info/info.c +++ b/ompi/info/info.c @@ -11,6 +11,7 @@ * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -39,7 +40,7 @@ /* * Global variables */ -ompi_info_t ompi_mpi_info_null; +ompi_predefined_info_t ompi_mpi_info_null; /* @@ -89,8 +90,8 @@ int ompi_info_init(void) /* Create MPI_INFO_NULL */ - OBJ_CONSTRUCT(&ompi_mpi_info_null, ompi_info_t); - ompi_mpi_info_null.i_f_to_c_index = 0; + OBJ_CONSTRUCT(&ompi_mpi_info_null.info, ompi_info_t); + ompi_mpi_info_null.info.i_f_to_c_index = 0; /* All done */ @@ -348,7 +349,7 @@ int ompi_info_finalize(void) leak report on it. Plus, it's statically allocated, so we don't want to call OBJ_RELEASE on it. */ - OBJ_DESTRUCT(&ompi_mpi_info_null); + OBJ_DESTRUCT(&ompi_mpi_info_null.info); opal_pointer_array_set_item(&ompi_info_f_to_c_table, 0, NULL); /* Go through the f2c table and see if anything is left. Free them diff --git a/ompi/info/info.h b/ompi/info/info.h index b2408b731d..24135c913c 100644 --- a/ompi/info/info.h +++ b/ompi/info/info.h @@ -11,6 +11,7 @@ * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -52,6 +53,20 @@ struct ompi_info_t { */ typedef struct ompi_info_t ompi_info_t; +/** + * Padded struct to maintain back compatibiltiy. + * See ompi/communicator/communicator.h comments with struct ompi_communicator_t + * for full explanation why we chose the following padding construct for predefines. + */ +#define PREDEFINED_INFO_PAD (sizeof(void*) * 32) + +struct ompi_predefined_info_t { + struct ompi_info_t info; + char padding[PREDEFINED_INFO_PAD - sizeof(ompi_info_t)]; +}; +typedef struct ompi_predefined_info_t ompi_predefined_info_t; + + /** * \internal * @@ -81,7 +96,7 @@ extern opal_pointer_array_t ompi_info_f_to_c_table; /** * Global instance for MPI_INFO_NULL */ -OMPI_DECLSPEC extern ompi_info_t ompi_mpi_info_null; +OMPI_DECLSPEC extern ompi_predefined_info_t ompi_mpi_info_null; /** * \internal diff --git a/ompi/mca/coll/tuned/coll_tuned_module.c b/ompi/mca/coll/tuned/coll_tuned_module.c index 36eff0eb12..29256bbe1d 100644 --- a/ompi/mca/coll/tuned/coll_tuned_module.c +++ b/ompi/mca/coll/tuned/coll_tuned_module.c @@ -261,7 +261,7 @@ tuned_module_enable(mca_coll_base_module_t *module, } - if (&ompi_mpi_comm_world==comm) { + if (&ompi_mpi_comm_world.comm==comm) { if (ompi_coll_tuned_use_dynamic_rules) { OPAL_OUTPUT((ompi_coll_tuned_stream,"coll:tuned:module_init MCW & Dynamic")); if (ompi_coll_tuned_dynamic_rules_filename) { diff --git a/ompi/mca/dpm/orte/dpm_orte.c b/ompi/mca/dpm/orte/dpm_orte.c index 9a654c3d8e..1eb1a42b9a 100644 --- a/ompi/mca/dpm/orte/dpm_orte.c +++ b/ompi/mca/dpm/orte/dpm_orte.c @@ -11,6 +11,7 @@ * All rights reserved. * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. * Copyright (c) 2006-2008 University of Houston. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -42,6 +43,7 @@ #include "orte/runtime/orte_wait.h" #include "ompi/communicator/communicator.h" +#include "ompi/group/group.h" #include "ompi/proc/proc.h" #include "ompi/mca/pml/pml.h" #include "ompi/info/info.h" @@ -931,11 +933,11 @@ static int dyn_init(void) * objects */ - oldcomm = &ompi_mpi_comm_null; + oldcomm = &ompi_mpi_comm_null.comm; OBJ_RELEASE(oldcomm); - group = &ompi_mpi_group_null; + group = &ompi_mpi_group_null.group; OBJ_RELEASE(group); - errhandler = &ompi_mpi_errors_are_fatal; + errhandler = &ompi_mpi_errors_are_fatal.eh; OBJ_RELEASE(errhandler); /* Set name for debugging purposes */ diff --git a/ompi/mca/mpool/base/mpool_base_alloc.c b/ompi/mca/mpool/base/mpool_base_alloc.c index 89c87e0a89..d0805c8627 100644 --- a/ompi/mca/mpool/base/mpool_base_alloc.c +++ b/ompi/mca/mpool/base/mpool_base_alloc.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -125,7 +126,7 @@ void *mca_mpool_base_alloc(size_t size, ompi_info_t *info) mpool_tree_item->num_bytes = size; mpool_tree_item->count = 0; - if(&ompi_mpi_info_null == info) + if(&ompi_mpi_info_null.info == info) { for(item = opal_list_get_first(&mca_mpool_base_modules); item != opal_list_get_end(&mca_mpool_base_modules); diff --git a/ompi/mca/osc/base/osc_base_obj_convert.c b/ompi/mca/osc/base/osc_base_obj_convert.c index ee29a919b0..01b744c6a6 100644 --- a/ompi/mca/osc/base/osc_base_obj_convert.c +++ b/ompi/mca/osc/base/osc_base_obj_convert.c @@ -9,6 +9,7 @@ * All rights reserved. * Copyright (c) 2007 Los Alamos National Security, LLC. All rights * reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -187,7 +188,7 @@ ompi_osc_base_process_op(void *outbuf, int count, ompi_op_t *op) { - if (op == &ompi_mpi_op_replace) { + if (op == &ompi_mpi_op_replace.op) { return OMPI_ERR_NOT_SUPPORTED; } diff --git a/ompi/mca/osc/pt2pt/osc_pt2pt_data_move.c b/ompi/mca/osc/pt2pt/osc_pt2pt_data_move.c index 986cb84f47..b6447a80ac 100644 --- a/ompi/mca/osc/pt2pt/osc_pt2pt_data_move.c +++ b/ompi/mca/osc/pt2pt/osc_pt2pt_data_move.c @@ -7,7 +7,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. - * Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2008-2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -28,6 +28,7 @@ #include "opal/sys/atomic.h" #include "ompi/mca/pml/pml.h" #include "ompi/datatype/datatype.h" +#include "ompi/op/op.h" #include "ompi/mca/osc/base/base.h" #include "ompi/mca/osc/base/osc_base_obj_convert.h" #include "ompi/memchecker.h" @@ -660,7 +661,7 @@ ompi_osc_pt2pt_sendreq_recv_accum_long_cb(ompi_osc_pt2pt_mpireq_t *mpireq) /* lock the window for accumulates */ OPAL_THREAD_LOCK(&longreq->req_module->p2p_acc_lock); - if (longreq->req_op == &ompi_mpi_op_replace) { + if (longreq->req_op == &ompi_mpi_op_replace.op) { ompi_convertor_t convertor; struct iovec iov; uint32_t iov_count = 1; @@ -750,7 +751,7 @@ ompi_osc_pt2pt_sendreq_recv_accum(ompi_osc_pt2pt_module_t *module, /* lock the window for accumulates */ OPAL_THREAD_LOCK(&module->p2p_acc_lock); - if (op == &ompi_mpi_op_replace) { + if (op == &ompi_mpi_op_replace.op) { ompi_convertor_t convertor; struct iovec iov; uint32_t iov_count = 1; diff --git a/ompi/mca/osc/rdma/osc_rdma_data_move.c b/ompi/mca/osc/rdma/osc_rdma_data_move.c index 4c9ba97c48..1d3d8a4da3 100644 --- a/ompi/mca/osc/rdma/osc_rdma_data_move.c +++ b/ompi/mca/osc/rdma/osc_rdma_data_move.c @@ -9,6 +9,7 @@ * All rights reserved. * Copyright (c) 2007 Los Alamos National Security, LLC. All rights * reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -33,6 +34,7 @@ #include "ompi/mca/osc/base/base.h" #include "ompi/mca/osc/base/osc_base_obj_convert.h" #include "ompi/datatype/datatype.h" +#include "ompi/op/op.h" #include "ompi/memchecker.h" static inline int32_t @@ -918,7 +920,7 @@ ompi_osc_rdma_sendreq_recv_accum_long_cb(ompi_osc_rdma_longreq_t *longreq) /* lock the window for accumulates */ OPAL_THREAD_LOCK(&longreq->req_module->m_acc_lock); - if (longreq->req_op == &ompi_mpi_op_replace) { + if (longreq->req_op == &ompi_mpi_op_replace.op) { ompi_convertor_t convertor; struct iovec iov; uint32_t iov_count = 1; @@ -1008,7 +1010,7 @@ ompi_osc_rdma_sendreq_recv_accum(ompi_osc_rdma_module_t *module, /* lock the window for accumulates */ OPAL_THREAD_LOCK(&module->m_acc_lock); - if (op == &ompi_mpi_op_replace) { + if (op == &ompi_mpi_op_replace.op) { ompi_convertor_t convertor; struct iovec iov; uint32_t iov_count = 1; diff --git a/ompi/mca/pml/dr/pml_dr_iprobe.c b/ompi/mca/pml/dr/pml_dr_iprobe.c index 2063c54c1c..019b592962 100644 --- a/ompi/mca/pml/dr/pml_dr_iprobe.c +++ b/ompi/mca/pml/dr/pml_dr_iprobe.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2006 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -33,7 +34,7 @@ int mca_pml_dr_iprobe(int src, recvreq.req_recv.req_base.req_ompi.req_type = OMPI_REQUEST_PML; recvreq.req_recv.req_base.req_type = MCA_PML_REQUEST_IPROBE; - MCA_PML_DR_RECV_REQUEST_INIT(&recvreq, NULL, 0, &ompi_mpi_char, src, tag, comm, true); + MCA_PML_DR_RECV_REQUEST_INIT(&recvreq, NULL, 0, &ompi_mpi_char.dt, src, tag, comm, true); MCA_PML_DR_RECV_REQUEST_START(&recvreq); if( recvreq.req_recv.req_base.req_ompi.req_complete == true ) { @@ -61,7 +62,7 @@ int mca_pml_dr_probe(int src, recvreq.req_recv.req_base.req_ompi.req_type = OMPI_REQUEST_PML; recvreq.req_recv.req_base.req_type = MCA_PML_REQUEST_PROBE; - MCA_PML_DR_RECV_REQUEST_INIT(&recvreq, NULL, 0, &ompi_mpi_char, src, tag, comm, true); + MCA_PML_DR_RECV_REQUEST_INIT(&recvreq, NULL, 0, &ompi_mpi_char.dt, src, tag, comm, true); MCA_PML_DR_RECV_REQUEST_START(&recvreq); ompi_request_wait_completion(&recvreq.req_recv.req_base.req_ompi); diff --git a/ompi/mca/pml/ob1/pml_ob1_iprobe.c b/ompi/mca/pml/ob1/pml_ob1_iprobe.c index c86f1c74df..b2f1d69613 100644 --- a/ompi/mca/pml/ob1/pml_ob1_iprobe.c +++ b/ompi/mca/pml/ob1/pml_ob1_iprobe.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -33,7 +34,7 @@ int mca_pml_ob1_iprobe(int src, recvreq.req_recv.req_base.req_ompi.req_type = OMPI_REQUEST_PML; recvreq.req_recv.req_base.req_type = MCA_PML_REQUEST_IPROBE; - MCA_PML_OB1_RECV_REQUEST_INIT(&recvreq, NULL, 0, &ompi_mpi_char, src, tag, comm, true); + MCA_PML_OB1_RECV_REQUEST_INIT(&recvreq, NULL, 0, &ompi_mpi_char.dt, src, tag, comm, true); MCA_PML_OB1_RECV_REQUEST_START(&recvreq); if( recvreq.req_recv.req_base.req_ompi.req_complete == true ) { @@ -61,7 +62,7 @@ int mca_pml_ob1_probe(int src, recvreq.req_recv.req_base.req_ompi.req_type = OMPI_REQUEST_PML; recvreq.req_recv.req_base.req_type = MCA_PML_REQUEST_PROBE; - MCA_PML_OB1_RECV_REQUEST_INIT(&recvreq, NULL, 0, &ompi_mpi_char, src, tag, comm, true); + MCA_PML_OB1_RECV_REQUEST_INIT(&recvreq, NULL, 0, &ompi_mpi_char.dt, src, tag, comm, true); MCA_PML_OB1_RECV_REQUEST_START(&recvreq); ompi_request_wait_completion(&recvreq.req_recv.req_base.req_ompi); diff --git a/ompi/mpi/c/accumulate.c b/ompi/mpi/c/accumulate.c index c13f53e8d5..6ffa8a8a40 100644 --- a/ompi/mpi/c/accumulate.c +++ b/ompi/mpi/c/accumulate.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2009 Sun Microsystmes, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -17,7 +18,6 @@ */ #include "ompi_config.h" #include - #include "ompi/mpi/c/bindings.h" #include "ompi/win/win.h" #include "ompi/mca/osc/osc.h" @@ -81,7 +81,7 @@ int MPI_Accumulate(void *origin_addr, int origin_count, MPI_Datatype origin_data for other reduction operators, we don't require such behaivor, as checking for it is expensive here and we don't care in implementation.. */ - if (op != &ompi_mpi_op_replace) { + if (op != &ompi_mpi_op_replace.op) { ompi_datatype_t *op_check_dt, *origin_check_dt; char *msg; @@ -169,7 +169,7 @@ int MPI_Accumulate(void *origin_addr, int origin_count, MPI_Datatype origin_data for other reduction operators, we don't require such behaivor, as checking for it is expensive here and we don't care in implementation.. */ - if (op != &ompi_mpi_op_replace) { + if (op != &ompi_mpi_op_replace.op) { ompi_datatype_t *op_check_dt; char *msg; diff --git a/ompi/mpi/c/type_create_darray.c b/ompi/mpi/c/type_create_darray.c index 506634ee5c..22f5e77a22 100644 --- a/ompi/mpi/c/type_create_darray.c +++ b/ompi/mpi/c/type_create_darray.c @@ -11,6 +11,7 @@ * All rights reserved. * Copyright (c) 2007 Los Alamos National Security, LLC. All rights * reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -108,7 +109,7 @@ int MPI_Type_create_darray(int size, /* Don't just return MPI_DATATYPE_NULL as that can't be MPI_TYPE_FREE()ed, and that seems bad */ *newtype = ompi_ddt_create(0); - ompi_ddt_add(*newtype, &ompi_mpi_datatype_null, 0, 0, 0); + ompi_ddt_add(*newtype, &ompi_mpi_datatype_null.dt, 0, 0, 0); OPAL_CR_EXIT_LIBRARY(); return MPI_SUCCESS; } diff --git a/ompi/mpi/c/type_create_f90_complex.c b/ompi/mpi/c/type_create_f90_complex.c index 3093675bc9..9f7a5c6bcb 100644 --- a/ompi/mpi/c/type_create_f90_complex.c +++ b/ompi/mpi/c/type_create_f90_complex.c @@ -9,7 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. - * Copyright (c) 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2006-2009 Sun Microsystems, Inc. All rights reserved. * Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. * $COPYRIGHT$ * @@ -69,12 +69,12 @@ int MPI_Type_create_f90_complex(int p, int r, MPI_Datatype *newtype) * cache. */ - if( (LDBL_DIG < p) || (LDBL_MAX_10_EXP < r) ) *newtype = &ompi_mpi_datatype_null; - else if( (DBL_DIG < p) || (DBL_MAX_10_EXP < r) ) *newtype = &ompi_mpi_ldblcplex; - else if( (FLT_DIG < p) || (FLT_MAX_10_EXP < r) ) *newtype = &ompi_mpi_dblcplex; - else *newtype = &ompi_mpi_cplex; + if( (LDBL_DIG < p) || (LDBL_MAX_10_EXP < r) ) *newtype = &ompi_mpi_datatype_null.dt; + else if( (DBL_DIG < p) || (DBL_MAX_10_EXP < r) ) *newtype = &ompi_mpi_ldblcplex.dt; + else if( (FLT_DIG < p) || (FLT_MAX_10_EXP < r) ) *newtype = &ompi_mpi_dblcplex.dt; + else *newtype = &ompi_mpi_cplex.dt; - if( *newtype != &ompi_mpi_datatype_null ) { + if( *newtype != &ompi_mpi_datatype_null.dt ) { ompi_datatype_t* datatype; int* a_i[2]; int rc; diff --git a/ompi/mpi/c/type_create_f90_integer.c b/ompi/mpi/c/type_create_f90_integer.c index 080b2b8e43..9097ac4daf 100644 --- a/ompi/mpi/c/type_create_f90_integer.c +++ b/ompi/mpi/c/type_create_f90_integer.c @@ -9,7 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. - * Copyright (c) 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2006-2009 Sun Microsystems, Inc. All rights reserved. * Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. * $COPYRIGHT$ * @@ -56,26 +56,26 @@ int MPI_Type_create_f90_integer(int r, MPI_Datatype *newtype) * cache. */ - if (r > 38) *newtype = &ompi_mpi_datatype_null; + if (r > 38) *newtype = &ompi_mpi_datatype_null.dt; #if OMPI_HAVE_F90_INTEGER16 - else if (r > 18) *newtype = &ompi_mpi_long_long_int; + else if (r > 18) *newtype = &ompi_mpi_long_long_int.dt; #else - else if (r > 18) *newtype = &ompi_mpi_datatype_null; + else if (r > 18) *newtype = &ompi_mpi_datatype_null.dt; #endif /* OMPI_HAVE_F90_INTEGER16 */ #if SIZEOF_LONG > SIZEOF_INT - else if (r > 9) *newtype = &ompi_mpi_long; + else if (r > 9) *newtype = &ompi_mpi_long.dt; #else #if SIZEOF_LONG_LONG > SIZEOF_INT - else if (r > 9) *newtype = &ompi_mpi_long_long_int; + else if (r > 9) *newtype = &ompi_mpi_long_long_int.dt; #else - else if (r > 9) *newtype = &ompi_mpi_datatype_null; + else if (r > 9) *newtype = &ompi_mpi_datatype_null.dt; #endif /* SIZEOF_LONG_LONG > SIZEOF_INT */ #endif /* SIZEOF_LONG > SIZEOF_INT */ - else if (r > 4) *newtype = &ompi_mpi_int; - else if (r > 2) *newtype = &ompi_mpi_short; - else *newtype = &ompi_mpi_byte; + else if (r > 4) *newtype = &ompi_mpi_int.dt; + else if (r > 2) *newtype = &ompi_mpi_short.dt; + else *newtype = &ompi_mpi_byte.dt; - if( *newtype != &ompi_mpi_datatype_null ) { + if( *newtype != &ompi_mpi_datatype_null.dt ) { ompi_datatype_t* datatype; int* a_i[1]; int rc; diff --git a/ompi/mpi/c/type_create_f90_real.c b/ompi/mpi/c/type_create_f90_real.c index 86e774500d..3252b16063 100644 --- a/ompi/mpi/c/type_create_f90_real.c +++ b/ompi/mpi/c/type_create_f90_real.c @@ -9,7 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. - * Copyright (c) 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2006-2009 Sun Microsystems, Inc. All rights reserved. * Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. * $COPYRIGHT$ * @@ -70,12 +70,12 @@ int MPI_Type_create_f90_real(int p, int r, MPI_Datatype *newtype) * cache. */ - if( (LDBL_DIG < p) || (LDBL_MAX_10_EXP < r) ) *newtype = &ompi_mpi_datatype_null; - else if( (DBL_DIG < p) || (DBL_MAX_10_EXP < r) ) *newtype = &ompi_mpi_long_double; - else if( (FLT_DIG < p) || (FLT_MAX_10_EXP < r) ) *newtype = &ompi_mpi_double; - else *newtype = &ompi_mpi_float; + if( (LDBL_DIG < p) || (LDBL_MAX_10_EXP < r) ) *newtype = &ompi_mpi_datatype_null.dt; + else if( (DBL_DIG < p) || (DBL_MAX_10_EXP < r) ) *newtype = &ompi_mpi_long_double.dt; + else if( (FLT_DIG < p) || (FLT_MAX_10_EXP < r) ) *newtype = &ompi_mpi_double.dt; + else *newtype = &ompi_mpi_float.dt; - if( *newtype != &ompi_mpi_datatype_null ) { + if( *newtype != &ompi_mpi_datatype_null.dt ) { ompi_datatype_t* datatype; int* a_i[2]; int rc; diff --git a/ompi/mpi/c/type_create_subarray.c b/ompi/mpi/c/type_create_subarray.c index c297019348..3bb3a093c1 100644 --- a/ompi/mpi/c/type_create_subarray.c +++ b/ompi/mpi/c/type_create_subarray.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -77,7 +78,7 @@ int MPI_Type_create_subarray(int ndims, /* If the ndims is zero then return the NULL datatype */ if( ndims < 2 ) { if( 0 == ndims ) { - *newtype = &ompi_mpi_datatype_null; + *newtype = &ompi_mpi_datatype_null.dt; OPAL_CR_EXIT_LIBRARY(); return MPI_SUCCESS; } diff --git a/ompi/mpi/c/type_match_size.c b/ompi/mpi/c/type_match_size.c index 72db3a179d..72db821e6d 100644 --- a/ompi/mpi/c/type_match_size.c +++ b/ompi/mpi/c/type_match_size.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -51,11 +52,11 @@ int MPI_Type_match_size(int typeclass, int size, MPI_Datatype *type) *type = (MPI_Datatype)ompi_ddt_match_size( size, DT_FLAG_DATA_COMPLEX, DT_FLAG_DATA_FORTRAN ); break; default: - *type = &ompi_mpi_datatype_null; + *type = &ompi_mpi_datatype_null.dt; } OPAL_CR_EXIT_LIBRARY(); - if( *type != &ompi_mpi_datatype_null ) { + if( *type != &ompi_mpi_datatype_null.dt ) { return MPI_SUCCESS; } diff --git a/ompi/mpi/cxx/intercepts.cc b/ompi/mpi/cxx/intercepts.cc index b497ff6fc2..fde907d9a8 100644 --- a/ompi/mpi/cxx/intercepts.cc +++ b/ompi/mpi/cxx/intercepts.cc @@ -11,6 +11,7 @@ // Copyright (c) 2004-2005 The Regents of the University of California. // All rights reserved. // Copyright (c) 2006-2008 Cisco Systems, Inc. All rights reserved. +// Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. // $COPYRIGHT$ // // Additional copyrights may follow @@ -78,13 +79,13 @@ void ompi_mpi_cxx_win_throw_excptn_fctn(MPI_Win *, int *errcode, ...) void MPI::InitializeIntercepts() { - ompi_mpi_errors_throw_exceptions.eh_comm_fn = + ompi_mpi_errors_throw_exceptions.eh.eh_comm_fn = ompi_mpi_cxx_comm_throw_excptn_fctn; #if OMPI_PROVIDE_MPI_FILE_INTERFACE - ompi_mpi_errors_throw_exceptions.eh_file_fn = + ompi_mpi_errors_throw_exceptions.eh.eh_file_fn = ompi_mpi_cxx_file_throw_excptn_fctn; #endif - ompi_mpi_errors_throw_exceptions.eh_win_fn = + ompi_mpi_errors_throw_exceptions.eh.eh_win_fn = ompi_mpi_cxx_win_throw_excptn_fctn; } diff --git a/ompi/mpi/cxx/mpicxx.cc b/ompi/mpi/cxx/mpicxx.cc index 2c87c78986..e5428e35ba 100644 --- a/ompi/mpi/cxx/mpicxx.cc +++ b/ompi/mpi/cxx/mpicxx.cc @@ -46,9 +46,9 @@ void* const BOTTOM = (void*) MPI_BOTTOM; void* const IN_PLACE = (void*) MPI_IN_PLACE; // error-handling specifiers -const Errhandler ERRORS_ARE_FATAL(&ompi_mpi_errors_are_fatal); -const Errhandler ERRORS_RETURN(&ompi_mpi_errors_return); -const Errhandler ERRORS_THROW_EXCEPTIONS(&ompi_mpi_errors_throw_exceptions); +const Errhandler ERRORS_ARE_FATAL((MPI_Errhandler)&(ompi_mpi_errors_are_fatal)); +const Errhandler ERRORS_RETURN((MPI_Errhandler)&(ompi_mpi_errors_return)); +const Errhandler ERRORS_THROW_EXCEPTIONS((MPI_Errhandler)&(ompi_mpi_errors_throw_exceptions)); // elementary datatypes const Datatype CHAR(MPI_CHAR); @@ -77,25 +77,25 @@ const Datatype LONG_DOUBLE_INT(MPI_LONG_DOUBLE); #if OMPI_WANT_F77_BINDINGS // elementary datatype (Fortran) -const Datatype REAL(&ompi_mpi_real); -const Datatype INTEGER(&ompi_mpi_integer); -const Datatype DOUBLE_PRECISION(&ompi_mpi_dblprec); -const Datatype F_COMPLEX(&ompi_mpi_cplex); -const Datatype LOGICAL(&ompi_mpi_logic); -const Datatype CHARACTER(&ompi_mpi_character); +const Datatype REAL((MPI_Datatype)&(ompi_mpi_real)); +const Datatype INTEGER((MPI_Datatype)&(ompi_mpi_integer)); +const Datatype DOUBLE_PRECISION((MPI_Datatype)&(ompi_mpi_dblprec)); +const Datatype F_COMPLEX((MPI_Datatype)&(ompi_mpi_cplex)); +const Datatype LOGICAL((MPI_Datatype)&(ompi_mpi_logic)); +const Datatype CHARACTER((MPI_Datatype)&(ompi_mpi_character)); // datatype for reduction functions (Fortran) -const Datatype TWOREAL(&ompi_mpi_2real); -const Datatype TWODOUBLE_PRECISION(&ompi_mpi_2dblprec); -const Datatype TWOINTEGER(&ompi_mpi_2integer); +const Datatype TWOREAL((MPI_Datatype)&(ompi_mpi_2real)); +const Datatype TWODOUBLE_PRECISION((MPI_Datatype)&(ompi_mpi_2dblprec)); +const Datatype TWOINTEGER((MPI_Datatype)&(ompi_mpi_2integer)); // optional datatypes (Fortran) -const Datatype INTEGER2(&ompi_mpi_integer); -const Datatype REAL2(&ompi_mpi_real); -const Datatype INTEGER1(&ompi_mpi_char); -const Datatype INTEGER4(&ompi_mpi_short); -const Datatype REAL4(&ompi_mpi_real); -const Datatype REAL8(&ompi_mpi_double); +const Datatype INTEGER2((MPI_Datatype)&(ompi_mpi_integer)); +const Datatype REAL2((MPI_Datatype)&(ompi_mpi_real)); +const Datatype INTEGER1((MPI_Datatype)&(ompi_mpi_char)); +const Datatype INTEGER4((MPI_Datatype)&(ompi_mpi_short)); +const Datatype REAL4((MPI_Datatype)&(ompi_mpi_real)); +const Datatype REAL8((MPI_Datatype)&(ompi_mpi_double)); #endif // OMPI_WANT_f77_BINDINGS @@ -104,10 +104,10 @@ const Datatype UNSIGNED_LONG_LONG(MPI_UNSIGNED_LONG_LONG); const Datatype LONG_LONG(MPI_LONG_LONG); // c++ types -const Datatype BOOL(&ompi_mpi_cxx_bool); -const Datatype COMPLEX(&ompi_mpi_cxx_cplex); -const Datatype DOUBLE_COMPLEX(&ompi_mpi_cxx_dblcplex); -const Datatype LONG_DOUBLE_COMPLEX(&ompi_mpi_cxx_ldblcplex); +const Datatype BOOL((MPI_Datatype)&(ompi_mpi_cxx_bool)); +const Datatype COMPLEX((MPI_Datatype)&(ompi_mpi_cxx_cplex)); +const Datatype DOUBLE_COMPLEX((MPI_Datatype)&(ompi_mpi_cxx_dblcplex)); +const Datatype LONG_DOUBLE_COMPLEX((MPI_Datatype)&(ompi_mpi_cxx_ldblcplex)); // reserved communicators Intracomm COMM_WORLD(MPI_COMM_WORLD); diff --git a/ompi/mpi/f77/type_match_size_f.c b/ompi/mpi/f77/type_match_size_f.c index 5d8c9f09a5..1200f7c5fa 100644 --- a/ompi/mpi/f77/type_match_size_f.c +++ b/ompi/mpi/f77/type_match_size_f.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -87,10 +88,10 @@ void mpi_type_match_size_f(MPI_Fint *typeclass, MPI_Fint *size, MPI_Fint *type, c_type = (MPI_Datatype)ompi_ddt_match_size( c_size, DT_FLAG_DATA_COMPLEX, DT_FLAG_DATA_FORTRAN ); break; default: - c_type = &ompi_mpi_datatype_null; + c_type = &ompi_mpi_datatype_null.dt; } *type = MPI_Type_c2f( c_type ); - if ( c_type != &ompi_mpi_datatype_null ) { + if ( c_type != &ompi_mpi_datatype_null.dt ) { *ierr = OMPI_INT_2_FINT( MPI_SUCCESS ); } else { *ierr = OMPI_INT_2_FINT( MPI_ERR_ARG ); diff --git a/ompi/op/op.c b/ompi/op/op.c index 83be1631f9..093c157da9 100644 --- a/ompi/op/op.c +++ b/ompi/op/op.c @@ -11,6 +11,7 @@ * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2007-2009 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -57,20 +58,20 @@ OBJ_CLASS_INSTANCE(ompi_op_t, opal_object_t, /* * Intrinsic MPI_Op objects */ -ompi_op_t ompi_mpi_op_null; -ompi_op_t ompi_mpi_op_max; -ompi_op_t ompi_mpi_op_min; -ompi_op_t ompi_mpi_op_sum; -ompi_op_t ompi_mpi_op_prod; -ompi_op_t ompi_mpi_op_land; -ompi_op_t ompi_mpi_op_band; -ompi_op_t ompi_mpi_op_lor; -ompi_op_t ompi_mpi_op_bor; -ompi_op_t ompi_mpi_op_lxor; -ompi_op_t ompi_mpi_op_bxor; -ompi_op_t ompi_mpi_op_maxloc; -ompi_op_t ompi_mpi_op_minloc; -ompi_op_t ompi_mpi_op_replace; +ompi_predefined_op_t ompi_mpi_op_null; +ompi_predefined_op_t ompi_mpi_op_max; +ompi_predefined_op_t ompi_mpi_op_min; +ompi_predefined_op_t ompi_mpi_op_sum; +ompi_predefined_op_t ompi_mpi_op_prod; +ompi_predefined_op_t ompi_mpi_op_land; +ompi_predefined_op_t ompi_mpi_op_band; +ompi_predefined_op_t ompi_mpi_op_lor; +ompi_predefined_op_t ompi_mpi_op_bor; +ompi_predefined_op_t ompi_mpi_op_lxor; +ompi_predefined_op_t ompi_mpi_op_bxor; +ompi_predefined_op_t ompi_mpi_op_maxloc; +ompi_predefined_op_t ompi_mpi_op_minloc; +ompi_predefined_op_t ompi_mpi_op_replace; /* * Map from ddt->id to position in op function pointer array @@ -139,46 +140,46 @@ int ompi_op_init(void) /* Create the intrinsic ops */ if (OMPI_SUCCESS != - add_intrinsic(&ompi_mpi_op_null, OMPI_OP_BASE_FORTRAN_NULL, + add_intrinsic(&ompi_mpi_op_null.op, OMPI_OP_BASE_FORTRAN_NULL, FLAGS, "MPI_OP_NULL") || OMPI_SUCCESS != - add_intrinsic(&ompi_mpi_op_max, OMPI_OP_BASE_FORTRAN_MAX, + add_intrinsic(&ompi_mpi_op_max.op, OMPI_OP_BASE_FORTRAN_MAX, FLAGS, "MPI_OP_MAX") || OMPI_SUCCESS != - add_intrinsic(&ompi_mpi_op_min, OMPI_OP_BASE_FORTRAN_MIN, + add_intrinsic(&ompi_mpi_op_min.op, OMPI_OP_BASE_FORTRAN_MIN, FLAGS, "MPI_OP_MIN") || OMPI_SUCCESS != - add_intrinsic(&ompi_mpi_op_sum, OMPI_OP_BASE_FORTRAN_SUM, + add_intrinsic(&ompi_mpi_op_sum.op, OMPI_OP_BASE_FORTRAN_SUM, FLAGS_NO_FLOAT, "MPI_OP_SUM") || OMPI_SUCCESS != - add_intrinsic(&ompi_mpi_op_prod, OMPI_OP_BASE_FORTRAN_PROD, + add_intrinsic(&ompi_mpi_op_prod.op, OMPI_OP_BASE_FORTRAN_PROD, FLAGS_NO_FLOAT, "MPI_OP_PROD") || OMPI_SUCCESS != - add_intrinsic(&ompi_mpi_op_land, OMPI_OP_BASE_FORTRAN_LAND, + add_intrinsic(&ompi_mpi_op_land.op, OMPI_OP_BASE_FORTRAN_LAND, FLAGS, "MPI_OP_LAND") || OMPI_SUCCESS != - add_intrinsic(&ompi_mpi_op_band, OMPI_OP_BASE_FORTRAN_BAND, + add_intrinsic(&ompi_mpi_op_band.op, OMPI_OP_BASE_FORTRAN_BAND, FLAGS, "MPI_OP_BAND") || OMPI_SUCCESS != - add_intrinsic(&ompi_mpi_op_lor, OMPI_OP_BASE_FORTRAN_LOR, + add_intrinsic(&ompi_mpi_op_lor.op, OMPI_OP_BASE_FORTRAN_LOR, FLAGS, "MPI_OP_LOR") || OMPI_SUCCESS != - add_intrinsic(&ompi_mpi_op_bor, OMPI_OP_BASE_FORTRAN_BOR, + add_intrinsic(&ompi_mpi_op_bor.op, OMPI_OP_BASE_FORTRAN_BOR, FLAGS, "MPI_OP_BOR") || OMPI_SUCCESS != - add_intrinsic(&ompi_mpi_op_lxor, OMPI_OP_BASE_FORTRAN_LXOR, + add_intrinsic(&ompi_mpi_op_lxor.op, OMPI_OP_BASE_FORTRAN_LXOR, FLAGS, "MPI_OP_LXOR") || OMPI_SUCCESS != - add_intrinsic(&ompi_mpi_op_bxor, OMPI_OP_BASE_FORTRAN_BXOR, + add_intrinsic(&ompi_mpi_op_bxor.op, OMPI_OP_BASE_FORTRAN_BXOR, FLAGS, "MPI_OP_BXOR") || OMPI_SUCCESS != - add_intrinsic(&ompi_mpi_op_maxloc, OMPI_OP_BASE_FORTRAN_MAXLOC, + add_intrinsic(&ompi_mpi_op_maxloc.op, OMPI_OP_BASE_FORTRAN_MAXLOC, FLAGS, "MPI_OP_MAXLOC") || OMPI_SUCCESS != - add_intrinsic(&ompi_mpi_op_minloc, OMPI_OP_BASE_FORTRAN_MINLOC, + add_intrinsic(&ompi_mpi_op_minloc.op, OMPI_OP_BASE_FORTRAN_MINLOC, FLAGS, "MPI_OP_MINLOC") || OMPI_SUCCESS != - add_intrinsic(&ompi_mpi_op_replace, OMPI_OP_BASE_FORTRAN_REPLACE, + add_intrinsic(&ompi_mpi_op_replace.op, OMPI_OP_BASE_FORTRAN_REPLACE, FLAGS, "MPI_OP_REPLACE")) { return OMPI_ERROR; } diff --git a/ompi/op/op.h b/ompi/op/op.h index db069caad9..d42986b610 100644 --- a/ompi/op/op.h +++ b/ompi/op/op.h @@ -12,6 +12,7 @@ * All rights reserved. * Copyright (c) 2008 UT-Battelle, LLC * Copyright (c) 2008-2009 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -145,6 +146,20 @@ struct ompi_op_t { typedef struct ompi_op_t ompi_op_t; OMPI_DECLSPEC OBJ_CLASS_DECLARATION(ompi_op_t); +/** + * Padded struct to maintain back compatibiltiy. + * See ompi/communicator/communicator.h comments with struct ompi_communicator_t + * for full explanation why we chose the following padding construct for predefines. + */ +#define PREDEFINED_OP_PAD (sizeof(void*) * 256) + +struct ompi_predefined_op_t { + struct ompi_op_t op; + char padding[PREDEFINED_OP_PAD - sizeof(ompi_op_t)]; +}; + +typedef struct ompi_predefined_op_t ompi_predefined_op_t; + /** * Array to map ddt->id values to the corresponding position in the op * function array. @@ -179,72 +194,72 @@ OMPI_DECLSPEC extern int ompi_op_ddt_map[DT_MAX_PREDEFINED]; /** * Global variable for MPI_OP_NULL */ -OMPI_DECLSPEC extern ompi_op_t ompi_mpi_op_null; +OMPI_DECLSPEC extern ompi_predefined_op_t ompi_mpi_op_null; /** * Global variable for MPI_MAX */ -OMPI_DECLSPEC extern ompi_op_t ompi_mpi_op_max; +OMPI_DECLSPEC extern ompi_predefined_op_t ompi_mpi_op_max; /** * Global variable for MPI_MIN */ -OMPI_DECLSPEC extern ompi_op_t ompi_mpi_op_min; +OMPI_DECLSPEC extern ompi_predefined_op_t ompi_mpi_op_min; /** * Global variable for MPI_SUM */ -OMPI_DECLSPEC extern ompi_op_t ompi_mpi_op_sum; +OMPI_DECLSPEC extern ompi_predefined_op_t ompi_mpi_op_sum; /** * Global variable for MPI_PROD */ -OMPI_DECLSPEC extern ompi_op_t ompi_mpi_op_prod; +OMPI_DECLSPEC extern ompi_predefined_op_t ompi_mpi_op_prod; /** * Global variable for MPI_LAND */ -OMPI_DECLSPEC extern ompi_op_t ompi_mpi_op_land; +OMPI_DECLSPEC extern ompi_predefined_op_t ompi_mpi_op_land; /** * Global variable for MPI_BAND */ -OMPI_DECLSPEC extern ompi_op_t ompi_mpi_op_band; +OMPI_DECLSPEC extern ompi_predefined_op_t ompi_mpi_op_band; /** * Global variable for MPI_LOR */ -OMPI_DECLSPEC extern ompi_op_t ompi_mpi_op_lor; +OMPI_DECLSPEC extern ompi_predefined_op_t ompi_mpi_op_lor; /** * Global variable for MPI_BOR */ -OMPI_DECLSPEC extern ompi_op_t ompi_mpi_op_bor; +OMPI_DECLSPEC extern ompi_predefined_op_t ompi_mpi_op_bor; /** * Global variable for MPI_LXOR */ -OMPI_DECLSPEC extern ompi_op_t ompi_mpi_op_lxor; +OMPI_DECLSPEC extern ompi_predefined_op_t ompi_mpi_op_lxor; /** * Global variable for MPI_BXOR */ -OMPI_DECLSPEC extern ompi_op_t ompi_mpi_op_bxor; +OMPI_DECLSPEC extern ompi_predefined_op_t ompi_mpi_op_bxor; /** * Global variable for MPI_MAXLOC */ -OMPI_DECLSPEC extern ompi_op_t ompi_mpi_op_maxloc; +OMPI_DECLSPEC extern ompi_predefined_op_t ompi_mpi_op_maxloc; /** * Global variable for MPI_MINLOC */ -OMPI_DECLSPEC extern ompi_op_t ompi_mpi_op_minloc; +OMPI_DECLSPEC extern ompi_predefined_op_t ompi_mpi_op_minloc; /** * Global variable for MPI_REPLACE */ -OMPI_DECLSPEC extern ompi_op_t ompi_mpi_op_replace; +OMPI_DECLSPEC extern ompi_predefined_op_t ompi_mpi_op_replace; /** diff --git a/ompi/request/grequest.c b/ompi/request/grequest.c index 7bd237f650..78d1bf7cd7 100644 --- a/ompi/request/grequest.c +++ b/ompi/request/grequest.c @@ -10,6 +10,7 @@ * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -18,6 +19,7 @@ */ #include "ompi_config.h" +#include "ompi/communicator/communicator.h" #include "ompi/request/grequest.h" #include "ompi/mpi/f77/fint_2_int.h" @@ -64,7 +66,7 @@ static void ompi_grequest_construct(ompi_grequest_t* greq) greq->greq_base.req_free = ompi_grequest_free; greq->greq_base.req_cancel = ompi_grequest_cancel; greq->greq_base.req_type = OMPI_REQUEST_GEN; - greq->greq_base.req_mpi_object.comm = &ompi_mpi_comm_world; + greq->greq_base.req_mpi_object.comm = &(ompi_mpi_comm_world.comm); /* Set the function pointers to C here; the F77 MPI API will override this value if the gen request was created from Fortran */ diff --git a/ompi/request/request.c b/ompi/request/request.c index 50cdac3248..7d5ef32c5c 100644 --- a/ompi/request/request.c +++ b/ompi/request/request.c @@ -11,6 +11,7 @@ * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -20,6 +21,7 @@ #include "ompi_config.h" +#include "ompi/communicator/communicator.h" #include "opal/class/opal_object.h" #include "ompi/request/request.h" #include "ompi/request/request_default.h" @@ -30,7 +32,7 @@ size_t ompi_request_waiting = 0; size_t ompi_request_completed = 0; opal_mutex_t ompi_request_lock; opal_condition_t ompi_request_cond; -ompi_request_t ompi_request_null; +ompi_predefined_request_t ompi_request_null; ompi_request_t ompi_request_empty; ompi_status_public_t ompi_status_empty; ompi_request_fns_t ompi_request_functions = { @@ -72,7 +74,7 @@ static int ompi_request_null_cancel(ompi_request_t* request, int flag) static int ompi_request_empty_free(ompi_request_t** request) { - *request = &ompi_request_null; + *request = &ompi_request_null.request; return OMPI_SUCCESS; } @@ -81,7 +83,7 @@ int ompi_request_persistent_proc_null_free(ompi_request_t** request) OMPI_REQUEST_FINI(*request); (*request)->req_state = OMPI_REQUEST_INVALID; OBJ_RELEASE(*request); - *request = &ompi_request_null; + *request = &ompi_request_null.request; return OMPI_SUCCESS; } @@ -104,23 +106,23 @@ int ompi_request_init(void) 0, OMPI_FORTRAN_HANDLE_MAX, 64) ) { return OMPI_ERROR; } - ompi_request_null.req_type = OMPI_REQUEST_NULL; - ompi_request_null.req_status.MPI_SOURCE = MPI_PROC_NULL; - ompi_request_null.req_status.MPI_TAG = MPI_ANY_TAG; - ompi_request_null.req_status.MPI_ERROR = MPI_SUCCESS; - ompi_request_null.req_status._count = 0; - ompi_request_null.req_status._cancelled = 0; + ompi_request_null.request.req_type = OMPI_REQUEST_NULL; + ompi_request_null.request.req_status.MPI_SOURCE = MPI_PROC_NULL; + ompi_request_null.request.req_status.MPI_TAG = MPI_ANY_TAG; + ompi_request_null.request.req_status.MPI_ERROR = MPI_SUCCESS; + ompi_request_null.request.req_status._count = 0; + ompi_request_null.request.req_status._cancelled = 0; - ompi_request_null.req_complete = true; - ompi_request_null.req_state = OMPI_REQUEST_INACTIVE; - ompi_request_null.req_persistent = false; - ompi_request_null.req_f_to_c_index = + ompi_request_null.request.req_complete = true; + ompi_request_null.request.req_state = OMPI_REQUEST_INACTIVE; + ompi_request_null.request.req_persistent = false; + ompi_request_null.request.req_f_to_c_index = opal_pointer_array_add(&ompi_request_f_to_c_table, &ompi_request_null); - ompi_request_null.req_free = ompi_request_null_free; - ompi_request_null.req_cancel = ompi_request_null_cancel; - ompi_request_null.req_mpi_object.comm = &ompi_mpi_comm_world; + ompi_request_null.request.req_free = ompi_request_null_free; + ompi_request_null.request.req_cancel = ompi_request_null_cancel; + ompi_request_null.request.req_mpi_object.comm = &ompi_mpi_comm_world.comm; - if (0 != ompi_request_null.req_f_to_c_index) { + if (0 != ompi_request_null.request.req_f_to_c_index) { return OMPI_ERR_REQUEST; } @@ -150,7 +152,7 @@ int ompi_request_init(void) opal_pointer_array_add(&ompi_request_f_to_c_table, &ompi_request_empty); ompi_request_empty.req_free = ompi_request_empty_free; ompi_request_empty.req_cancel = ompi_request_null_cancel; - ompi_request_empty.req_mpi_object.comm = &ompi_mpi_comm_world; + ompi_request_empty.req_mpi_object.comm = &ompi_mpi_comm_world.comm; if (1 != ompi_request_empty.req_f_to_c_index) { return OMPI_ERR_REQUEST; @@ -168,8 +170,8 @@ int ompi_request_init(void) int ompi_request_finalize(void) { - OMPI_REQUEST_FINI( &ompi_request_null ); - OBJ_DESTRUCT( &ompi_request_null ); + OMPI_REQUEST_FINI( &ompi_request_null.request ); + OBJ_DESTRUCT( &ompi_request_null.request ); OMPI_REQUEST_FINI( &ompi_request_empty ); OBJ_DESTRUCT( &ompi_request_empty ); OBJ_DESTRUCT( &ompi_request_cond ); diff --git a/ompi/request/request.h b/ompi/request/request.h index 4805118c9b..843c3a0c7d 100644 --- a/ompi/request/request.h +++ b/ompi/request/request.h @@ -11,6 +11,7 @@ * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -131,6 +132,19 @@ struct ompi_request_t { */ typedef struct ompi_request_t ompi_request_t; +/** + * Padded struct to maintain back compatibiltiy. + * See ompi/communicator/communicator.h comments with struct ompi_communicator_t + * for full explanation why we chose the following padding construct for predefines. + */ +#define PREDEFINED_REQUEST_PAD (sizeof(void*) * 32) + +struct ompi_predefined_request_t { + struct ompi_request_t request; + char padding[PREDEFINED_REQUEST_PAD - sizeof(ompi_request_t)]; +}; + +typedef struct ompi_predefined_request_t ompi_predefined_request_t; /** * Initialize a request. This is a macro to avoid function call @@ -312,7 +326,7 @@ OMPI_DECLSPEC extern size_t ompi_request_completed; OMPI_DECLSPEC extern int32_t ompi_request_poll; OMPI_DECLSPEC extern opal_mutex_t ompi_request_lock; OMPI_DECLSPEC extern opal_condition_t ompi_request_cond; -OMPI_DECLSPEC extern ompi_request_t ompi_request_null; +OMPI_DECLSPEC extern ompi_predefined_request_t ompi_request_null; OMPI_DECLSPEC extern ompi_request_t ompi_request_empty; OMPI_DECLSPEC extern ompi_status_public_t ompi_status_empty; OMPI_DECLSPEC extern ompi_request_fns_t ompi_request_functions; diff --git a/ompi/runtime/ompi_mpi_finalize.c b/ompi/runtime/ompi_mpi_finalize.c index b637df6f6c..76f81f21d0 100644 --- a/ompi/runtime/ompi_mpi_finalize.c +++ b/ompi/runtime/ompi_mpi_finalize.c @@ -14,6 +14,7 @@ * Copyright (c) 2006 Los Alamos National Security, LLC. All rights * reserved. * Copyright (c) 2006 University of Houston. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * * $COPYRIGHT$ * @@ -119,11 +120,11 @@ int ompi_mpi_finalize(void) anything else in MPI_FINALIZE (to include setting up such that MPI_FINALIZED will return true). */ - if (NULL != ompi_mpi_comm_self.c_keyhash) { + if (NULL != ompi_mpi_comm_self.comm.c_keyhash) { ompi_attr_delete_all(COMM_ATTR, &ompi_mpi_comm_self, - ompi_mpi_comm_self.c_keyhash); - OBJ_RELEASE(ompi_mpi_comm_self.c_keyhash); - ompi_mpi_comm_self.c_keyhash = NULL; + ompi_mpi_comm_self.comm.c_keyhash); + OBJ_RELEASE(ompi_mpi_comm_self.comm.c_keyhash); + ompi_mpi_comm_self.comm.c_keyhash = NULL; } /* Proceed with MPI_FINALIZE */ diff --git a/ompi/runtime/ompi_mpi_init.c b/ompi/runtime/ompi_mpi_init.c index f62f932b23..1d16d5a9a1 100644 --- a/ompi/runtime/ompi_mpi_init.c +++ b/ompi/runtime/ompi_mpi_init.c @@ -13,7 +13,7 @@ * Copyright (c) 2006-2007 Los Alamos National Security, LLC. All rights * reserved. * Copyright (c) 2006 University of Houston. All rights reserved. - * Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2008-2009 Sun Microsystems, Inc. All rights reserved. * * $COPYRIGHT$ * @@ -136,7 +136,7 @@ static void warn_fork_cb(void) if (ompi_mpi_initialized && !ompi_mpi_finalized && !fork_warning_issued) { orte_show_help("help-mpi-runtime.txt", "mpi_init:warn-fork", true, orte_process_info.nodename, getpid(), - ompi_mpi_comm_world.c_my_rank); + ompi_mpi_comm_world.comm.c_my_rank); fork_warning_issued = true; } } @@ -688,15 +688,15 @@ int ompi_mpi_init(int argc, char **argv, int requested, int *provided) goto error; } - MCA_PML_CALL(add_comm(&ompi_mpi_comm_world)); - MCA_PML_CALL(add_comm(&ompi_mpi_comm_self)); + MCA_PML_CALL(add_comm(&ompi_mpi_comm_world.comm)); + MCA_PML_CALL(add_comm(&ompi_mpi_comm_self.comm)); /* * Dump all MCA parameters if requested */ if (ompi_mpi_show_mca_params) { - ompi_show_all_mca_params(ompi_mpi_comm_world.c_my_rank, + ompi_show_all_mca_params(ompi_mpi_comm_world.comm.c_my_rank, nprocs, orte_process_info.nodename); } diff --git a/ompi/win/win.c b/ompi/win/win.c index 44bd208256..e0b266063f 100644 --- a/ompi/win/win.c +++ b/ompi/win/win.c @@ -10,6 +10,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -36,7 +37,7 @@ */ opal_pointer_array_t ompi_mpi_windows; -ompi_win_t ompi_mpi_win_null; +ompi_predefined_win_t ompi_mpi_win_null; static void ompi_win_construct(ompi_win_t *win); static void ompi_win_destruct(ompi_win_t *win); @@ -55,12 +56,12 @@ ompi_win_init(void) } /* Setup MPI_WIN_NULL */ - OBJ_CONSTRUCT(&ompi_mpi_win_null, ompi_win_t); - ompi_mpi_win_null.w_flags = OMPI_WIN_INVALID; - ompi_mpi_win_null.w_group = &ompi_mpi_group_null; + OBJ_CONSTRUCT(&ompi_mpi_win_null.win, ompi_win_t); + ompi_mpi_win_null.win.w_flags = OMPI_WIN_INVALID; + ompi_mpi_win_null.win.w_group = &ompi_mpi_group_null.group; OBJ_RETAIN(&ompi_mpi_group_null); - ompi_win_set_name(&ompi_mpi_win_null, "MPI_WIN_NULL"); - opal_pointer_array_set_item(&ompi_mpi_windows, 0, &ompi_mpi_win_null); + ompi_win_set_name(&ompi_mpi_win_null.win, "MPI_WIN_NULL"); + opal_pointer_array_set_item(&ompi_mpi_windows, 0, &ompi_mpi_win_null.win); return OMPI_SUCCESS; } @@ -69,7 +70,7 @@ ompi_win_init(void) int ompi_win_finalize(void) { - OBJ_DESTRUCT(&ompi_mpi_win_null); + OBJ_DESTRUCT(&ompi_mpi_win_null.win); OBJ_DESTRUCT(&ompi_mpi_windows); return OMPI_SUCCESS; @@ -208,8 +209,8 @@ ompi_win_construct(ompi_win_t *win) /* every new window defaults to MPI_ERRORS_ARE_FATAL (MPI-2 6.6.1, pg. 137) */ - OBJ_RETAIN(&ompi_mpi_errors_are_fatal); - win->error_handler = &ompi_mpi_errors_are_fatal; + OBJ_RETAIN(&ompi_mpi_errors_are_fatal.eh); + win->error_handler = &ompi_mpi_errors_are_fatal.eh; win->errhandler_type = OMPI_ERRHANDLER_TYPE_WIN; win->w_disp_unit = 0; diff --git a/ompi/win/win.h b/ompi/win/win.h index f312bf38aa..aea5d2ce65 100644 --- a/ompi/win/win.h +++ b/ompi/win/win.h @@ -11,6 +11,7 @@ * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -93,7 +94,20 @@ struct ompi_win_t { typedef struct ompi_win_t ompi_win_t; OMPI_DECLSPEC OBJ_CLASS_DECLARATION(ompi_win_t); -OMPI_DECLSPEC extern ompi_win_t ompi_mpi_win_null; +/** + * Padded struct to maintain back compatibiltiy. + * See ompi/communicator/communicator.h comments with struct ompi_communicator_t + * for full explanation why we chose the following padding construct for predefines. + */ +#define PREDEFINED_WIN_PAD (sizeof(void*) * 64) + +struct ompi_predefined_win_t { + struct ompi_win_t win; + char padding[PREDEFINED_WIN_PAD - sizeof(ompi_win_t)]; +}; +typedef struct ompi_predefined_win_t ompi_predefined_win_t; + +OMPI_DECLSPEC extern ompi_predefined_win_t ompi_mpi_win_null; int ompi_win_init(void); int ompi_win_finalize(void); diff --git a/test/Makefile.am b/test/Makefile.am index e76c9a5091..404e2491d8 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -9,6 +9,7 @@ # University of Stuttgart. All rights reserved. # Copyright (c) 2004-2005 The Regents of the University of California. # All rights reserved. +# Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. # $COPYRIGHT$ # # Additional copyrights may follow @@ -16,8 +17,9 @@ # $HEADER$ # - - # support needs to be first for dependencies SUBDIRS = support asm class threads peruse datatype DIST_SUBDIRS = event $(SUBDIRS) + +TESTS = +include predefined/Makefile.inc diff --git a/test/predefined/Makefile.inc b/test/predefined/Makefile.inc new file mode 100644 index 0000000000..79191cb2c7 --- /dev/null +++ b/test/predefined/Makefile.inc @@ -0,0 +1,22 @@ +# -*- makefile -*- +# +# Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. +# Copyright (c) 2009 Cisco Systems, Inc. All rights reserved. +# $COPYRIGHT$ +# +# Additional copyrights may follow +# +# $HEADER$ +# + + +check_PROGRAMS = \ + predefined/ompi_predefined + +predefined_ompi_predefined_SOURCES = predefined/ompi_predefined.c +predefined_ompi_predefined_LDADD = \ + $(top_builddir)/ompi/libmpi.la \ + $(top_builddir)/orte/libopen-rte.la \ + $(top_builddir)/opal/libopen-pal.la +predefined_ompi_predefined_DEPENDENCIES = $(ompi_predefined_LDADD) + diff --git a/test/predefined/ompi_predefined.c b/test/predefined/ompi_predefined.c new file mode 100644 index 0000000000..1124819e67 --- /dev/null +++ b/test/predefined/ompi_predefined.c @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2009 Sun Microsystems, Inc All rights reserved. + * Copyright (c) 2009 Cisco Systems, Inc All rights reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#include "ompi_config.h" +#include "ompi/communicator/communicator.h" +#include "ompi/group/group.h" +#include "ompi/request/request.h" +#include "ompi/op/op.h" +#include "ompi/datatype/datatype.h" +#include "ompi/win/win.h" +#include "ompi/info/info.h" +#include "ompi/file/file.h" + +#include + +#define GAP_CHECK(NAME, BASE, F1, F2, CGAP) { \ + offset = (size_t)&BASE.F1 - (size_t)&BASE; \ + exp_offset = ((size_t)&BASE.F2 - (size_t)&BASE) + sizeof(BASE.F2); \ + printf(NAME" = %lu, %lu ", offset, sizeof(BASE.F1)); \ + if (CGAP && offset != exp_offset) printf("***"); \ + printf("\n"); \ + } + + +int main(int argc, char **argv) { + ompi_communicator_t test_comm; + ompi_group_t test_group; + ompi_request_t test_req; + ompi_op_t test_op; + ompi_win_t test_win; + ompi_info_t test_info; + ompi_file_t test_file; + size_t exp_offset, offset; + + /* Test Predefined communicator sizes */ + printf("ompi_predefined_communicator_t = %lu bytes\n", sizeof(ompi_predefined_communicator_t)); + printf("ompi_communicator_t = %lu bytes\n", sizeof(ompi_communicator_t)); + GAP_CHECK("c_base", test_comm, c_base, c_base, 0); + GAP_CHECK("c_lock", test_comm, c_lock, c_base, 1); + GAP_CHECK("c_name", test_comm, c_name, c_lock, 1); + GAP_CHECK("c_contextid", test_comm, c_contextid, c_name, 1); + GAP_CHECK("c_my_rank", test_comm, c_my_rank, c_contextid, 1); + GAP_CHECK("c_flags", test_comm, c_flags, c_my_rank, 1); + GAP_CHECK("c_id_available", test_comm, c_id_available, c_flags, 1); + GAP_CHECK("c_id_start_index", test_comm, c_id_start_index, c_id_available, 1); + GAP_CHECK("c_remote_group", test_comm, c_remote_group, c_local_group, 1); + GAP_CHECK("c_local_comm", test_comm, c_local_comm, c_remote_group, 1); + GAP_CHECK("c_keyhash", test_comm, c_keyhash, c_local_comm, 1); + GAP_CHECK("c_cube_dim", test_comm, c_cube_dim, c_keyhash, 1); + GAP_CHECK("c_topo_component", test_comm, c_topo_component, c_cube_dim, 1); + GAP_CHECK("c_topo", test_comm, c_topo, c_topo_component, 1); + GAP_CHECK("c_topo_comm", test_comm, c_topo_comm, c_topo, 1); + GAP_CHECK("c_topo_module", test_comm, c_topo_module, c_topo_comm, 1); + GAP_CHECK("c_f_to_c_index", test_comm, c_f_to_c_index, c_topo_module, 1); +#ifdef OMPI_WANT_PERUSE + GAP_CHECK("c_peruse_handles", test_comm, c_peruse_handles, c_f_to_c_index, 1); + GAP_CHECK("error_handler", test_comm, error_handler, c_peruse_handles, 1); +#else + GAP_CHECK("error_handler", test_comm, error_handler, c_f_to_c_index, 1); +#endif + GAP_CHECK("errhandler_type", test_comm, errhandler_type, error_handler, 1); + GAP_CHECK("c_pml_comm", test_comm, c_pml_comm, errhandler_type, 1); + GAP_CHECK("c_coll", test_comm, c_coll, c_pml_comm, 1); + + /* Test Predefined group sizes */ + printf("=============================================\n"); + printf("ompi_predefined_group_t = %lu bytes\n", sizeof(ompi_predefined_group_t)); + printf("ompi_group_t = %lu bytes\n", sizeof(ompi_group_t)); + GAP_CHECK("grp_proc_count", test_group, grp_proc_count, grp_proc_count, 0); + GAP_CHECK("grp_my_rank", test_group, grp_my_rank, grp_proc_count, 1); + GAP_CHECK("grp_f_to_c_index", test_group, grp_f_to_c_index, grp_my_rank, 1); + GAP_CHECK("grp_proc_pointers", test_group, grp_proc_pointers, grp_f_to_c_index, 1); + GAP_CHECK("grp_flags", test_group, grp_flags, grp_proc_pointers, 1); + GAP_CHECK("grp_parent_group_ptr", test_group, grp_parent_group_ptr, grp_flags, 1); + + /* Test Predefined request sizes */ + printf("=============================================\n"); + printf("ompi_predefined_request_t = %lu bytes\n", sizeof(ompi_predefined_request_t)); + printf("ompi_request_t = %lu bytes\n", sizeof(ompi_request_t)); + GAP_CHECK("super", test_req, super, super, 0); + GAP_CHECK("req_type", test_req, req_type, super, 1); + GAP_CHECK("req_status", test_req, req_status, req_type, 1); + GAP_CHECK("req_complete", test_req, req_complete, req_status, 1); + GAP_CHECK("req_state", test_req, req_state, req_complete, 1); + GAP_CHECK("req_persistent", test_req, req_persistent, req_state, 1); + GAP_CHECK("req_f_to_c_index", test_req, req_f_to_c_index, req_persistent, 1); + GAP_CHECK("req_free", test_req, req_free, req_f_to_c_index, 1); + + /* Test Predefined op sizes */ + printf("=============================================\n"); + printf("ompi_predefined_op_t = %lu bytes\n", sizeof(ompi_predefined_op_t)); + printf("ompi_op_t = %lu bytes\n", sizeof(ompi_op_t)); + GAP_CHECK("super", test_op, super, super, 0) + GAP_CHECK("o_name", test_op, o_name, super, 1) + GAP_CHECK("o_flags", test_op, o_flags, o_name, 1) + GAP_CHECK("o_f_to_c_index", test_op, o_f_to_c_index, o_flags, 1) + GAP_CHECK("o_func", test_op, o_func, o_f_to_c_index, 1) + GAP_CHECK("o_3buff_instrinsic", test_op, o_3buff_intrinsic, o_func, 1) + + /* Test Predefined datatype sizes */ + printf("=============================================\n"); + printf("ompi_predefined_datatype_t = %lu bytes\n", sizeof(ompi_predefined_datatype_t)); + printf("ompi_datatype_t = %lu bytes\n", sizeof(ompi_datatype_t)); + + /* Test Predefined win sizes */ + printf("=============================================\n"); + printf("ompi_predefined_win_t = %lu bytes\n", sizeof(ompi_predefined_win_t)); + printf("ompi_win_t = %lu bytes\n", sizeof(ompi_win_t)); + GAP_CHECK("w_base", test_win, w_base, w_base, 0); + GAP_CHECK("w_lock", test_win, w_lock, w_base, 1); + GAP_CHECK("w_name", test_win, w_name, w_lock, 1); + GAP_CHECK("w_group", test_win, w_group, w_name, 1); + GAP_CHECK("w_flags", test_win, w_flags, w_group, 1); + GAP_CHECK("w_keyhash", test_win, w_keyhash, w_flags, 1); + GAP_CHECK("w_f_to_c_index", test_win, w_f_to_c_index, w_keyhash, 1); + GAP_CHECK("error_handler", test_win, error_handler, w_f_to_c_index, 1); + GAP_CHECK("errhandler_type", test_win, errhandler_type, error_handler, 1); + GAP_CHECK("w_disp_unit", test_win, w_disp_unit, errhandler_type, 1); + GAP_CHECK("w_baseptr", test_win, w_baseptr, w_disp_unit, 1); + GAP_CHECK("w_size", test_win, w_size, w_baseptr, 1); + GAP_CHECK("w_mode", test_win, w_mode, w_size, 1); + GAP_CHECK("w_osc_module", test_win, w_osc_module, w_size, 1); + + /* Test Predefined info sizes */ + printf("=============================================\n"); + printf("ompi_predefined_info_t = %lu bytes\n", sizeof(ompi_predefined_info_t)); + printf("ompi_info_t = %lu bytes\n", sizeof(ompi_info_t)); + GAP_CHECK("super", test_info, super, super, 0); + GAP_CHECK("i_f_to_c_index", test_info, i_f_to_c_index, super, 1); + GAP_CHECK("i_lock", test_info, i_lock, i_f_to_c_index, 1); + GAP_CHECK("i_freed", test_info, i_freed, i_lock, 1); + + /* Test Predefined file sizes */ + printf("=============================================\n"); + printf("ompi_predefined_file_t = %lu bytes\n", sizeof(ompi_predefined_file_t)); + printf("ompi_file_t = %lu bytes\n", sizeof(ompi_file_t)); + GAP_CHECK("super", test_file, super, super, 0); + GAP_CHECK("f_comm", test_file, f_comm, super, 1); + GAP_CHECK("f_filename", test_file, f_filename, f_comm, 1); + GAP_CHECK("f_amode", test_file, f_amode, f_filename, 1); + GAP_CHECK("f_info", test_file, f_info, f_amode, 1); + GAP_CHECK("f_flags", test_file, f_flags, f_info, 1); + GAP_CHECK("f_f_to_c_index", test_file, f_f_to_c_index, f_flags, 1); + GAP_CHECK("error_handler", test_file, error_handler, f_f_to_c_index, 1); + GAP_CHECK("errhandler_type", test_file, errhandler_type, error_handler, 1); + GAP_CHECK("f_io_version", test_file, f_io_version, errhandler_type, 1); + GAP_CHECK("f_io_selected_component", test_file, f_io_selected_component, f_io_version, 1); + GAP_CHECK("f_io_selected_module", test_file, f_io_selected_module, f_io_selected_component, 1); + GAP_CHECK("f_io_selected_data", test_file, f_io_selected_data, f_io_selected_module, 1); + GAP_CHECK("f_io_requests", test_file, f_io_requests, f_io_selected_data, 1); + GAP_CHECK("f_io_requests_lock", test_file, f_io_requests_lock, f_io_requests, 1); + + return 0; +}