This source file includes following definitions.
- ompi_attr_create_predefined
- ompi_attr_free_predefined
- create_comm
- free_comm
- create_win
- free_win
- set_f
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 
  28 
  29 
  30 
  31 
  32 
  33 
  34 
  35 
  36 
  37 
  38 
  39 
  40 
  41 
  42 
  43 
  44 
  45 
  46 
  47 
  48 
  49 
  50 
  51 
  52 
  53 
  54 
  55 
  56 
  57 
  58 
  59 
  60 
  61 
  62 
  63 
  64 
  65 
  66 
  67 
  68 
  69 
  70 
  71 
  72 
  73 
  74 
  75 
  76 
  77 
  78 
  79 #include "ompi_config.h"
  80 
  81 #include <stdlib.h>
  82 
  83 #include "mpi.h"
  84 
  85 #include "ompi/attribute/attribute.h"
  86 
  87 #include "ompi/errhandler/errcode.h"
  88 #include "ompi/communicator/communicator.h"
  89 #include "ompi/mca/pml/pml.h"
  90 
  91 
  92 
  93 
  94 static int create_comm(int target_keyval, bool want_inherit);
  95 static int free_comm(int keyval);
  96 
  97 static int create_win(int target_keyval);
  98 static int free_win(int keyval);
  99 
 100 static int set_f(int keyval, MPI_Fint value);
 101 
 102 
 103 int ompi_attr_create_predefined(void)
 104 {
 105     int ret;
 106     char *univ_size;
 107     int usize;
 108 
 109     
 110 
 111     
 112 
 113 
 114 
 115     if (OMPI_SUCCESS != (ret = create_comm(MPI_TAG_UB, true)) ||
 116         OMPI_SUCCESS != (ret = create_comm(MPI_HOST, true)) ||
 117         OMPI_SUCCESS != (ret = create_comm(MPI_IO, true)) ||
 118         OMPI_SUCCESS != (ret = create_comm(MPI_WTIME_IS_GLOBAL, true)) ||
 119         OMPI_SUCCESS != (ret = create_comm(MPI_APPNUM, true)) ||
 120         OMPI_SUCCESS != (ret = create_comm(MPI_LASTUSEDCODE, false)) ||
 121         OMPI_SUCCESS != (ret = create_comm(MPI_UNIVERSE_SIZE, true)) ||
 122         OMPI_SUCCESS != (ret = create_win(MPI_WIN_BASE)) ||
 123         OMPI_SUCCESS != (ret = create_win(MPI_WIN_SIZE)) ||
 124         OMPI_SUCCESS != (ret = create_win(MPI_WIN_DISP_UNIT)) ||
 125         OMPI_SUCCESS != (ret = create_win(MPI_WIN_CREATE_FLAVOR)) ||
 126         OMPI_SUCCESS != (ret = create_win(MPI_WIN_MODEL))) {
 127         return ret;
 128     }
 129 
 130     
 131 
 132     if (OMPI_SUCCESS != (ret = set_f(MPI_TAG_UB, mca_pml.pml_max_tag)) ||
 133         OMPI_SUCCESS != (ret = set_f(MPI_HOST, MPI_PROC_NULL)) ||
 134         OMPI_SUCCESS != (ret = set_f(MPI_IO, MPI_ANY_SOURCE)) ||
 135         OMPI_SUCCESS != (ret = set_f(MPI_WTIME_IS_GLOBAL, 0)) ||
 136         OMPI_SUCCESS != (ret = set_f(MPI_LASTUSEDCODE,
 137                                      ompi_mpi_errcode_lastused))) {
 138         return ret;
 139     }
 140 
 141     
 142 
 143     univ_size = getenv("OMPI_UNIVERSE_SIZE");
 144     if (NULL == univ_size || (usize = strtol(univ_size, NULL, 0)) <= 0) {
 145         ret = set_f(MPI_UNIVERSE_SIZE, ompi_comm_size(MPI_COMM_WORLD));
 146     } else {
 147         ret = set_f(MPI_UNIVERSE_SIZE, usize);
 148     }
 149     if (OMPI_SUCCESS != ret) {
 150         return ret;
 151     }
 152 
 153     ret = set_f(MPI_APPNUM, ompi_process_info.app_num);
 154 
 155     return ret;
 156 }
 157 
 158 
 159 int ompi_attr_free_predefined(void)
 160 {
 161     int ret;
 162 
 163     if (OMPI_SUCCESS != (ret = free_comm(MPI_TAG_UB)) ||
 164         OMPI_SUCCESS != (ret = free_comm(MPI_HOST)) ||
 165         OMPI_SUCCESS != (ret = free_comm(MPI_IO)) ||
 166         OMPI_SUCCESS != (ret = free_comm(MPI_WTIME_IS_GLOBAL)) ||
 167         OMPI_SUCCESS != (ret = free_comm(MPI_APPNUM)) ||
 168         OMPI_SUCCESS != (ret = free_comm(MPI_LASTUSEDCODE)) ||
 169         OMPI_SUCCESS != (ret = free_comm(MPI_UNIVERSE_SIZE)) ||
 170         OMPI_SUCCESS != (ret = free_win(MPI_WIN_BASE)) ||
 171         OMPI_SUCCESS != (ret = free_win(MPI_WIN_SIZE)) ||
 172         OMPI_SUCCESS != (ret = free_win(MPI_WIN_DISP_UNIT)) ||
 173         OMPI_SUCCESS != (ret = free_win(MPI_WIN_CREATE_FLAVOR)) ||
 174         OMPI_SUCCESS != (ret = free_win(MPI_WIN_MODEL))) {
 175         return ret;
 176     }
 177     return OMPI_SUCCESS;
 178 }
 179 
 180 
 181 static int create_comm(int target_keyval, bool want_inherit)
 182 {
 183     int err;
 184     int keyval;
 185     ompi_attribute_fn_ptr_union_t copy;
 186     ompi_attribute_fn_ptr_union_t del;
 187 
 188     keyval = -1;
 189     copy.attr_communicator_copy_fn = (MPI_Comm_internal_copy_attr_function*)
 190         (want_inherit ? MPI_COMM_DUP_FN : MPI_COMM_NULL_COPY_FN);
 191     del.attr_communicator_delete_fn = MPI_COMM_NULL_DELETE_FN;
 192     err = ompi_attr_create_keyval(COMM_ATTR, copy, del,
 193                                   &keyval, NULL, OMPI_KEYVAL_PREDEFINED, NULL);
 194     if (MPI_SUCCESS != err) {
 195         return err;
 196     }
 197     if (target_keyval != keyval) {
 198         return OMPI_ERR_BAD_PARAM;
 199     }
 200     return OMPI_SUCCESS;
 201 }
 202 
 203 
 204 static int free_comm(int keyval)
 205 {
 206   int key = keyval;
 207   return ompi_attr_free_keyval (COMM_ATTR, &key, true);
 208 }
 209 
 210 
 211 static int create_win(int target_keyval)
 212 {
 213     int err;
 214     int keyval;
 215     ompi_attribute_fn_ptr_union_t copy;
 216     ompi_attribute_fn_ptr_union_t del;
 217 
 218     keyval = -1;
 219     copy.attr_win_copy_fn = (MPI_Win_internal_copy_attr_function*)MPI_WIN_NULL_COPY_FN;
 220     del.attr_win_delete_fn = MPI_WIN_NULL_DELETE_FN;
 221     err = ompi_attr_create_keyval(WIN_ATTR, copy, del,
 222                                   &keyval, NULL, OMPI_KEYVAL_PREDEFINED, NULL);
 223     if (MPI_SUCCESS != err) {
 224         return err;
 225     }
 226     if (target_keyval != keyval) {
 227         return OMPI_ERR_BAD_PARAM;
 228     }
 229     return OMPI_SUCCESS;
 230 }
 231 
 232 
 233 static int free_win(int keyval)
 234 {
 235   int key = keyval;
 236   return ompi_attr_free_keyval (WIN_ATTR, &key, true);
 237 }
 238 
 239 
 240 static int set_f(int keyval, MPI_Fint value)
 241 {
 242     return ompi_attr_set_fint(COMM_ATTR, MPI_COMM_WORLD,
 243                               &MPI_COMM_WORLD->c_keyhash,
 244                               keyval, value,
 245                               true);
 246 }