/// <summary> /// Método responsável por Liberar um semáforo e decrementar o contador, que indica se um semáforo está em espera, dos demais semáforos da lista que seria usada. /// </summary> /// <param name="semaforoPorIntervalo">Semáforo para liberar</param> /// <param name="semaforosPorIntervalo">Lista de semáforos para decrementar o contador em espera</param> /// <param name="indice">índice em que a lista irá começar a decrementar</param> public static void LiberarSemaforoEDecrementarContadoresEmEsperaDosDemaisSemaforos(SemaforoPorIntervalo semaforoPorIntervalo, List <SemaforoPorIntervalo> semaforosPorIntervalo, int indice = 0) { SemaforoPorIntervalo.LiberarSemaforo(semaforoPorIntervalo); SemaforoPorIntervalo.DecrementarContadorSemaforoEmEspera(semaforosPorIntervalo, indice); }
/// <summary> /// Método responsável por consultar os semáforos que uma determinada thread de reordenação deverá esperar para então executar sua própria reordenação. /// </summary> /// <param name="oidCronograma">Oid do cronograma (índice do dicionário de cronogramas)</param> /// <param name="inicio">Início do intervalo</param> /// <param name="final">Final do intervalo</param> /// <returns>Retorna uma lista contendo os semáforos que deve-se esperar</returns> public Hashtable ConsultarSemaforosImpactadosPorCronograma(Guid oidCronograma, short inicio, short final, Hashtable semaforos) { List <SemaforoPorIntervalo> semaforosImpactadosAguardar = new List <SemaforoPorIntervalo>(); List <SemaforoPorIntervalo> semaforosImpactadosNovos = new List <SemaforoPorIntervalo>(); lock (semaforosPorCronograma[oidCronograma].semaforos) { EsperarLeituraSemaforos(oidCronograma); if (semaforosPorCronograma[oidCronograma].semaforos.Count == 0) { semaforosImpactadosNovos.Add(new SemaforoPorIntervalo(inicio, final)); } else { for (int i = 0; i < semaforosPorCronograma[oidCronograma].semaforos.Count; i++) { SemaforoPorIntervalo.VerificarSemaforosImpactados(ref semaforosImpactadosAguardar, ref semaforosImpactadosNovos, ref semaforosImpactadosNovos, semaforosPorCronograma[oidCronograma].semaforos[i], inicio, final); if (semaforosImpactadosNovos.Count > 0) { if (semaforosImpactadosAguardar.Count > 0) { for (int indice = 0; indice < semaforosImpactadosAguardar.Count; indice++) { SemaforoPorIntervalo.DecrementarContadorSemaforoEmEspera(semaforosImpactadosAguardar[indice]); } } break; } } } LiberarLeituraSemaforos(oidCronograma); if (semaforosImpactadosNovos.Count > 0) { EsperarEscritaSemaforos(oidCronograma); semaforosImpactadosAguardar.Clear(); semaforosImpactadosNovos.Clear(); List <SemaforoPorIntervalo> semaforosExistentes = semaforosPorCronograma[oidCronograma].semaforos; if (semaforosPorCronograma[oidCronograma].semaforos.Count == 0) { SemaforoPorIntervalo novoSemaforo = new SemaforoPorIntervalo(inicio, final); semaforosPorCronograma[oidCronograma].semaforos.Add(novoSemaforo); semaforosImpactadosNovos.Add(novoSemaforo); } else { for (int i = 0; i < semaforosPorCronograma[oidCronograma].semaforos.Count; i++) { if (semaforosPorCronograma[oidCronograma].semaforos[i].semaforo != null) { SemaforoPorIntervalo.IncrementarContadorSemaforoEmEspera(semaforosPorCronograma[oidCronograma].semaforos[i]); SemaforoPorIntervalo.VerificarSemaforosImpactados(ref semaforosImpactadosAguardar, ref semaforosImpactadosNovos, ref semaforosExistentes, semaforosPorCronograma[oidCronograma].semaforos[i], inicio, final); SemaforoPorIntervalo.DecrementarContadorSemaforoEmEspera(semaforosPorCronograma[oidCronograma].semaforos[i]); } else { semaforosPorCronograma[oidCronograma] = new SemaforosControle() { lockerSemaforos = new ReaderWriterLockSlim(), semaforos = new List <SemaforoPorIntervalo>() }; //cria um semáforo SemaforoPorIntervalo novoSemaforo = new SemaforoPorIntervalo(inicio, final); semaforosImpactadosNovos.Add(novoSemaforo); semaforosPorCronograma[oidCronograma].semaforos.Add(novoSemaforo); } } } LiberarEscritaSemaforos(oidCronograma); } } semaforos.Add(SEMAFOROS_AGUARDAR, semaforosImpactadosAguardar); semaforos.Add(SEMAFOROS_NOVOS, semaforosImpactadosNovos); return(semaforos); }
/// <summary> /// Método responsável por liberar um semáforo que está em espera e diminuir o atributo que indicar que ele está em espera. /// </summary> /// <param name="semaforoPorIntervalo">Semáforo para ser liberado</param> public static void LiberarSemaforoEDecrementarContadorSemaforoEmEspera(SemaforoPorIntervalo semaforoPorIntervalo) { SemaforoPorIntervalo.LiberarSemaforo(semaforoPorIntervalo); SemaforoPorIntervalo.DecrementarContadorSemaforoEmEspera(semaforoPorIntervalo); }