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

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