This source file includes following definitions.
- ompi_errhandler_invoke
- ompi_errhandler_request_invoke
   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 #include "ompi_config.h"
  27 
  28 #include "ompi/communicator/communicator.h"
  29 #include "ompi/win/win.h"
  30 #include "ompi/file/file.h"
  31 #include "ompi/request/request.h"
  32 #include "ompi/errhandler/errhandler.h"
  33 #include "ompi/mpi/fortran/base/fint_2_int.h"
  34 
  35 
  36 int ompi_errhandler_invoke(ompi_errhandler_t *errhandler, void *mpi_object,
  37                            int object_type, int err_code, const char *message)
  38 {
  39     MPI_Fint fortran_handle, fortran_err_code = OMPI_INT_2_FINT(err_code);
  40     ompi_communicator_t *comm;
  41     ompi_win_t *win;
  42     ompi_file_t *file;
  43 
  44     
  45     if (NULL == errhandler) {
  46         ompi_mpi_errors_are_fatal_comm_handler(NULL, NULL, message);
  47         return err_code;
  48     }
  49 
  50     
  51 
  52 
  53     switch (object_type) {
  54     case OMPI_ERRHANDLER_TYPE_COMM:
  55         comm = (ompi_communicator_t *) mpi_object;
  56         switch (errhandler->eh_lang) {
  57         case OMPI_ERRHANDLER_LANG_C:
  58             errhandler->eh_comm_fn(&comm, &err_code, message, NULL);
  59             break;
  60 
  61         case OMPI_ERRHANDLER_LANG_CXX:
  62             errhandler->eh_cxx_dispatch_fn(&comm, &err_code, message,
  63                                            (ompi_errhandler_generic_handler_fn_t *)errhandler->eh_comm_fn);
  64             break;
  65 
  66         case OMPI_ERRHANDLER_LANG_FORTRAN:
  67             fortran_handle = OMPI_INT_2_FINT(comm->c_f_to_c_index);
  68             errhandler->eh_fort_fn(&fortran_handle, &fortran_err_code);
  69             err_code = OMPI_FINT_2_INT(fortran_err_code);
  70             break;
  71         }
  72         break;
  73 
  74     case OMPI_ERRHANDLER_TYPE_WIN:
  75         win = (ompi_win_t *) mpi_object;
  76         switch (errhandler->eh_lang) {
  77         case OMPI_ERRHANDLER_LANG_C:
  78             errhandler->eh_win_fn(&win, &err_code, message, NULL);
  79             break;
  80 
  81         case OMPI_ERRHANDLER_LANG_CXX:
  82             errhandler->eh_cxx_dispatch_fn(&win, &err_code, message,
  83                                            (ompi_errhandler_generic_handler_fn_t *)errhandler->eh_win_fn);
  84             break;
  85 
  86         case OMPI_ERRHANDLER_LANG_FORTRAN:
  87             fortran_handle = OMPI_INT_2_FINT(win->w_f_to_c_index);
  88             errhandler->eh_fort_fn(&fortran_handle, &fortran_err_code);
  89             err_code = OMPI_FINT_2_INT(fortran_err_code);
  90             break;
  91         }
  92         break;
  93 
  94     case OMPI_ERRHANDLER_TYPE_FILE:
  95         file = (ompi_file_t *) mpi_object;
  96         switch (errhandler->eh_lang) {
  97         case OMPI_ERRHANDLER_LANG_C:
  98             errhandler->eh_file_fn(&file, &err_code, message, NULL);
  99             break;
 100 
 101         case OMPI_ERRHANDLER_LANG_CXX:
 102             errhandler->eh_cxx_dispatch_fn(&file, &err_code, message,
 103                                            (ompi_errhandler_generic_handler_fn_t *)errhandler->eh_file_fn);
 104             break;
 105 
 106         case OMPI_ERRHANDLER_LANG_FORTRAN:
 107             fortran_handle = OMPI_INT_2_FINT(file->f_f_to_c_index);
 108             errhandler->eh_fort_fn(&fortran_handle, &fortran_err_code);
 109             err_code = OMPI_FINT_2_INT(fortran_err_code);
 110             break;
 111         }
 112         break;
 113     }
 114 
 115     
 116     return err_code;
 117 }
 118 
 119 
 120 int ompi_errhandler_request_invoke(int count,
 121                                    struct ompi_request_t **requests,
 122                                    const char *message)
 123 {
 124     int i, ec, type;
 125     ompi_mpi_object_t mpi_object;
 126 
 127     
 128 
 129 
 130 
 131 
 132     for (i = 0; i < count; ++i) {
 133         if (MPI_REQUEST_NULL != requests[i] &&
 134             MPI_SUCCESS != requests[i]->req_status.MPI_ERROR) {
 135             break;
 136         }
 137     }
 138     
 139     if (i >= count) {
 140         return MPI_SUCCESS;
 141     }
 142 
 143     ec = ompi_errcode_get_mpi_code(requests[i]->req_status.MPI_ERROR);
 144     mpi_object = requests[i]->req_mpi_object;
 145     type = requests[i]->req_type;
 146 
 147     
 148 
 149 
 150 
 151     for (; i < count; ++i) {
 152         if (MPI_REQUEST_NULL != requests[i] &&
 153             MPI_SUCCESS != requests[i]->req_status.MPI_ERROR) {
 154             
 155 
 156             ompi_request_free(&(requests[i]));
 157         }
 158     }
 159 
 160     
 161     switch (type) {
 162     case OMPI_REQUEST_PML:
 163     case OMPI_REQUEST_COLL:
 164         return ompi_errhandler_invoke(mpi_object.comm->error_handler,
 165                                       mpi_object.comm,
 166                                       mpi_object.comm->errhandler_type,
 167                                       ec, message);
 168         break;
 169     case OMPI_REQUEST_IO:
 170         return ompi_errhandler_invoke(mpi_object.file->error_handler,
 171                                       mpi_object.file,
 172                                       mpi_object.file->errhandler_type,
 173                                       ec, message);
 174         break;
 175     case OMPI_REQUEST_WIN:
 176         return ompi_errhandler_invoke(mpi_object.win->error_handler,
 177                                       mpi_object.win,
 178                                       mpi_object.win->errhandler_type,
 179                                       ec, message);
 180         break;
 181     default:
 182         
 183         return ompi_errhandler_invoke(MPI_COMM_WORLD->error_handler,
 184                                       MPI_COMM_WORLD,
 185                                       MPI_COMM_WORLD->errhandler_type,
 186                                       ec, message);
 187         break;
 188     }
 189 }