Blame test/mpi/f90/attr/fandcattrf90.f90

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