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

Last change on this file since 62 was 62, checked in by g7moreau, 12 years ago
  • Add Signal_Checkpoint Fortran90 module project
File size: 2.5 KB
Line 
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)
41        integer, intent(in) :: SIG_NUM
42
43#ifdef __INTEL_COMPILER
44        integer :: ERR
45     
46        ERR = signal(SIG_NUM, signal_checkpoint_trap_callback_intel_, -1)
47#endif
48#ifdef __GNUC__
49        call signal(SIG_NUM, signal_checkpoint_trap_callback_gfortran_)
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)
79        use Signal_Checkpoint
80        integer, intent(in) :: SIG_NUM
81
82        INTERNAL_RECEIVED_COUNT_ = INTERNAL_RECEIVED_COUNT_ + 1
83end subroutine
84
85function signal_checkpoint_trap_callback_intel_ (SIG_NUM) result (ONE)
86        use Signal_Checkpoint
87        integer, intent(in) :: SIG_NUM
88        integer :: ONE
89
90        INTERNAL_RECEIVED_COUNT_ = INTERNAL_RECEIVED_COUNT_ + 1
91        ONE = 1
92end
Note: See TracBrowser for help on using the repository browser.