コード例 #1
0
 /// <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);
        }
コード例 #3
0
 /// <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);
 }