Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int gere(){
- if(fila_espera_chegada->next == NULL && fila_espera_partida->next == NULL){
- return 0;
- }
- else if(fila_espera_chegada->next != NULL && fila_espera_partida->next == NULL){
- if(fila_espera_chegada->next->eta <= hora_ut()){
- return 1;
- }
- else{
- return 0;
- }
- }
- else if(fila_espera_chegada->next == NULL && fila_espera_partida->next != NULL){
- if(fila_espera_partida->next->descolagem <= hora_ut()){
- return 2;
- }
- else{
- return 0;
- }
- }
- else if(fila_espera_chegada->next != NULL && fila_espera_partida->next != NULL){
- if(fila_espera_partida->next->descolagem <= hora_ut() && fila_espera_chegada->next->eta > hora_ut()){
- return 1;
- }
- else if(fila_espera_partida->next->descolagem > hora_ut() && fila_espera_chegada->next->eta <= hora_ut()){
- return 2;
- }
- else if(fila_espera_partida->next->descolagem > hora_ut() && fila_espera_chegada->next->eta > hora_ut())
- return 0;
- }
- else if(fila_espera_partida->next->descolagem <= hora_ut() && fila_espera_chegada->next->eta <= hora_ut()){
- if(fila_espera_partida->next->descolagem < fila_espera_chegada->next->eta){
- return 2;
- }
- else if(fila_espera_partida->next->descolagem >= fila_espera_chegada->next->eta ){
- return 1;
- }
- }
- }
- void *thread_gerir(){
- int a,num;
- while(1){
- pthread_mutex_lock(&mutex_torre);
- while((a = gere()) == 0){
- if(fila_espera_chegada->next == NULL && fila_espera_partida->next == NULL){
- pthread_cond_wait(&cond_torre,&mutex_torre);
- }
- else if(fila_espera_chegada->next != NULL && fila_espera_partida->next == NULL){
- clock_gettime(CLOCK_REALTIME, &ts);
- double var;
- var = calcula_init(fila_espera_chegada->next->eta);
- ts.tv_sec += var;
- pthread_cond_timedwait(&cond_torre,&mutex_torre,&ts);
- }
- else if(fila_espera_chegada->next == NULL && fila_espera_partida->next != NULL){
- clock_gettime(CLOCK_REALTIME, &ts);
- double var;
- var = calcula_init(fila_espera_partida->next->descolagem);
- ts.tv_sec += var;
- pthread_cond_timedwait(&cond_torre,&mutex_torre,&ts);
- }
- else if(fila_espera_chegada->next != NULL && fila_espera_partida->next != NULL){
- clock_gettime(CLOCK_REALTIME, &ts);
- double var;
- var = calcula_init(fila_espera_partida->next->descolagem);
- ts.tv_sec += var;
- num = 3;
- pthread_cond_timedwait(&cond_torre,&mutex_torre,&ts);
- }
- }
- sem_wait(shared_sem);
- if(a == 1){
- int i,j;
- i = 0;
- j= 0;
- while (strcmp(shm_chegada[i].arr.nome,fila_espera_chegada->next->arr.nome)!= 0){
- i++;
- }
- shm_chegada[i].arr.var = 1;
- remove_lista_chegada(fila_espera_chegada,fila_espera_chegada->next->arr.nome);
- if(fila_espera_chegada->next != NULL){
- while (strcmp(shm_chegada[j].arr.nome,fila_espera_chegada->next->arr.nome)!= 0){
- j++;
- }
- shm_chegada[j].arr.var = 1;
- sleep(calcula_init(fila_espera_chegada->next->eta));
- remove_lista_chegada(fila_espera_chegada,fila_espera_chegada->next->arr.nome);
- pthread_mutex_unlock(&mutex_torre);
- sem_post(shared_sem);
- pthread_cond_broadcast(&shared_mutex->cond);
- }
- else{
- pthread_mutex_unlock(&mutex_torre);
- sem_post(shared_sem);
- pthread_cond_broadcast(&shared_mutex->cond);
- }
- //manda sinal para as threads;
- }
- if(a == 2){
- int i,j;
- i = 0;
- j= 0;
- while (strcmp(shm_partida[i].dep.nome,fila_espera_partida->next->dep.nome)!= 0){
- i++;
- }
- shm_partida[i].dep.var = 1;
- remove_lista_partida(fila_espera_partida,fila_espera_partida->next->dep.nome);
- printf("Removeu primeiro\n");
- if(fila_espera_partida->next != NULL){
- while (strcmp(shm_partida[j].dep.nome,fila_espera_partida->next->dep.nome)!= 0){
- j++;
- }
- shm_partida[j].dep.var = 1;
- sleep(calcula_init(fila_espera_partida->next->descolagem));
- remove_lista_partida(fila_espera_partida,fila_espera_partida->next->dep.nome);
- pthread_mutex_unlock(&mutex_torre);
- sem_post(shared_sem);
- printf("Vai mandar broadcast 2 \n");
- pthread_cond_broadcast(&shared_mutex->cond);
- }
- else{
- pthread_mutex_unlock(&mutex_torre);
- sem_post(shared_sem);
- printf("Vai mandar broadcast 1\n");
- pthread_cond_broadcast(&shared_mutex->cond);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement