/[MITgcm]/MITgcm/eesupp/src/check_threads.F
ViewVC logotype

Contents of /MITgcm/eesupp/src/check_threads.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.11 - (show annotations) (download)
Tue Nov 11 20:38:26 2003 UTC (20 years, 7 months ago) by edhill
Branch: MAIN
Changes since 1.10: +1 -5 lines
 o add various compilation tests to genmake2 so that it acts more
   like a typical autoconf-generated "./configure" script:
   - HAVE_SYSTEM
   - HAVE_FDATE
   - FC_NAMEMANGLE.h
 o small code modifications to use the above #define-s

1 C $Header: /u/u3/gcmpack/MITgcm/eesupp/src/check_threads.F,v 1.10 2001/09/21 03:54:34 cnh Exp $
2 C $Name: $
3
4 #include "CPP_EEOPTIONS.h"
5 #define HAVE_SYSTEM
6
7 CBOP
8 C !ROUTINE: CHECK_THREADS
9
10 C !INTERFACE:
11 SUBROUTINE CHECK_THREADS( myThid )
12 IMPLICIT NONE
13
14 C !DESCRIPTION:
15 C *==========================================================
16 C | SUBROUTINE CHECK_THREADS
17 C | o Check that all the threads we need did indeed start.
18 C *==========================================================
19 C | This routine is called during the initialisation phase
20 C | to check whether all the threads have started.
21 C | It is invoked by every thread and if any thread finds an
22 C | error it should set its error flag.
23 C | Notes:
24 C | Different mechanisms may be required on different
25 C | platforms to actually perform the check. For example as
26 C | coded here each thread checks for a semaphore set by the
27 C | other threads to see if they are running.
28 C | It is also possible for a system to schedule threads
29 C | sequentially, unless some system call is made to yield
30 C | the process. This routine would detect this situation too
31 C | and allow a programmer to modify this routine and the
32 C | barrier code to allow threads to be scheduled more
33 C | appropriately.
34 C *==========================================================
35
36 C !USES:
37 C == Global variables ==
38 #include "SIZE.h"
39 #include "EEPARAMS.h"
40 #include "EESUPPORT.h"
41
42 C !INPUT PARAMETERS:
43 C == Routine arguments ==
44 C myThid :: My thread number
45 INTEGER myThid
46
47 C !LOCAL VARIABLES:
48 C == Local variables ==
49 C I :: Loop counter
50 C numberThreadRunning :: Count of number of threads this thread
51 C thinks are running.
52 C nChecks :: Number of times checked for all threads. After so
53 C many checks give up and report an error.
54 C msgBuffer :: Temp. for preparing text messages.
55 INTEGER I
56 INTEGER numberThreadsRunning
57 INTEGER nChecks
58 CHARACTER*(MAX_LEN_MBUF) msgBuffer
59 CEOP
60
61 C
62 threadIsRunning(myThid) = .TRUE.
63 nChecks = 0
64
65 10 CONTINUE
66 numberThreadsRunning = 0
67 nChecks = nChecks + 1
68 DO I = 1, nThreads
69 IF ( threadIsRunning(I) )
70 & numberThreadsRunning = numberThreadsRunning+1
71 ENDDO
72 IF ( nChecks .GT. 10 ) THEN
73 thError(myThid) = .TRUE.
74 eeBootError = .TRUE.
75 WRITE(msgBuffer,'(A,I5,A,I5,A)')
76 & 'S/R INI_CHECK_THREADS: Only ',numberThreadsRunning,
77 & ' thread(s), ',nThreads,' are needed for this configuration!'
78 CALL PRINT_ERROR( msgBuffer , myThid)
79 C-- Not enough threads are running so halt the program.
80 C I did not want this here but it is the only place I have found that
81 C KAP deadlocks if it there are fewer threads than iterations in a BLOCKED(1)
82 C loop. The deadlock appears to be in the routine mppjoin which never
83 C returns. I tried putting the STOP in main or breaking out of the loop in main
84 C but this causes KAP to insert a call to mppjoin - which then deadlocks!
85 IF ( myThid .EQ. 1 ) THEN
86 STOP 'ABNORMAL END: S/R CHECK_THREADS'
87 ENDIF
88 GOTO 11
89 ENDIF
90 IF ( numberThreadsRunning .NE. nThreads ) THEN
91 #ifdef HAVE_SYSTEM
92 CALL SYSTEM('sleep 1')
93 #endif
94 GOTO 10
95 ENDIF
96 11 CONTINUE
97
98 RETURN
99 END

  ViewVC Help
Powered by ViewVC 1.1.22