Advertisement
Guest User

monitoreh

a guest
May 26th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.18 KB | None | 0 0
  1. // Grupo: Santiago Canabal Ramos (z170221), Rafael Navarro Atienza (z170149)
  2.  
  3. /*ERRORES:
  4. - invariante mal definido (hay que considerar tambien los colores y trenes[3])
  5. + esta bien definida
  6. - puede desbloquear mas de un proceso
  7. + ¿?
  8. - no deberia usar ninguna otra clase mas que Enclavamiento y Control
  9. + puede ser lo del los throws que ya hemos quitado
  10. */
  11. import es.upm.babel.cclib.Monitor;
  12.  
  13. public class EnclavamientoMonitor implements Enclavamiento {
  14. //declaracion de variables tipo
  15. private boolean presencia;
  16. private Control.Color [] color = new Control.Color [4];
  17. private int [] trenes = new int [4];
  18. //declaracion de monitores y condiciones de barrera
  19. private Monitor mutex;
  20. private Monitor.Cond [] freno = new Monitor.Cond [2]; //1 condition por cada posible estado de freno
  21. private Monitor.Cond [] barrera = new Monitor.Cond [2]; //1 condition por cada posible estado de barrera
  22. private Monitor.Cond [][] semaforo = new Monitor.Cond [4][4]; //1 condition por cada posible estado de semaforo
  23.  
  24. //Contructor
  25. public EnclavamientoMonitor() {
  26. //Inicializacion de variables tipo
  27. presencia=false;
  28. for(int i=0;i<4;i++) {
  29. color[i]=Control.Color.VERDE;
  30. trenes[i]=0;
  31. }
  32. //Inicializacion de monitores y condiciones de barrera
  33. mutex = new Monitor();
  34. for(int i=0;i<2;i++) { //condicion[0]=false;
  35. //condicion[1]=true
  36. freno[i] = mutex.newCond();
  37. barrera[i] = mutex.newCond();
  38. }
  39. for(int j=0;j<4;j++) {//j=numero del semaforo
  40. for(int k=0;k<4;k++) {//k=color del semaforo
  41. semaforo[j][k] = mutex.newCond();
  42. //[j][k=1]=>ROJO
  43. //[j][k=2]=>AMARILLO
  44. //[j][k=3]=>VERDE
  45. }
  46. }
  47.  
  48. }
  49.  
  50. //Metodo para corregir los colores en los diferentes semaforos
  51. //de acuerdo al numero de trenes en cada segmento
  52. private void coloresCorrectos() {
  53.  
  54. if(trenes[1]>0) {
  55. color[1] = Control.Color.ROJO;
  56. }
  57. else if(trenes[1]==0) {
  58.  
  59. if((trenes[2]>0 || presencia==true)) {
  60. color[1] = Control.Color.AMARILLO;
  61. }
  62. else if(trenes[2]==0 && presencia==false) {
  63. color[1] = Control.Color.VERDE;
  64. }
  65. }
  66.  
  67. if(trenes[2]>0 || presencia==true) {
  68. color[2] = Control.Color.ROJO;
  69. }
  70.  
  71. else if(trenes[2]==0 && presencia==false) {
  72. color[2] = Control.Color.VERDE;
  73. }
  74.  
  75. color[3] = Control.Color.VERDE;
  76. }
  77.  
  78. //Metodo que comprueba la invariante
  79. private boolean invariante() {
  80. coloresCorrectos();
  81. return (trenes[1]>=0 && trenes[2]>=0);
  82. }
  83.  
  84. //Metodo que valora la posibilidad de
  85. //desbloquear algun proceso
  86. private void desbloquear() {
  87. boolean res = true;
  88.  
  89. if ((trenes[1]+trenes[2]==0) && res) {
  90. if (barrera[0].waiting()>0) {
  91. barrera[0].signal();
  92. res=false;
  93. }
  94. }
  95. else if (barrera[1].waiting()>0) {
  96. barrera[1].signal();
  97. res=false;
  98. }
  99.  
  100. if (trenes[1]>1 || trenes[2]>1 || trenes[2]==1 && presencia) {
  101. if (freno[0].waiting()>0) {
  102. freno[0].signal();
  103. res=false;
  104. }
  105. }
  106. else if (freno[1].waiting()>0) {
  107. freno[1].signal();
  108. res=false;
  109. }
  110. //[j][k=1]=>ROJO
  111. //[j][k=2]=>AMARILLO
  112. //[j][k=3]=>VERDE
  113. if (color[1]==Control.Color.VERDE && res) {
  114. if (semaforo[1][1].waiting()>0 && res) {
  115. semaforo[1][1].signal();
  116. res=false;
  117. }
  118. if (semaforo[1][2].waiting()>0 && res) {
  119. semaforo[1][2].signal();
  120. res=false;
  121. }
  122. }
  123. else if (color[1]==Control.Color.AMARILLO && res) {
  124. if (semaforo[1][1].waiting()>0 && res) {
  125. semaforo[1][1].signal();
  126. res=false;
  127. }
  128. if (semaforo[1][3].waiting()>0 && res) {
  129. semaforo[1][3].signal();
  130. res=false;
  131. }
  132. }
  133. else if (color[1]==Control.Color.ROJO && res) {
  134. if (semaforo[1][2].waiting()>0 && res) {
  135. semaforo[1][2].signal();
  136. res=false;
  137. }
  138. if (semaforo[1][3].waiting()>0 && res) {
  139. semaforo[1][3].signal();
  140. res=false;
  141. }
  142. }
  143.  
  144. if (color[2]==Control.Color.VERDE && res) {
  145. if (semaforo[2][1].waiting()>0 && res) {
  146. semaforo[2][1].signal();
  147. res=false;
  148. }
  149. if (semaforo[2][2].waiting()>0 && res) {
  150. semaforo[2][2].signal();
  151. res=false;
  152. }
  153. }
  154. else if (color[2]==Control.Color.AMARILLO && res) {
  155. if (semaforo[2][1].waiting()>0 && res) {
  156. semaforo[2][1].signal();
  157. res=false;
  158. }
  159. if (semaforo[2][3].waiting()>0 && res) {
  160. semaforo[2][3].signal();
  161. res=false;
  162. }
  163. }
  164. else if (color[2]==Control.Color.ROJO && res) {
  165. if (semaforo[2][2].waiting()>0 && res) {
  166. semaforo[2][2].signal();
  167. res=false;
  168. }
  169. if (semaforo[2][3].waiting()>0 && res) {
  170. semaforo[2][3].signal();
  171. res=false;
  172. }
  173. }
  174.  
  175. if (color[3]==Control.Color.VERDE && res) {
  176. if (semaforo[3][1].waiting()>0 && res) {
  177. semaforo[3][1].signal();
  178. res=false;
  179. }
  180. if (semaforo[3][2].waiting()>0 && res) {
  181. semaforo[3][2].signal();
  182. res=false;
  183. }
  184. }
  185. else if (color[3]==Control.Color.AMARILLO && res) {
  186. if (semaforo[3][1].waiting()>0 && res) {
  187. semaforo[3][1].signal();
  188. res=false;
  189. }
  190. if (semaforo[3][3].waiting()>0 && res) {
  191. semaforo[3][3].signal();
  192. res=false;
  193. }
  194. }
  195. else if (color[3]==Control.Color.ROJO && res) {
  196. if (semaforo[3][2].waiting()>0 && res) {
  197. semaforo[3][2].signal();
  198. res=false;
  199. }
  200. if (semaforo[3][3].waiting()>0 && res) {
  201. semaforo[3][3].signal();
  202. res=false;
  203. }
  204. }
  205. }
  206.  
  207. @Override
  208. public void avisarPresencia(boolean presencia) {
  209. if(invariante()) {
  210. mutex.enter();
  211. // chequeo de la PRE (no existe PRE)
  212. // chequeo de la CPRE y posible bloqueo (no existe posibilidad de bloqueo)
  213. // implementacion de la POST
  214. this.presencia=presencia;
  215. coloresCorrectos();
  216. // codigo de desbloqueo
  217. desbloquear();
  218. mutex.leave();
  219. }
  220.  
  221. }
  222.  
  223. @Override
  224. public boolean leerCambioBarrera(boolean actual) {
  225. boolean resultado=false;
  226. if(invariante()) {
  227. mutex.enter();
  228. // chequeo de la PRE (no existe PRE)
  229. // chequeo de la CPRE y posible bloqueo
  230. if(actual==(trenes[1]+trenes[2]==0)) {
  231. if(!actual) {
  232. barrera[0].await();
  233. }
  234. else {
  235. barrera[1].await();
  236. }
  237. }
  238. // implementacion de la POST
  239. if(trenes[1]+trenes[2]==0) {
  240. resultado=true;
  241. }
  242. // codigo de desbloqueo
  243. desbloquear();
  244. mutex.leave();
  245. }
  246. return resultado;
  247. }
  248.  
  249. @Override
  250. public boolean leerCambioFreno(boolean actual) {
  251. boolean resultado=false;
  252. if(invariante()) {
  253. mutex.enter();
  254. // chequeo de la PRE (no existe PRE)
  255. // chequeo de la CPRE y posible bloqueo
  256. if(actual==(trenes[1]>1 || trenes[2]>1 || trenes[2]==1 && presencia==true)) {
  257. if(!actual) {
  258. freno[0].await();
  259. }
  260. else {
  261. freno[1].await();
  262. }
  263. }
  264. // implementacion de la POST
  265. if(trenes[1]>1 || trenes[2]>1 || trenes[2]==1 && presencia==true) {
  266. resultado=true;
  267. }
  268. // codigo de desbloqueo
  269. desbloquear();
  270. mutex.leave();
  271. }
  272. return resultado;
  273. }
  274.  
  275. @Override
  276. public Control.Color leerCambioSemaforo(int i, Control.Color actual) {
  277. // chequeo de la PRE
  278. if(i==0)
  279. throw new PreconditionFailedException();
  280. if(invariante()) {
  281. mutex.enter();
  282. // chequeo de la CPRE y posible bloqueo
  283. if(actual.equals(color[i])) {
  284. if(color[i].equals(Control.Color.ROJO)) {
  285. semaforo[i][1].await();
  286. }
  287. else if(color[i].equals(Control.Color.AMARILLO)) {
  288. semaforo[i][2].await();
  289. }
  290. else if(color[i].equals(Control.Color.VERDE)) {
  291. semaforo[i][3].await();
  292. }
  293. }
  294. // implementacion de la POST
  295. // codigo de desbloqueo
  296. desbloquear();
  297. mutex.leave();
  298. }
  299. return color[i];
  300. }
  301.  
  302. @Override
  303. public void avisarPasoPorBaliza(int i) {
  304. // chequeo de la PRE
  305. if(i==0)
  306. throw new PreconditionFailedException();
  307. if(invariante()) {
  308. mutex.enter();
  309. // chequeo de la CPRE y posible bloqueo (no existe posibilidad de bloqueo)
  310. // implementacion de la POST
  311. trenes[i-1]--;
  312. trenes[i]++;
  313. coloresCorrectos();
  314. // codigo de desbloqueo
  315. desbloquear();
  316. mutex.leave();
  317. }
  318. }
  319.  
  320. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement