The main documentation of the Finalize_Trace Procedure contains additional explanation of this code listing.
subroutine Finalize_Trace (Trace, status)
! Input/Output variable.
! Trace to be finalized.
type(Trace_type), intent(inout) :: Trace
! Output variable.
type(Status_type), intent(out), optional :: status ! Exit status.
! Internal variables.
type(Status_type), dimension(3) :: deallocate_status ! Deallocation Status.
type(Status_type) :: consolidated_status ! Consolidated Status.
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Verify requirements.
VERIFY(Valid_State(Trace),7) ! Trace is valid.
! Unset initialization flag.
call Finalize (Trace%Initialized)
! Set deallocation status.
call Initialize (deallocate_status)
call Initialize (consolidated_status)
! PGSLib Trace deallocation.
ifdef([USE_PGSLIB],[
call PGSLib_Deallocate_Trace (Trace%Trace)
])
! Finalize internals.
select case (Trace%Dimensionality)
case (1)
call Finalize (Trace%Index1, deallocate_status(1))
call Finalize (Trace%Mask1, deallocate_status(2))
case (2)
call Finalize (Trace%Index2, deallocate_status(1))
call Finalize (Trace%Mask2, deallocate_status(2))
end select
call Finalize (Trace%Dimensionality, deallocate_status(3))
! Process status variables.
consolidated_status = deallocate_status
if (PRESENT(status)) then
WARN_IF(Error(consolidated_status), 5)
status = consolidated_status
else
VERIFY(Normal(consolidated_status), 5)
end if
call Finalize (consolidated_status)
call Finalize (deallocate_status)
! Verify guarantees.
VERIFY(.not.Valid_State(Trace),7) ! Trace is not valid.
return
end subroutine Finalize_Trace