Télécharger oooini.eso

Retour à la liste

Numérotation des lignes :

oooini
  1. C OOOINI SOURCE PV090527 26/04/24 08:23:11 12524
  2. SUBROUTINE OOOINI (LRET,PSEG,LSEG)
  3. C--------------------------------------------------------------------
  4. C
  5. C SEGINI , PSEG
  6. C
  7. C ->LRET 1 PLUS DE PLACE MEMOIRE
  8. C 2 OK
  9. C
  10. C ->PSEG POINTEUR DESIGNANT LE SEGMENT CREE
  11. C LSEG NOMBRE DE MOTS DE DONNEES DU SEGMENT
  12. C
  13. C PROGRAMMEUR : MOUGIN
  14. C CREE : 21/12/88 POUR LA FAMILLE : OOOW..
  15. C MODIF : 02/01/89 UTILISER : OOOMIN SIMPLIFIE
  16. C MODIF : 17/01/89 UTILISER : OOOMWD SIMPLIFIE
  17. C MODIF : 17/01/89 UTILISER : OOODEX SIMPLIFIE
  18. C
  19. C--------------------------------------------------------------------
  20. C
  21. %INC IOOADR
  22. %INC IOOPTRK
  23. %INC IOOADZ
  24. %INC IOODES
  25. %INC IOOSGM
  26. %INC IOOWCOM
  27. %INC IOOUNIT
  28. POINTEUR PSEG.PSEG,pseg1.pseg
  29. integer blkmsk1,blkmsk2
  30. logical bas
  31. C notre numero de thread dans mdrw
  32. nth=0
  33. if (thread) nth=oothrd
  34.  
  35. if (pseg.ne.-1) then
  36. C verif queue de desactivation
  37. call ooodeq(nth)
  38. C verif queue de suppression
  39. C call ooosuq(nth)
  40. endif
  41. C
  42. IF (LSEG.LE.0) GO TO 901
  43. C
  44. C DANS LE CAS D'UN POINTEUR PRESCRIT, CONTROLE DE VALIDITE
  45. C
  46. IF (PSEG.GT.0) THEN
  47. IF (PSEG.LT.MZIDEX) GO TO 902
  48. IF (MOD(PSEG-MZIDE1,MDLDE).NE.0) GO TO 902
  49. IF(PSEG.GT.MZIDEY) THEN
  50. IF (TESOOO) CALL OOOWER ('OOOINI => OOODEX PSEG PRESCRIT')
  51. CALL OOODEX (LRET,MZNDEX+(PSEG-MZIDEY)/MDLDE)
  52. IF (TESOOO) CALL OOOWER ('OOOINI <= OOODEX : FIN')
  53. IF (LRET.EQ.1) RETURN
  54. ELSE
  55. IF(MDIDS(PSEG).GE.0) GO TO 903
  56. ENDIF
  57. IPREC=-MDIDP(PSEG)
  58. IF (-MDIDS(MZIDE1).NE.PSEG) THEN
  59. IDEUX=-MDIDS(MZIDE1)
  60. MDIDS(IPREC)=MDIDS(PSEG)
  61. MDIDP(-(MDIDS(PSEG)))=-IPREC
  62. MDIDS(PSEG)=-IDEUX
  63. MDIDP(ideux)=-PSEG
  64. MDIDS(MZIDE1)=-PSEG
  65. MDIDP(PSEG)=-MZIDE1
  66. ENDIF
  67. ENDIF
  68. C
  69. C S'ASSURER QU'IL Y A UN DESCRIPTEUR
  70. C
  71. bas=.false.
  72. if (pseg.eq.-1) bas=.true.
  73. C on reserve ntrk descripteurs pour les super segment
  74. ptrk=mzptrk
  75. ntrk=0
  76. if (ptrk.ne.0) ntrk=ptrk.nntrk
  77. if (lseg.eq.0) write(JLST,*) ' oooini lseg nul'
  78. pseg=-mdids(mzide1)
  79. if (mdidp(mzide1).eq.0) CALL OOOERR (PSEG,-1,'CHAINAGE DETRUIT')
  80. do while ((pseg.lt.ntrk*mdlde+mdidx0).and.(pseg.ne.mzide1))
  81. C write(JLST,*) ' oooini 1 ',pseg,mdidp(pseg),mdids(pseg)
  82. pseg=-mdids(pseg)
  83. IF (PSEG.LT.MZIDEX) then
  84. if (pseg.ne.mzide1) CALL OOOERR (PSEG,-1,'POINTEUR TROP PETIT')
  85. ENDIF
  86. IF (PSEG.GT.MZIDEY) CALL OOOERR (PSEG,-1,'POINTEUR TROP GRAND')
  87. if (pseg.eq.0) CALL OOOERR (PSEG,-1,'POINTEUR NUL')
  88. enddo
  89. C
  90. IF (MZIDE1.EQ.pseg) THEN
  91. IF (TESOOO) CALL OOOWER ('OOOINI => OOODEX : ADD DESCRIPTEURS')
  92. CALL OOODEX (LRET,max(MZNDEX,ntrk))
  93. IF (TESOOO) CALL OOOWER ('OOOINI <= OOODEX : FIN')
  94. IF (LRET.EQ.1) RETURN
  95. ENDIF
  96. C
  97. C ATTRIBUER LA PLACE MEMOIRE POUR LE SEGMENT.
  98. C
  99. IPASS=0
  100. 142 LSG = LSEG+MSLCZ
  101. CALL OOOMIN (LRET,ZMEMDYN,ISEG,LSG)
  102. IF (LRET.EQ.1) THEN
  103. IF (TESOOO) CALL OOOWER ('OOOINI => OOOMWD')
  104. CALL OOOMWD (LRET,LSG)
  105. IF (TESOOO) CALL OOOWER ('OOOINI <= OOOMWD')
  106. IF (LRET.EQ.1) then
  107. * deuxieme chance au cas ou des threads se seraient bloques
  108. ipass=ipass+1
  109. * recuperer le masque des threads bloques
  110. blkmsk1=0
  111. blkmsk2=0
  112. call ooombl(blkmsk1,blkmsk2)
  113. if (oothrd+1.lt.64) blkmsk1=ibset(blkmsk1,oothrd+1)
  114. if (oothrd+1.ge.64) blkmsk2=ibset(blkmsk2,oothrd+1-64)
  115. ** write(6,'(A16,Z16)') 'blkmsk initial ',blkmsk
  116. ** write(6,'(A16,Z16)') 'blkmsk ibset ',blkmsk
  117. blkmsk1=not(blkmsk1)
  118. blkmsk2=not(blkmsk2)
  119. * write(6,'(A16,Z16)') 'blkmsk not ',blkmsk
  120. if(blkmsk1.ne.0.or.blkmsk2.ne.0) then
  121. * ipass=ipass-1
  122. *** write(6,*) 'oooini attente avant compaction memoire',
  123. *** > blkmsk1,blkmsk2,oothrd
  124. *** call sleep(1)
  125. *** if (ipass.le.1) goto 142
  126. endif
  127. RETURN
  128. endif
  129. GO TO 142
  130. ENDIF
  131. C
  132. C****** ENLEVE LE DESCRIPT DE LA CHAINE DES DESCRIPT. LIBRES
  133. C
  134. if (bas) then
  135. PSEG = -MDIDP(MZIDE1)
  136. pseg1=pseg
  137. do while ((pseg.ge.ntrk*mdlde+mdidx0).and.(pseg.ne.mzide1))
  138. C write(JLST,*) ' oooini bas rejete ',pseg
  139. pseg=-mdidp(pseg)
  140. enddo
  141. C write(JLST,*) ' MZIDE1 ',mzide1,mdids(mzide1),mdidp(mzide1)
  142. C write(JLST,*) ' oooini bas ok ',pseg
  143. else
  144. PSEG = -MDIDS(MZIDE1)
  145. pseg1=pseg
  146. do while ((pseg.lt.ntrk*mdlde+mdidx0).and.(pseg.ne.mzide1))
  147. C write(JLST,*) ' oooini hau rejete ',pseg
  148. pseg=-mdids(pseg)
  149. enddo
  150. C write(JLST,*) ' MZIDE1 ',mzide1,mdids(mzide1),mdidp(mzide1)
  151. C write(JLST,*) ' oooini haut ok ',pseg
  152. endif
  153. mdidp(-mdids(mzide1)) = mdidp(mzide1)
  154. mdids(-mdidp(mzide1)) = mdids(mzide1)
  155. mdids(mzide1)=mdids(pseg)
  156. mdidp(-mdids(pseg))=-mzide1
  157. mdidp(mzide1)=mdidp(pseg)
  158. mdids(-mdidp(pseg))=-mzide1
  159.  
  160. C
  161. C****** IMPLANTATION SEGMENT
  162. C
  163. C INDICE:ISEG,LG:LSG,DESCRIPT:PSEG
  164. C INITIALISER LE DESCRIPTEUR DU SGM:
  165. C INSERER DANS LA CHAINE DES SEGMENTS ACTIFS
  166. C
  167. MDZERO(PSEG) = 0
  168. C IMPLANTATION MEMOIRE DU SGM DE LG (LSG)
  169. MSIDE(ISEG) = PSEG
  170. MDISG(PSEG) = ISEG
  171. ITYP=MDLTYP(MDISOLE,MDMEM,MDACT,0,0)
  172. MDTYP(PSEG) = ITYP
  173. C
  174. IDA=MDACHN(ACTIF)
  175. MDCHNP ,IDA(PSEG)
  176.  
  177. C MAJ DES STATS/SGM ET /MOTS
  178.  
  179. MZJSS(ACTUEL) = MZJSS(ACTUEL)+1
  180. MZJSS(DEF) = MAX(MZJSS(ACTUEL),MZJSS(DEF))
  181. MZJSM(ACTUEL) = MZJSM(ACTUEL)+LSG
  182. MZJSM(DEF) = MAX(MZJSM(ACTUEL),MZJSM(DEF))
  183. MZJSS(ACTACTIF) = MZJSS(ACTACTIF)+1
  184. MZJSS(MAXACTIF) = MAX(MZJSS(ACTACTIF),MZJSS(MAXACTIF))
  185. MZJSM(ACTACTIF) = MZJSM(ACTACTIF)+LSG
  186. MZJSM(MAXACTIF) = MAX(MZJSM(ACTACTIF),MZJSM(MAXACTIF))
  187. C
  188. LRET = 2
  189. mdrw(pseg)=nth+1
  190. if(nth.lt.64) mdro1(pseg)=ibset(0,nth)
  191. if(nth.ge.64) mdro2(pseg)=ibset(0,nth-64)
  192. C l'horodatage dans mdhor
  193. mdhor(pseg)=horo(nth)
  194.  
  195. RETURN
  196. C-----------------------------------------------------------------------
  197. C
  198. C MESSAGES D'ERREUR
  199. C
  200. 901 CALL OOOERR (LSEG,1,' LONGUEUR DU SEGMENT INVALIDE')
  201. STOP 16
  202. 902 CALL OOOERR (PSEG,1,' VALEUR DU POINTEUR INVALIDE')
  203. STOP 16
  204. 903 CALL OOOERR (PSEG,1,' POINTEUR DEJA ATTRIBUE')
  205. STOP 16
  206. 904 CALL OOOERR (PSEG,1,' CHAINE DES DESCRIPTEURS LIBRES CORROMPUE')
  207. STOP 16
  208. END
  209.  
  210.  

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