void RotQueue(QueueRecord* Q){ if(IsEmpty(Q)) return; DTNMsg temp = FrontAndDequeue(Q); Enqueue(temp,Q); }
int main() { Queue TestQueue = CreateQueue(10); cout << "Begin test of queue " << endl; for (int i = 0, n = 1; i < 10; i++, n *= 2) { cout << i + 1 << "> Enqueue : " << n<<endl; Enqueue(n, TestQueue); } PrintQueue(TestQueue); cout << "Is Full ? " << IsFull(TestQueue)<<endl; for (int i = 0; i < 5; i++) { cout << i + 1 << " >Dequeue :" << Front(TestQueue) << endl; Dequeue(TestQueue); } PrintQueue(TestQueue); cout << "Front and dequeue: " << FrontAndDequeue(TestQueue)<<endl; cout << "Now add more data to test the cicular array..." << endl; for (int i = 0; i < 5; i++) { cout << i + 1 << "> Enqueue : " << i << endl; Enqueue(i, TestQueue); } PrintQueue(TestQueue); cout << "Now make the queue empty..."; MakeEmpty(TestQueue); cout << "Is Empty ? "<<IsEmpty(TestQueue)<<endl; cout << "Now dipose the queue!" << endl; DisposeQueue(TestQueue); cout << "Test Succeed!" << endl << "Good bye!"<<endl; getchar(); }
void * mecanico(void *args){ Cliente clitratar; int i; int duracao; int id_thread = (int) args; char idMec[11]; // string para o registo do id do mecanico - p.e. "Mecanico 1" char servico[27]; // string para o registo do numero do servico - p.e. "Tou a tratar o servico 1!" sprintf(idMec, "Mecanico %d", id_thread); pthread_mutex_lock(&mutexRegis); regista(idMec, NULL, "Bom dia chefe, cheguei!"); pthread_mutex_unlock(&mutexRegis); while(work == 1) { if(!IsEmpty(Qmec)){ //Bloquer o acesso às Queues pthread_mutex_lock(&mutexMec); clitratar = FrontAndDequeue(Qmec); pthread_mutex_unlock(&mutexMec); pthread_mutex_lock(&mutexRegis); regista(idMec, clitratar.matricula, "Vou comecar a trabalhar"); pthread_mutex_unlock(&mutexRegis); for(i=0;i<clitratar.n_servicos;i++){ if(work != 1) break; pthread_mutex_lock(&mutexRegis); duracao = getDuracaoServico(clitratar.servicos[i], 1); pthread_mutex_unlock(&mutexRegis); if(duracao !=-1){ //Se for Diferente de -1 é porque existe e pode ser deste "Trabalhador" if(duracao !=0){ //Se for diferente de zero é dele //printf("Servico: %d - I: %d - Duracao: %d - Matricula: %s\n",clitratar.servicos[i], i, duracao, clitratar.matricula); sprintf(servico, "Tou a tratar o servico %d!", clitratar.servicos[i]); pthread_mutex_lock(&mutexRegis); regista(idMec, clitratar.matricula, servico); pthread_mutex_unlock(&mutexRegis); sleep(duracao); } //Se for igual a zero é porque é de alguém inferior a ele, por isso vai saltar } else{ //Deve ser do próximo trabalhador pthread_mutex_lock(&mutexEle); Enqueue(clitratar, Qele); // envia o veiculo para a proxima fila pthread_mutex_unlock(&mutexEle); break; } } } else//Se não houver nenhum cliente na Fila, faz um pequeno sleep sleep(2); } pthread_mutex_lock(&mutexRegis); regista(idMec, NULL, "Ate amanha camaradas!"); pthread_mutex_unlock(&mutexRegis); return NULL; }
void * chapeiro(void *args){ Cliente clitratar; int i; int duracao; int id_thread = (int) args; char idCha[11]; // string para o registo do id do chapeiro - p.e. "Chapeiro 1" char servico[27]; // string para o registo do numero do servico - p.e. "Tou a tratar o servico 1!" sprintf(idCha, "Chapeiro %d", id_thread); pthread_mutex_lock(&mutexRegis); regista(idCha, NULL, "Bom dia chefe, cheguei!"); pthread_mutex_unlock(&mutexRegis); while(work == 1) { if(!IsEmpty(Qcha)){ pthread_mutex_lock(&mutexCha); clitratar = FrontAndDequeue(Qcha); pthread_mutex_unlock(&mutexCha); pthread_mutex_lock(&mutexRegis); regista(idCha, clitratar.matricula, "Vou comecar a trabalhar"); pthread_mutex_unlock(&mutexRegis); for(i=0;i<clitratar.n_servicos;i++){ if(work != 1) break; pthread_mutex_lock(&mutexRegis); duracao = getDuracaoServico(clitratar.servicos[i], 3); pthread_mutex_unlock(&mutexRegis); if(duracao!=-1){ if(duracao!=0){ sprintf(servico, "Tou a tratar o servico %d!", clitratar.servicos[i]); pthread_mutex_lock(&mutexRegis); regista(idCha, clitratar.matricula, servico); pthread_mutex_unlock(&mutexRegis); sleep(duracao); } } else{ pthread_mutex_lock(&mutexPin); Enqueue(clitratar, Qpin); // envia o veiculo para a proxima fila pthread_mutex_unlock(&mutexPin); break; } } } else//Se nao houver carros para tratar, aguarda 2 segundos.. sleep(2); } pthread_mutex_lock(&mutexRegis); regista(idCha, NULL, "Ate amanha camaradas!"); pthread_mutex_unlock(&mutexRegis); return NULL; }
int SearchReuse(Queue readyQ, struct PE *pRRs, int qSize ) { Queue qtmp; qtmp=CreateQueue(qSize); ElementType tmp,task=-1; int found=NO; while(!IsEmpty(readyQ)) { tmp=FrontAndDequeue(readyQ); if ( (ReusePRR_V2(dfg1[tmp].TypeID, pRRs)) >=0 && !found) { task=tmp; found=YES; }else { Enqueue(tmp,qtmp); } } MakeEmpty(readyQ); if (task>=0){ Enqueue(task,readyQ); } while(!IsEmpty(qtmp)) { tmp=FrontAndDequeue(qtmp); Enqueue(tmp,readyQ); } DisposeQueue(qtmp); return task; }
void Queue_is_not_Empty() { Queue Q; Tree tree[10] = {(Tree )0x1, (Tree )0x2, (Tree )0x3, (Tree )0x4, (Tree )0x5, (Tree )0x6, (Tree )0x7, (Tree )0x8, (Tree )0x9, (Tree )0xA }; Tree tmp; Q = CreateQueue(); Enqueue(tree[0], Q); assert(IsEmpty(Q) == false); //Print(Q); tmp = FrontAndDequeue(Q); assert(tmp == tree[0]); DisposeQueue(Q); }
void Queue_is_correct_for_En_and_Dequeue() { Queue Q; int i; Tree tree[10] = {(Tree )0x1, (Tree )0x2, (Tree )0x3, (Tree )0x4, (Tree )0x5, (Tree )0x6, (Tree )0x7, (Tree )0x8, (Tree )0x9, (Tree )0xA }; Tree tmp; Q = CreateQueue(); for(i=0; i<10; i++) { Enqueue(tree[i], Q); } assert(IsEmpty(Q) == false); //Print(Q); for(i=0; i<10; i++) { tmp = FrontAndDequeue(Q); assert(tmp == tree[i]); } assert(IsEmpty(Q) == true); DisposeQueue(Q); }
void * pintor(void *args){ Cliente clitratar; int i; int duracao; int id_thread = (int) args; char idPin[11]; // string para o registo do id do pintor - p.e. "Pintor 1" char servico[27]; // string para o registo do numero do servico - p.e. "Tou a tratar o servico 1!" sprintf(idPin, "Pintor %d", id_thread); //Controla se o Cliente ja foi, ou nao, enviado para a fila da RecepcionistaS int enviado = 0; pthread_mutex_lock(&mutexRegis); regista(idPin, NULL, "Bom dia chefe, cheguei!"); pthread_mutex_unlock(&mutexRegis); while(work ==1) { if(!IsEmpty(Qpin)){ pthread_mutex_lock(&mutexPin); clitratar = FrontAndDequeue(Qpin); pthread_mutex_unlock(&mutexPin); pthread_mutex_lock(&mutexRegis); regista(idPin, clitratar.matricula, "Vou comecar a trabalhar"); pthread_mutex_unlock(&mutexRegis); for(i=0;i<clitratar.n_servicos;i++){ if(work != 1) break; pthread_mutex_lock(&mutexRegis); duracao = getDuracaoServico(clitratar.servicos[i], 4); pthread_mutex_unlock(&mutexRegis); if(duracao!=-1){ if(duracao!=0){ sprintf(servico, "Tou a tratar o servico %d!", clitratar.servicos[i]); pthread_mutex_lock(&mutexRegis); regista(idPin, clitratar.matricula, servico); pthread_mutex_unlock(&mutexRegis); sleep(duracao); } } else{ pthread_mutex_lock(&mutexRegis); regista(idPin, clitratar.matricula, "Ta pronto, vou mandar para a Doris"); pthread_mutex_unlock(&mutexRegis); pthread_mutex_lock(&mutexDone); Enqueue(clitratar, Qdone); // envia o veiculo para a proxima fila pthread_mutex_unlock(&mutexDone); enviado = 1; break; } } if(enviado!= 1){ //Acabaram os serviços e vou mandar para a Recepcionista S pthread_mutex_lock(&mutexRegis); regista(idPin, clitratar.matricula, "Ta pronto, vou mandar para a Doris"); pthread_mutex_unlock(&mutexRegis); pthread_mutex_lock(&mutexDone); Enqueue(clitratar, Qdone); pthread_mutex_unlock(&mutexDone); } } else{//Se nao houver nada para tratar, aguarda 2 segundos sleep(2); enviado = 0; } } pthread_mutex_lock(&mutexRegis); regista(idPin, NULL, "Ate amanha camaradas!"); pthread_mutex_unlock(&mutexRegis); return NULL; }
void * recepcionista_S(void *args) { Cliente cli_ready; while(feito == 0) // enquanto estiver em funcionamento { if(work == 2){ // quando receber ordem de fecho avisa os clientes que o carro nao esta pronto if(!IsEmpty(Qmec)){ pthread_mutex_lock(&mutexDone); cli_ready = FrontAndDequeue(Qmec); pthread_mutex_unlock(&mutexDone); //informar o cliente que o carro não está terminado pthread_mutex_lock(&mutexRegis); regista(RECEPS, cli_ready.matricula, "Vou despachar o cliente com um SIGUSR2"); pthread_mutex_unlock(&mutexRegis); kill(cli_ready.id, SIGUSR2);//enviado o sinal que o carro nao esta pronto } if(!IsEmpty(Qele)){ pthread_mutex_lock(&mutexDone); cli_ready = FrontAndDequeue(Qele); pthread_mutex_unlock(&mutexDone); //informar o cliente que o carro não está terminado pthread_mutex_lock(&mutexRegis); regista(RECEPS, cli_ready.matricula, "Vou despachar o cliente com um SIGUSR2"); pthread_mutex_unlock(&mutexRegis); kill(cli_ready.id, SIGUSR2);//enviado o sinal que o carro nao esta pronto } if(!IsEmpty(Qcha)){ pthread_mutex_lock(&mutexDone); cli_ready = FrontAndDequeue(Qcha); pthread_mutex_unlock(&mutexDone); //informar o cliente que o carro não está terminado pthread_mutex_lock(&mutexRegis); regista(RECEPS, cli_ready.matricula, "Vou despachar o cliente com um SIGUSR2"); pthread_mutex_unlock(&mutexRegis); kill(cli_ready.id, SIGUSR2);//enviado o sinal que o carro nao esta pronto } if(!IsEmpty(Qpin)){ pthread_mutex_lock(&mutexDone); cli_ready = FrontAndDequeue(Qpin); pthread_mutex_unlock(&mutexDone); //informar o cliente que o carro não está terminado pthread_mutex_lock(&mutexRegis); regista(RECEPS, cli_ready.matricula, "Vou despachar o cliente com um SIGUSR2"); pthread_mutex_unlock(&mutexRegis); kill(cli_ready.id, SIGUSR2);//enviado o sinal que o carro nao esta pronto } } if(!IsEmpty(Qdone)){ // se tiver veiculos prontos pthread_mutex_lock(&mutexDone); cli_ready = FrontAndDequeue(Qdone); pthread_mutex_unlock(&mutexDone); //meter no parque pointer[posicao] = cli_ready; posicao++; //informar o cliente que o carro está no parque (pointer) pthread_mutex_lock(&mutexRegis); regista(RECEPS, cli_ready.matricula, "Vou despachar o cliente com um SIGUSR1"); pthread_mutex_unlock(&mutexRegis); kill(cli_ready.id, SIGUSR1); //enviado o sinal para tirar o carro do parque //Vou aguardar que o cliente retire o carro do parque semwait(semid); } else { if (work == 2) feito = 1; // se passar da hora de fecho e todos os veiculos prontos tiverem sido levantados, nao espera mais! } } pthread_mutex_lock(&mutexRegis); regista(RECEPS,NULL,"Boa tarde chefe e ate amanha!"); pthread_mutex_unlock(&mutexRegis); return NULL; }
int Isomorphic( Tree T1, Tree T2 ) { Queue Q1 = CreateQueue(); Queue Q2 = CreateQueue(); Tree tree1 = T1; Tree tree2 = T2; bool doExit = false; bool result = false; RebuildTreeInOrder(tree1); RebuildTreeInOrder(tree2); // PrintTreeInfixOrder(tree1); // printf("\n"); // PrintTreeInfixOrder(tree2); // printf("\n"); Enqueue(tree1, Q1); Enqueue(tree2, Q2); while((!IsEmpty(Q1)) && (!IsEmpty(Q2))) { tree2 = FrontAndDequeue(Q2); tree1 = FrontAndDequeue(Q1); if(tree1 && (!tree2)) { result = false; doExit = true; break; } if((!tree1) && tree2) { result = false; doExit = true; break; } if(tree1 && tree2) { if(tree1->Element != tree2->Element) { result = false; doExit = true; break; } Enqueue(tree1->Left, Q1); Enqueue(tree1->Right, Q1); Enqueue(tree2->Left, Q2); Enqueue(tree2->Right, Q2); } } if(doExit) { DisposeQueue(Q1); DisposeQueue(Q2); return false; } if(IsEmpty(Q1) && IsEmpty(Q2)) { result = true; } DisposeQueue(Q1); DisposeQueue(Q2); return result; }
struct finsFrame *read_queue(finsQueue q) { return (FrontAndDequeue(q)); } // end of read_queue
int MoveDependentTask2TheFront(Queue readyQ,int qSize , int t) { Queue qtmp; qtmp = CreateQueue(qSize); ElementType tmp, task1 = -1, task2 = -1; int found1 = NO; int found2 = NO; int NoAdd1 = NO; int NoAdd2 = NO; if (st[t]) return 0; while (!IsEmpty(readyQ)) { tmp = FrontAndDequeue(readyQ); NoAdd1 = NoAdd2 = NO; if (!found1) { if (dfg1[t].D.isAdd_op1 && !isTaskDone(dfg1[dfg1[t].D.op1].D.op1)) { if (tmp == dfg1[t].D.op1) { st[t] = 1; task1 = tmp; found1 = YES; NoAdd1 = YES; } } } if (!found2) { if (dfg1[t].D.isAdd_op2 && !isTaskDone(dfg1[dfg1[t].D.op2].D.op2)) { if (tmp == dfg1[t].D.op2) { st[t] = 1; // fprintf(stderr,"FoundTask_2 [%d] is dependent on task [%d] \n",t,dfg1[dfg1[t].D.op2].D.op2); task2 = tmp; found2 = YES; NoAdd2 = YES; } } } if (!NoAdd1 && !NoAdd2) { Enqueue(tmp, qtmp); } } MakeEmpty(readyQ); if (task1 >= 0) { Enqueue(task1, readyQ); } if (task2 >= 0) { Enqueue(task2, readyQ); } while (!IsEmpty(qtmp)) { tmp = FrontAndDequeue(qtmp); Enqueue(tmp, readyQ); } DisposeQueue(qtmp); return found1 || found2; }