Exemple #1
0
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();
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}
Exemple #5
0
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;



}
Exemple #6
0
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);
}
Exemple #7
0
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);
}
Exemple #8
0
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;
}
Exemple #9
0
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;
}
Exemple #10
0
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;
}
Exemple #11
0
struct finsFrame *read_queue(finsQueue q) {

	return (FrontAndDequeue(q));

} // end of read_queue
Exemple #12
0
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;

}