source: trunk/signal-checkpoint/signal_checkpoint.F90 @ 63

Last change on this file since 63 was 63, checked in by g7moreau, 12 years ago
  • Samll format change...
File size: 2.5 KB
RevLine 
[62]1!--------------------------------------------------------------!
2! 2012/04/20 (C) Gabriel Moreau
3! Licence LGPLv2 or letter
4!--------------------------------------------------------------!
5
6
7
8module Signal_Checkpoint
9
10#ifdef __INTEL_COMPILER
11use IFPORT, only: signal
12#endif
13
14implicit none
15private
16
17integer, external :: signal_checkpoint_trap_callback_intel_
18external          :: signal_checkpoint_trap_callback_gfortran_
19
20#ifdef __GNUC__
21intrinsic signal
22#endif
23
24integer, parameter :: SIGUSR2 = 12    ! Signal USR2
25
26integer, public :: INTERNAL_RECEIVED_COUNT_ = 0  ! Global Counter
27
28!public :: INTERNAL_RECEIVED_COUNT_  ! Public only for trap procedure
29
30public :: SIGUSR2
31public :: signal_checkpoint_connect
32public :: signal_checkpoint_is_received
33public :: signal_checkpoint_received_times
34
35!--------------------------------------------------------------!
36contains
37!--------------------------------------------------------------!
38
39!--------------------------------------------------------------!
40subroutine signal_checkpoint_connect (SIG_NUM)
[63]41   integer, intent(in) :: SIG_NUM
[62]42
43#ifdef __INTEL_COMPILER
[63]44   integer :: ERR
[62]45     
[63]46   ERR = signal(SIG_NUM, signal_checkpoint_trap_callback_intel_, -1)
[62]47#endif
48#ifdef __GNUC__
[63]49   call signal(SIG_NUM, signal_checkpoint_trap_callback_gfortran_)
[62]50#endif
51
52end subroutine
53
54!--------------------------------------------------------------!
55function signal_checkpoint_is_received () result (IS_RECEIVED)
56   logical :: IS_RECEIVED
57
58   IS_RECEIVED = (INTERNAL_RECEIVED_COUNT_ > 0)
59end function
60
61!--------------------------------------------------------------!
62function signal_checkpoint_received_times () result (RECEIVED_TIMES)
63   integer :: RECEIVED_TIMES
64
65   RECEIVED_TIMES = INTERNAL_RECEIVED_COUNT_
66end function
67
68!--------------------------------------------------------------!
69end module
70!--------------------------------------------------------------!
71
72
73!--------------------------------------------------------------!
74! Internal trap procedure and function
75! Must be external to be C compatible
76!--------------------------------------------------------------!
77
78subroutine signal_checkpoint_trap_callback_gfortran_ (SIG_NUM)
[63]79   use Signal_Checkpoint
80   integer, intent(in) :: SIG_NUM
[62]81
[63]82   INTERNAL_RECEIVED_COUNT_ = INTERNAL_RECEIVED_COUNT_ + 1
[62]83end subroutine
84
85function signal_checkpoint_trap_callback_intel_ (SIG_NUM) result (ONE)
[63]86   use Signal_Checkpoint
87   integer, intent(in) :: SIG_NUM
88   integer :: ONE
[62]89
[63]90   INTERNAL_RECEIVED_COUNT_ = INTERNAL_RECEIVED_COUNT_ + 1
91   ONE = 1
[62]92end
Note: See TracBrowser for help on using the repository browser.