65b95e2844
Use type(c_funptr) to "cast" the fortran function pointers to arbitrary C pointers. In C, we then pick up the appropriate function pointer type. Tested with ifort 14.0.2 and gfortran 4.9 snapshot (which is what identified that the previous method of passing function pointers was not Fortran'08-compliant). Refs trac:4157 This commit was SVN r31371. The following Trac tickets were found above: Ticket 4157 --> https://svn.open-mpi.org/trac/ompi/ticket/4157
36 строки
1.5 KiB
Fortran
36 строки
1.5 KiB
Fortran
! -*- f90 -*-
|
|
!
|
|
! Copyright (c) 2010-2012 Cisco Systems, Inc. All rights reserved.
|
|
! Copyright (c) 2009-2012 Los Alamos National Security, LLC.
|
|
! All Rights reserved.
|
|
! $COPYRIGHT$
|
|
|
|
#include "ompi/mpi/fortran/configure-fortran-output.h"
|
|
|
|
subroutine MPI_Grequest_start_f08(query_fn,free_fn,cancel_fn,&
|
|
extra_state,request,ierror)
|
|
use, intrinsic :: iso_c_binding, only: c_funptr, c_funloc
|
|
use :: mpi_f08_types, only : MPI_Request, MPI_ADDRESS_KIND
|
|
use :: mpi_f08_interfaces_callbacks, only : MPI_Grequest_query_function
|
|
use :: mpi_f08_interfaces_callbacks, only : MPI_Grequest_free_function
|
|
use :: mpi_f08_interfaces_callbacks, only : MPI_Grequest_cancel_function
|
|
use :: mpi_f08, only : ompi_grequest_start_f
|
|
implicit none
|
|
OMPI_PROCEDURE(MPI_Grequest_query_function) :: query_fn
|
|
OMPI_PROCEDURE(MPI_Grequest_free_function) :: free_fn
|
|
OMPI_PROCEDURE(MPI_Grequest_cancel_function) :: cancel_fn
|
|
INTEGER(MPI_ADDRESS_KIND), INTENT(IN) :: extra_state
|
|
TYPE(MPI_Request), INTENT(OUT) :: request
|
|
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
|
integer :: c_ierror
|
|
type(c_funptr) :: fquery_fn, ffree_fn, fcancel_fn
|
|
|
|
fquery_fn = c_funloc(query_fn)
|
|
ffree_fn = c_funloc(free_fn)
|
|
fcancel_fn = c_funloc(cancel_fn)
|
|
call ompi_grequest_start_f(fquery_fn,ffree_fn,fcancel_fn,&
|
|
extra_state,request%MPI_VAL,c_ierror)
|
|
if (present(ierror)) ierror = c_ierror
|
|
|
|
end subroutine MPI_Grequest_start_f08
|