1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ 2 /* 3 * Copyright (c) 2004-2010 The Trustees of Indiana University and Indiana 4 * University Research and Technology 5 * Corporation. All rights reserved. 6 * Copyright (c) 2004-2007 The University of Tennessee and The University 7 * of Tennessee Research Foundation. All rights 8 * reserved. 9 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, 10 * University of Stuttgart. All rights reserved. 11 * Copyright (c) 2004-2005 The Regents of the University of California. 12 * All rights reserved. 13 * Copyright (c) 2007-2017 Cisco Systems, Inc. All rights reserved 14 * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. 15 * Copyright (c) 2012-2015 Los Alamos National Security, LLC. All rights 16 * reserved. 17 * Copyright (c) 2016-2017 IBM Corporation. All rights reserved. 18 * $COPYRIGHT$ 19 * 20 * Additional copyrights may follow 21 * 22 * $HEADER$ 23 */ 24 25 #ifndef OMPI_INFO_H 26 #define OMPI_INFO_H 27 28 #include "ompi_config.h" 29 #include <string.h> 30 31 #include "mpi.h" 32 #include "opal/util/info.h" 33 #include "opal/class/opal_list.h" 34 #include "opal/class/opal_pointer_array.h" 35 #include "opal/threads/mutex.h" 36 37 #include "opal/mca/base/mca_base_var_enum.h" 38 39 40 struct ompi_info_t { 41 struct opal_info_t super; 42 /**< generic list pointer which is the container for (key,value) 43 pairs */ 44 int i_f_to_c_index; 45 /**< fortran handle for info. This is needed for translation from 46 fortran to C and vice versa */ 47 /**< Mutex for thread safety */ 48 bool i_freed; 49 /**< Whether this info has been freed or not */ 50 }; 51 typedef struct ompi_info_t ompi_info_t; 52 53 /** 54 * Padded struct to maintain back compatibiltiy. 55 * See ompi/communicator/communicator.h comments with struct ompi_communicator_t 56 * for full explanation why we chose the following padding construct for predefines. 57 */ 58 #define PREDEFINED_INFO_PAD 256 59 60 struct ompi_predefined_info_t { 61 struct ompi_info_t info; 62 char padding[PREDEFINED_INFO_PAD - sizeof(ompi_info_t)]; 63 }; 64 typedef struct ompi_predefined_info_t ompi_predefined_info_t; 65 66 BEGIN_C_DECLS 67 68 /** 69 * Global instance for MPI_INFO_NULL 70 */ 71 OMPI_DECLSPEC extern ompi_predefined_info_t ompi_mpi_info_null; 72 73 /** 74 * Symbol for Fortran 03 bindings to bind to 75 */ 76 OMPI_DECLSPEC extern ompi_predefined_info_t *ompi_mpi_info_null_addr; 77 78 /** 79 * \internal 80 * Some declarations needed to use OBJ_NEW and OBJ_DESTRUCT macros 81 */ 82 OMPI_DECLSPEC OBJ_CLASS_DECLARATION(ompi_info_t); 83 84 /** 85 * This function is invoked during ompi_mpi_init() and sets up 86 * MPI_Info handling. 87 */ 88 int ompi_mpiinfo_init(void); 89 90 /** 91 * This function is used to free a ompi level info 92 */ 93 int ompi_info_free (ompi_info_t **info); 94 95 96 /** 97 * This functions is called during ompi_mpi_finalize() and shuts 98 * down MPI_Info handling. 99 */ 100 int ompi_mpiinfo_finalize(void); 101 102 /** 103 * ompi_info_foo() wrapper around various opal_info_foo() calls 104 */ 105 OMPI_DECLSPEC int ompi_info_dup (ompi_info_t *info, ompi_info_t **newinfo); 106 /** 107 * ompi_info_foo() wrapper around various opal_info_foo() calls 108 */ 109 OMPI_DECLSPEC int ompi_info_dup_mpistandard (ompi_info_t *info, ompi_info_t **newinfo); 110 /** 111 * ompi_info_foo() wrapper around various opal_info_foo() calls 112 */ 113 OMPI_DECLSPEC int ompi_info_set (ompi_info_t *info, const char *key, const char *value); 114 /** 115 * ompi_info_foo() wrapper around various opal_info_foo() calls 116 */ 117 OMPI_DECLSPEC int ompi_info_set_value_enum (ompi_info_t *info, const char *key, int value, 118 mca_base_var_enum_t *var_enum); 119 /** 120 * ompi_info_foo() wrapper around various opal_info_foo() calls 121 */ 122 OMPI_DECLSPEC int ompi_info_get_bool (ompi_info_t *info, char *key, bool *value, int *flag); 123 /** 124 * ompi_info_foo() wrapper around various opal_info_foo() calls 125 */ 126 OMPI_DECLSPEC int ompi_info_get_value_enum (ompi_info_t *info, const char *key, 127 int *value, int default_value, 128 mca_base_var_enum_t *var_enum, int *flag); 129 /** 130 * ompi_info_foo() wrapper around various opal_info_foo() calls 131 */ 132 OMPI_DECLSPEC int ompi_info_get (ompi_info_t *info, const char *key, int valuelen, 133 char *value, int *flag); 134 /** 135 * ompi_info_foo() wrapper around various opal_info_foo() calls 136 */ 137 OMPI_DECLSPEC int ompi_info_delete (ompi_info_t *info, const char *key); 138 /** 139 * ompi_info_foo() wrapper around various opal_info_foo() calls 140 */ 141 OMPI_DECLSPEC int ompi_info_get_valuelen (ompi_info_t *info, const char *key, int *valuelen, 142 int *flag); 143 /** 144 * ompi_info_foo() wrapper around various opal_info_foo() calls 145 */ 146 OMPI_DECLSPEC int ompi_info_get_nthkey (ompi_info_t *info, int n, char *key); 147 /** 148 * ompi_info_foo() wrapper around various opal_info_foo() calls 149 */ 150 OMPI_DECLSPEC int ompi_info_value_to_bool(char *value, bool *interp); 151 /** 152 * ompi_info_foo() wrapper around various opal_info_foo() calls 153 */ 154 OMPI_DECLSPEC int ompi_info_get_nkeys(ompi_info_t *info, int *nkeys); 155 156 157 END_C_DECLS 158 159 /** 160 * Return whether this info has been freed already or not. 161 * 162 * @param info Pointer to opal_info_t object. 163 * 164 * @retval true If the info has already been freed 165 * @retval false If the info has not yet been freed 166 * 167 * If the info has been freed, return true. This will likely only 168 * happen in a reliable manner if opal_debug_handle_never_free is 169 * true, in which case an extra OBJ_RETAIN is set on the object during 170 * OBJ_NEW, meaning that the user will never be able to actually free 171 * the underlying object. It's a good way to find out if a process is 172 * unintentionally using a freed handle. 173 */ 174 static inline bool ompi_info_is_freed(ompi_info_t *info) 175 { 176 return info->i_freed; 177 } 178 179 180 181 #endif /* OMPI_INFO_H */