static int config_window(void *base, size_t size, int disp_unit, int flavor, int model, ompi_win_t *win) { int ret; ret = ompi_attr_set_c(WIN_ATTR, win, &win->w_keyhash, MPI_WIN_BASE, base, true); if (OMPI_SUCCESS != ret) return ret; ret = ompi_attr_set_fortran_mpi2(WIN_ATTR, win, &win->w_keyhash, MPI_WIN_SIZE, size, true); if (OMPI_SUCCESS != ret) return ret; ret = ompi_attr_set_fortran_mpi2(WIN_ATTR, win, &win->w_keyhash, MPI_WIN_DISP_UNIT, disp_unit, true); if (OMPI_SUCCESS != ret) return ret; ret = ompi_attr_set_fortran_mpi2(WIN_ATTR, win, &win->w_keyhash, MPI_WIN_CREATE_FLAVOR, flavor, true); if (OMPI_SUCCESS != ret) return ret; ret = ompi_attr_set_fortran_mpi2(WIN_ATTR, win, &win->w_keyhash, MPI_WIN_MODEL, model, true); if (OMPI_SUCCESS != ret) return ret; win->w_f_to_c_index = opal_pointer_array_add(&ompi_mpi_windows, win); if (-1 == win->w_f_to_c_index) return OMPI_ERR_OUT_OF_RESOURCE; return OMPI_SUCCESS; }
void mpi_type_set_attr_f(MPI_Fint *type, MPI_Fint *type_keyval, MPI_Aint *attribute_val, MPI_Fint *ierr) { int c_err; MPI_Datatype c_type = MPI_Type_f2c(*type); /* This stuff is very confusing. Be sure to see the comment at the top of src/attributes/attributes.c. */ c_err = ompi_attr_set_fortran_mpi2(TYPE_ATTR, c_type, &c_type->d_keyhash, OMPI_FINT_2_INT(*type_keyval), *attribute_val, false, true); *ierr = OMPI_INT_2_FINT(c_err); }
void mpi_win_set_attr_f(MPI_Fint *win, MPI_Fint *win_keyval, MPI_Aint *attribute_val, MPI_Fint *ierr) { int c_err; MPI_Win c_win = MPI_Win_f2c(*win); /* This stuff is very confusing. Be sure to see the comment at the top of src/attributes/attributes.c. */ c_err = ompi_attr_set_fortran_mpi2(WIN_ATTR, c_win, &c_win->w_keyhash, OMPI_FINT_2_INT(*win_keyval), *attribute_val, false); *ierr = OMPI_INT_2_FINT(c_err); }
void mpi_comm_set_attr_f(MPI_Fint *comm, MPI_Fint *comm_keyval, MPI_Aint *attribute_val, MPI_Fint *ierr) { int c_err; MPI_Comm c_comm = MPI_Comm_f2c(*comm); /* This stuff is very confusing. Be sure to see the comment at the top of src/attributes/attributes.c. */ c_err = ompi_attr_set_fortran_mpi2(COMM_ATTR, c_comm, &c_comm->c_keyhash, OMPI_FINT_2_INT(*comm_keyval), *attribute_val, false, true); *ierr = OMPI_INT_2_FINT(c_err); }
int ompi_win_create(void *base, size_t size, int disp_unit, ompi_communicator_t *comm, ompi_info_t *info, ompi_win_t** newwin) { ompi_win_t *win; ompi_group_t *group; int ret; /* create the object */ win = OBJ_NEW(ompi_win_t); if (NULL == win) return OMPI_ERR_TEMP_OUT_OF_RESOURCE; /* setup data that is independent of osc component */ group = comm->c_local_group; OBJ_RETAIN(group); ompi_group_increment_proc_count(group); win->w_group = group; win->w_baseptr = base; win->w_size = size; win->w_disp_unit = disp_unit; /* Fill in required attributes */ ret = ompi_attr_set_c(WIN_ATTR, win, &win->w_keyhash, MPI_WIN_BASE, win->w_baseptr, true, true); if (OMPI_SUCCESS != ret) { OBJ_RELEASE(win); return ret; } ret = ompi_attr_set_fortran_mpi2(WIN_ATTR, win, &win->w_keyhash, MPI_WIN_SIZE, win->w_size, true, true); if (OMPI_SUCCESS != ret) { OBJ_RELEASE(win); return ret; } ret = ompi_attr_set_fortran_mpi2(WIN_ATTR, win, &win->w_keyhash, MPI_WIN_DISP_UNIT, win->w_disp_unit, true, true); if (OMPI_SUCCESS != ret) { OBJ_RELEASE(win); return ret; } /* create backend onesided module for this window */ ret = ompi_osc_base_select(win, (ompi_info_t*) info, comm); if (OMPI_SUCCESS != ret) { OBJ_RELEASE(win); return ret; } /* fill in Fortran index */ win->w_f_to_c_index = ompi_pointer_array_add(&ompi_mpi_windows, win); if (-1 == win->w_f_to_c_index) { ompi_win_free(win); return OMPI_ERR_OUT_OF_RESOURCE; } *newwin = win; return OMPI_SUCCESS; }