! -*- Mode: Fortran; -*-
!
! (C) 2008 by Argonne National Laboratory.
! See COPYRIGHT in top-level directory.
!
!
! To do: Create a keyval from c, then change the attribute from Fortran,
! then dup. The C attribute copy function should be passed a pointer to
! the Fortran attribute value (e.g., it should dereference it to check
! its value)
!
program main
use mpi
integer (kind=MPI_ADDRESS_KIND) val
integer ierr, errs, fcomm2_keyval, ftype2_keyval
integer ccomm2_keyval, ctype2_keyval, cwin2_keyval
integer callcount, delcount
integer (kind=MPI_ADDRESS_KIND) commextra, typeextra
common /myattr/ callcount, delcount
external mycopyfn, mydelfn, mytcopyfn, mytdelfn
callcount = 0
delcount = 0
errs = 0
call mpi_init(ierr)
commextra = 1001
call mpi_comm_create_keyval( mycopyfn, mydelfn, &
& fcomm2_keyval, commextra, ierr )
typeextra = 2001
call mpi_type_create_keyval( mytcopyfn, mytdelfn, &
ftype2_keyval, typeextra, ierr )
call chkckeyvals( ccomm2_keyval, ctype2_keyval, cwin2_keyval )
! Address-sized ints may be 32, 64, or something else in size;
! we can't assume any particular size. We can use the Fortran 90
! intrinsic range to determine the available size and compute
! a suitable value.
val = 5555
call mpi_comm_set_attr( MPI_COMM_WORLD, fcomm2_keyval, val, ierr )
call chkcomm2inc( fcomm2_keyval, 5555, errs )
call mpi_comm_free_keyval( fcomm2_keyval, ierr )
call mpi_type_free_keyval( ftype2_keyval, ierr )
call mpi_comm_free_keyval( ccomm2_keyval, ierr )
call mpi_type_free_keyval( ctype2_keyval, ierr )
call mpi_win_free_keyval( cwin2_keyval, ierr )
call mtest_finalize( errs )
end
!
subroutine mycopyfn( oldcomm, keyval, extrastate, valin, valout, &
& flag, ierr )
use mpi
integer oldcomm, keyval, ierr
integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
logical flag
integer callcount, delcount
common /myattr/ callcount, delcount
! increment the attribute by 2
valout = valin + 2
callcount = callcount + 1
if (extrastate .eq. 1001) then
flag = .true.
ierr = MPI_SUCCESS
else
print *, ' Unexpected value of extrastate = ', extrastate
flag = .false.
ierr = MPI_ERR_OTHER
endif
end
!
subroutine mydelfn( comm, keyval, val, extrastate, ierr )
use mpi
integer comm, keyval, ierr
integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
integer callcount, delcount
common /myattr/ callcount, delcount
delcount = delcount + 1
if (extrastate .eq. 1001) then
ierr = MPI_SUCCESS
else
print *, ' Unexpected value of extrastate = ', extrastate
ierr = MPI_ERR_OTHER
endif
end
!
subroutine mytcopyfn( oldtype, keyval, extrastate, valin, valout, &
& flag, ierr )
use mpi
integer oldtype, keyval, ierr
integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
logical flag
integer callcount, delcount
common /myattr/ callcount, delcount
! increment the attribute by 2
valout = valin + 2
callcount = callcount + 1
if (extrastate .eq. 2001) then
flag = .true.
ierr = MPI_SUCCESS
else
print *, ' Unexpected value of extrastate = ', extrastate
flag = .false.
ierr = MPI_ERR_OTHER
endif
end
!
subroutine mytdelfn( dtype, keyval, val, extrastate, ierr )
use mpi
integer dtype, keyval, ierr
integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
integer callcount, delcount
common /myattr/ callcount, delcount
delcount = delcount + 1
if (extrastate .eq. 2001) then
ierr = MPI_SUCCESS
else
print *, ' Unexpected value of extrastate = ', extrastate
ierr = MPI_ERR_OTHER
endif
end