request_waitall Subroutine

private subroutine request_waitall(requests, statuses)

Blocks until all operations in the request array complete. All requests are freed after completion.

Arguments

Type IntentOptional Attributes Name
type(request_t), intent(inout) :: requests(:)
type(MPI_Status), intent(out), optional :: statuses(:)

Calls

proc~~request_waitall~~CallsGraph proc~request_waitall request_waitall mpi_waitall mpi_waitall proc~request_waitall->mpi_waitall

Called by

proc~~request_waitall~~CalledByGraph proc~request_waitall request_waitall interface~waitall waitall interface~waitall->proc~request_waitall proc~darray_get_dp darray_get_dp proc~darray_get_dp->interface~waitall proc~darray_get_i32 darray_get_i32 proc~darray_get_i32->interface~waitall proc~darray_get_i64 darray_get_i64 proc~darray_get_i64->interface~waitall proc~darray_get_sp darray_get_sp proc~darray_get_sp->interface~waitall proc~darray_put_dp darray_put_dp proc~darray_put_dp->interface~waitall proc~darray_put_i32 darray_put_i32 proc~darray_put_i32->interface~waitall proc~darray_put_i64 darray_put_i64 proc~darray_put_i64->interface~waitall proc~darray_put_sp darray_put_sp proc~darray_put_sp->interface~waitall interface~darray_get darray_get interface~darray_get->proc~darray_get_dp interface~darray_get->proc~darray_get_i32 interface~darray_get->proc~darray_get_i64 interface~darray_get->proc~darray_get_sp interface~darray_put darray_put interface~darray_put->proc~darray_put_dp interface~darray_put->proc~darray_put_i32 interface~darray_put->proc~darray_put_i64 interface~darray_put->proc~darray_put_sp

Variables

Type Visibility Attributes Name Initial
integer(kind=int32), private :: count
integer(kind=int32), private :: i
integer(kind=int32), private :: ierr
type(MPI_Request), private, allocatable :: mpi_requests(:)
type(MPI_Status), private, allocatable :: temp_statuses(:)

Source Code

   subroutine request_waitall(requests, statuses)
   !! Blocks until all operations in the request array complete.
   !! All requests are freed after completion.
      type(request_t), intent(inout) :: requests(:)
      type(MPI_Status), intent(out), optional :: statuses(:)
      type(MPI_Request), allocatable :: mpi_requests(:)
      type(MPI_Status), allocatable :: temp_statuses(:)
      integer(int32) :: i, count, ierr

      count = size(requests)
      allocate (mpi_requests(count))

      do i = 1, count
         if (requests(i)%is_valid) then
            mpi_requests(i) = requests(i)%m_request
         else
            mpi_requests(i) = MPI_REQUEST_NULL
         end if
      end do

      if (present(statuses)) then
         call MPI_Waitall(count, mpi_requests, statuses, ierr)
      else
         allocate (temp_statuses(count))
         call MPI_Waitall(count, mpi_requests, temp_statuses, ierr)
      end if

      do i = 1, count
         call requests(i)%free()
      end do
   end subroutine request_waitall