Télécharger ooowac.eso

Retour à la liste

Numérotation des lignes :

ooowac
  1. C OOOWAC SOURCE PV090527 26/04/24 08:23:28 12524
  2. CMODE 89/09/29 15:24:48 ESOP
  3. SUBROUTINE OOOWAC (LRET,IRET,HARG,PSEG,KOD)
  4. C--------------------------------------------------------------------
  5. C
  6. C SEGXXX /ERR=100/ PSEG
  7. C
  8. C ->LRET 1 PLUS DE PLACE MEMOIRE ET : IRET = 1
  9. C 2 OK
  10. C
  11. C IRET ACTION SI PLUS DE PLACE MEMOIRE
  12. C 0 STOP 16
  13. C 1 RETURN AVEC LRET = 1
  14. C
  15. C HARG 'NOM_SUBROUTINE NUMERO_LIGNE NOM_SEGMENT '
  16. C
  17. C PSEG POINTEUR DESIGNANT LE SEGMENT
  18. C KOD 1 => SEGACT EN *NOMOD
  19. C 0 => SEGACT EN *MOD
  20. C
  21. C PROGRAMMEUR : MOUGIN
  22. C CREE : 15/12/88 OOOY.. => OOOW.. (ARGUMENT HARG EN PLUS)
  23. C MODIF : 02/05/89 SEPARE D'AVEC L'ENTRY OOOWAD
  24. C
  25. C--------------------------------------------------------------------
  26. C
  27. %INC IOOADR
  28. %INC IOOADZ
  29. %INC IOODES
  30. %INC IOOSGM
  31. %INC IOOWCOM
  32. %INC IOOUNIT
  33. %INC IOOSAF
  34.  
  35. CHARACTER*(*) HARG
  36. POINTEUR PSEG.PSEG
  37.  
  38. C On met un SEGMENT pour avoir OOTHRD (le traducteur s'en charge)
  39. SEGMENT ISEG(0)
  40.  
  41. C LWAIT=.TRUE. duree dans ooowait seulement
  42. C LGLL =.TRUE. duree dans ooogll seulement
  43. INTEGER ITTIME(4)
  44. LOGICAL LGLL,LWAIT
  45. CHARACTER*(6) HDUREE
  46. C
  47. C ENTRY OOOWA1 (LRET,IRET,HARG,PSEG,KOD)
  48. C ENTRY OOOWA2 (LRET,IRET,HARG,PSEG,KOD)
  49. C ENTRY OOOWA3 (LRET,IRET,HARG,PSEG,KOD)
  50. C ENTRY OOOWA4 (LRET,IRET,HARG,PSEG,KOD)
  51. C ENTRY OOOWA5 (LRET,IRET,HARG,PSEG,KOD)
  52. C ENTRY OOOWA6 (LRET,IRET,HARG,PSEG,KOD)
  53. C ENTRY OOOWA7 (LRET,IRET,HARG,PSEG,KOD)
  54. C ENTRY OOOWA8 (LRET,IRET,HARG,PSEG,KOD)
  55. C ENTRY OOOWA9 (LRET,IRET,HARG,PSEG,KOD)
  56. C ENTRY OOOW10 (LRET,IRET,HARG,PSEG,KOD)
  57. C ENTRY OOOW11 (LRET,IRET,HARG,PSEG,KOD)
  58. C ENTRY OOOW12 (LRET,IRET,HARG,PSEG,KOD)
  59. C ENTRY OOOW13 (LRET,IRET,HARG,PSEG,KOD)
  60. C ENTRY OOOW14 (LRET,IRET,HARG,PSEG,KOD)
  61. C ENTRY OOOW15 (LRET,IRET,HARG,PSEG,KOD)
  62. C ENTRY OOOW16 (LRET,IRET,HARG,PSEG,KOD)
  63.  
  64. C Pour le message affiche
  65. HDIA = HARG
  66. LDIA = LEN(HARG)
  67.  
  68. C On saute l'ENTRY OOOYAC
  69. GOTO 100
  70.  
  71. ENTRY OOOYAC (LRET,IRET,PSEG,KOD)
  72. HDIA = ' '
  73. LDIA = 0
  74.  
  75. 100 CONTINUE
  76. IF(KOD .EQ. 1)THEN
  77. KASINS = INSTRUCTION_SEGACT
  78. ELSE
  79. KASINS = INSTRUCTION_SEGACT_MOD
  80. ENDIF
  81.  
  82. if(pseg.eq.abs(MZSURV)) CALL OOOMES(pseg,'GEMAT SURVEILLE ')
  83.  
  84. C Logique pour chronométrer l'attente
  85. LGLL =MZATTE .LT. 0 .AND. thread
  86. LWAIT =MZATTE .GT. 0
  87.  
  88. igll = 0
  89. nth = 0
  90. if (thread) nth=oothrd
  91.  
  92. If (.NOT.THREAD.and.THREAD) write(JLST,*) ' bug compilateur aix'
  93. If (.NOT.THREAD.and.THREAD) write(JERR,*) ' bug compilateur aix'
  94.  
  95. C Retrait eventuel du SEGMENT de la queue de desactivation
  96. if ((ibits(kod,0,18) .eq.1) .and.
  97. & ((nth.lt.64.and.(ibits(mdro1(pseg),nth,1).eq.1)).or.
  98. & (nth.ge.64.and.(ibits(mdro2(pseg),nth-64,1).eq.1))) .and.
  99. & (ibits(mdrw(pseg),0,18) .eq.0)) then
  100. do i=1,idesq(nth)
  101. if (abs(desq(nth,i)).eq.pseg) desq(nth,i)=0
  102. enddo
  103. lret=2
  104. return
  105. endif
  106.  
  107.  
  108. if ((ibits(kod,0,18) .eq. 1 ) .and.
  109. & ibits(mdrw(pseg),0,18).eq. nth+1) then
  110. if (thread) then
  111. igll=1
  112. C Debut du Chronometre
  113. if (LGLL) CALL oootps(ITTIME,nth)
  114.  
  115. lnsf(nth)=0
  116. call ooogll(1)
  117. lnsf(nth)=1
  118.  
  119. if (LGLL) then
  120. C Fin du Chronometre : Mesure du temps
  121. ITPS0=ITTIME(1)+ITTIME(2)
  122. CALL oootps(ITTIME,nth)
  123. IELAPS=ITTIME(1)+ITTIME(2)-ITPS0
  124. IF(IELAPS .ge. ABS(MZATTE))THEN
  125. WRITE(HDUREE,'(i6)') IELAPS
  126. CALL OOOMES(PSEG,'GEMAT ATTEND'//HDUREE)
  127. ENDIF
  128. endif
  129. endif
  130.  
  131. C verif queue de desactivation
  132. if (idesq(nth).ne.0 .and. mdco(pseg).ne.0) call ooodeq(nth)
  133. CALL OOODES(LRET,PSEG,1)
  134. endif
  135. if ((ibits(kod,0,18).ne.1).and.(ibits(mdrw(pseg),0,18).eq.nth+1))
  136. > then
  137. C on s'assure que le segment est en RW (on a le droit puisqu'il est a nous)
  138. ISEG =MDISG(PSEG)
  139. MDISG(PSEG)=ISEG
  140. C on l'enleve eventuellement de la queue de desactivation
  141. do i=1,idesq(nth)
  142. if (abs(desq(nth,i)).eq.pseg) desq(nth,i)=0
  143. enddo
  144. if (thread.and.igll.eq.1) call ooogll(0)
  145. lret=2
  146. return
  147. endif
  148.  
  149. if (thread.and.igll.eq.0) then
  150. C Debut du Chronometre
  151. if (LGLL) CALL oootps(ITTIME,nth)
  152.  
  153. lnsf(nth)=0
  154. call ooogll(1)
  155. lnsf(nth)=1
  156.  
  157. if (LGLL) then
  158. C Fin du Chronometre : Mesure du temps
  159. ITPS0=ITTIME(1)+ITTIME(2)
  160. CALL oootps(ITTIME,nth)
  161. IELAPS=ITTIME(1)+ITTIME(2)-ITPS0
  162. IF(IELAPS .ge. ABS(MZATTE))THEN
  163. WRITE(HDUREE,'(i6)') IELAPS
  164. CALL OOOMES(PSEG,'GEMAT ATTEND'//HDUREE)
  165. ENDIF
  166. endif
  167. endif
  168. CALL OOOVPN (PSEG)
  169. * si le segment est ouvert en lecture, quelqu'un l'attend peut etre.
  170. * il faudra garder la condition
  171. C segact ecr= ???
  172. C on fait toujours l'activation en mode force
  173.  
  174. if (.not.ooofor .or. nth.ne.0) then
  175. 10 if ((ibits(mdrw(pseg),0,18).ne.0.and.
  176. > ibits(mdrw(pseg),0,18).ne. nth+1)
  177. > .or.
  178. > (ibits(kod,18,1).ne.0.and.ishft(mdrw(pseg),-18).eq.nth+1)
  179. > .or.
  180. > (kod.eq.0.and.nth.lt.64.and.(
  181. > (mdro1(pseg).ne.0.and.mdro1(pseg).ne.ibset(0,nth))
  182. > .or.mdro2(pseg).ne.0))
  183. > .or.
  184. > (kod.eq.0.and.nth.ge.64.and.(
  185. > (mdro2(pseg).ne.0.and.mdro2(pseg).ne.ibset(0,nth-64))
  186. > .or.mdro1(pseg).ne.0))
  187. > )then
  188. C verif queue de desactivation
  189. if (idesq(nth).ne.0) CALL OOODEQ(nth)
  190. C On doit attendre.
  191. C si on demande le segact*MOD et si on est en attente, on libere le segment
  192. C avant pour eviter les blocages
  193. C Ce segment est'il attendu?
  194. call oootdl(pseg,ifla)
  195. if (kod.eq.0.and.mdco(pseg).ne.0.and.
  196. > ((nth.lt.64.and.mdro1(pseg).eq.ibset(0,nth)).or.
  197. > (nth.ge.64.and.mdro2(pseg).eq.ibset(0,nth-64)))
  198. > .and. ifla.eq.1) call ooosig(mdco(pseg))
  199.  
  200. if (nth.lt.64) mdro1(pseg)=ibclr(mdro1(pseg),nth)
  201. if (nth.ge.64) mdro2(pseg)=ibclr(mdro2(pseg),nth-64)
  202.  
  203. C Si necessaire on cree une condition
  204. if (mdco(pseg).eq.0) then
  205. call ooocon(mdco(pseg))
  206. if (pseg.le.0) write(JLST,*) ' ooowac pseg ',pseg
  207. endif
  208.  
  209. C Test deadlock
  210. call OOODDL(PSEG,HDIA)
  211.  
  212. C Debut du Chronometre
  213. if (LWAIT) CALL oootps(ITTIME,nth)
  214.  
  215. lnsf(nth)=0
  216. call ooowait(mdco(pseg))
  217. lnsf(nth)=1
  218.  
  219. if (LWAIT) then
  220. C Fin du Chronometre : Mesure du temps
  221. ITPS0=ITTIME(1)+ITTIME(2)
  222. CALL oootps(ITTIME,nth)
  223. IELAPS=ITTIME(1)+ITTIME(2)-ITPS0
  224. I1 = INDEX(HDIA( 1:LDIA),' ')
  225. I2 = INDEX(HDIA(I1+1:LDIA),' ')+I1
  226. I3 = INDEX(HDIA(I2+1:LDIA),' ')+I2
  227. IF(IELAPS .GE. ABS(MZATTE) .AND.
  228. & HDIA(I2+1:I3) .NE. 'MESINS')THEN
  229. WRITE(HDUREE,'(i6)') IELAPS
  230. CALL OOOMES(PSEG,'GEMAT ATTEND'//HDUREE)
  231. ENDIF
  232. endif
  233. call oooudl
  234. goto 10
  235. endif
  236. endif
  237. CALL OOOACT(LRET,PSEG,KOD)
  238. IF (LRET.EQ.1) THEN
  239. IF (IRET.EQ.0) GO TO 901
  240. ENDIF
  241.  
  242. * au cas ou d'autres attendent
  243. call oootdl(pseg,ifla)
  244. if (ifla.eq.1) then
  245. if (mdco(pseg) .ne. 0 .and.
  246. & ibits(mdrw(pseg),0,18).eq.0)
  247. & call ooosig(mdco(pseg))
  248. endif
  249. if (thread) call ooogll(0)
  250. RETURN
  251. C-----------------------------------------------------------------------
  252. C MESSAGES D'ERREUR
  253. C-----------------------------------------------------------------------
  254. 901 CALL OOOERR (0,0,'PAS ASSEZ DE PLACE EN MEMOIRE')
  255. STOP 16
  256. END
  257.  
  258.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales