/[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.2 - (show annotations) (download)
Thu Apr 23 20:37:29 1998 UTC (26 years ago) by cnh
Branch: MAIN
CVS Tags: checkpoint11, checkpoint10, checkpoint13, checkpoint15, checkpoint14, redigm, checkpoint5, checkpoint4, checkpoint7, checkpoint6, checkpoint1, checkpoint3, checkpoint2, checkpoint9, checkpoint8, kloop1, kloop2, checkpoint12, branch-point-rdot
Branch point for: checkpoint7-4degree-ref, branch-rdot
Changes since 1.1: +1 -3 lines
Changed $Id to $Header

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

  ViewVC Help
Powered by ViewVC 1.1.22