!--------------------------------------------------------------! ! 2012/04/20 (C) Gabriel Moreau ! Licence LGPLv2 or letter !--------------------------------------------------------------! module Signal_Checkpoint #ifdef __INTEL_COMPILER use IFPORT, only: signal #endif implicit none private integer, external :: signal_checkpoint_trap_callback_intel_ external :: signal_checkpoint_trap_callback_gfortran_ integer, parameter :: SIGUSR2 = 12 ! Signal USR2 ! False public, only for trap procedure integer, public :: INTERNAL_RECEIVED_COUNT_ = 0 ! Global Counter public :: SIGUSR2 public :: signal_checkpoint_connect public :: signal_checkpoint_is_received public :: signal_checkpoint_received_times !--------------------------------------------------------------! contains !--------------------------------------------------------------! subroutine signal_checkpoint_connect (SIG_NUM) integer, intent(in) :: SIG_NUM #ifdef __INTEL_COMPILER integer :: ERR ERR = signal(SIG_NUM, signal_checkpoint_trap_callback_intel_, -1) #endif #ifdef __GNUC__ intrinsic signal call signal(SIG_NUM, signal_checkpoint_trap_callback_gfortran_) #endif end subroutine !--------------------------------------------------------------! function signal_checkpoint_is_received () result (IS_RECEIVED) logical :: IS_RECEIVED IS_RECEIVED = (INTERNAL_RECEIVED_COUNT_ > 0) end function !--------------------------------------------------------------! function signal_checkpoint_received_times () result (RECEIVED_TIMES) integer :: RECEIVED_TIMES RECEIVED_TIMES = INTERNAL_RECEIVED_COUNT_ end function !--------------------------------------------------------------! end module !--------------------------------------------------------------! !--------------------------------------------------------------! ! Internal trap procedure and function ! Must be external to be C compatible !--------------------------------------------------------------! subroutine signal_checkpoint_trap_callback_gfortran_ (SIG_NUM) use Signal_Checkpoint integer, intent(in) :: SIG_NUM INTERNAL_RECEIVED_COUNT_ = INTERNAL_RECEIVED_COUNT_ + 1 end subroutine !--------------------------------------------------------------! function signal_checkpoint_trap_callback_intel_ (SIG_NUM) result (ONE) use Signal_Checkpoint integer, intent(in) :: SIG_NUM integer :: ONE INTERNAL_RECEIVED_COUNT_ = INTERNAL_RECEIVED_COUNT_ + 1 ONE = 1 end !--------------------------------------------------------------! !--------------------------------------------------------------!