Exemple #1
0
 int Shm::resize_shm (jack_shm_info_t* si, jack_shmsize_t size) {
     jack_shm_id_t id;
     
     /* The underlying type of `id' differs for SYSV and POSIX */
     memcpy (&id, &jack_shm_registry[si->index].id, sizeof (id));
     
     release_shm (si);
     destroy_shm (si);
     
     if (shmalloc ((char *) id, size, si)) {
         return -1;
     }
     return attach_shm (si);
 }
Exemple #2
0
int cleanup(int how)
{
    LOG("pid %d cleaning up.is_main=%d is_udp=%d is_tls=%d is_timer=%d\n",getpid(),is_main,is_udp,is_tls,is_timer);
    cleanup_vector();
#ifdef USE_TLS
    destroy_shm();
#endif

    if (is_main)
    {
	if (how == 0) cleanup_childs();
	if (how == 0)
	    if (pid_file)
    		LOG("unlink returned %d\n",unlink(pid_file));
    }

    //closing sockets
    if (bind_address)
	{
	    if (bind_address->socket > 0) close(bind_address->socket);
	    free(bind_address);
	}
    if (bind_address_port)
    {
	    if (bind_address_port->socket > 0) close(bind_address_port->socket);
	    free(bind_address_port);
	}
    if (alternate_address)
	{
	    //close socket
	    if (alternate_address->socket > 0) close(alternate_address->socket);
	    free(alternate_address);
	}
    if (alternate_address_port)
	{
	    //close socket
	    if (alternate_address_port->socket > 0) close(alternate_address_port->socket);
	    free(alternate_address_port);
	}
#ifdef USE_TLS
    if (tls_bind_address)
	{
	    if (tls_bind_address->socket > 0) close(tls_bind_address->socket);
	    free(tls_bind_address);
	}
#endif

    return 0;
}
Exemple #3
0
void *thrFunc(void * args)
{
	char fifo_name[MAX_SIZE];      //Gerar o nome do fifo
	strcpy(fifo_name,"/tmp/fb_");
	char str_pid[MAX_SIZE];
	sprintf(str_pid, "%d", getpid());
	strcat(fifo_name, str_pid);

	mkfifo(fifo_name, 0660); //Criar o fifo com o nome gerado anteriormente

	Shared_memory * shm;
	if( (shm = create_shm(((ArgsToSend *)args)->name,((ArgsToSend *)args)->mytime)) == NULL ) 
	{
		//Caso tenha falhado em criar uma memoria partilhada
		printf("Shared memory could not be created\n");
		exit(EXIT_FAILURE);

	}
	printf("Store was created at %s", ctime(&shm->mytime));
	printf("Desk number %d\n", shm->sum);
	int desk_number = shm->sum; //Salvar numero de balcao porque a memoria partilhada vai ser alterada

	signal(SIGALRM, alarmhandler); 
  	alarm(((ArgsToSend *)args)->mytime);

	time_t opening_time = time(NULL); //Receber o tempo de abertura de balcao para controlar o tempo em que ele esta aberto

	fd1 = open(fifo_name, O_RDONLY);
	int fd2 = open(fifo_name, O_WRONLY); //Abrir um fifo de escrita e de leitura ao mesmo tempo para originar espera bloqueante

	if (fd1 < 0 && !alarmflag)
	{
		perror("FIFO open()");
		exit(EXIT_FAILURE);
	}



	putchar('\n');
	char str[100];

	pthread_t thread_array[5000];
	int size = 0;

	while(opening_time - shm->mytime < ((ArgsToSend *)args)->mytime){ //Enquanto o tempo nao passar
		if(readline(fd1,str)) //Se houver alguma coisa a ler (espera bloqueante porque ha um fifo de leitura e escrita abertos ao mesmo tempo, portanto so passa desta linha quando houver uma mensagem a receber do lado do cliente)
		{
			Treatment_args * t_args = malloc(sizeof(Treatment_args));
			t_args->shm = shm;
			t_args->desk_number = desk_number;
			strcpy(t_args->str, str);
			pthread_t treatment_thread;
			pthread_create(&treatment_thread, NULL, treatment_thr, t_args); //Cria uma thread de atendimento
			thread_array[size] = treatment_thread;
			size++;
		}

		opening_time = time(NULL); //Atualizar o tempo
	}
	//Depois de receber 
	while(size >= 0)
	{ //Espera que todas as threads criadas anteriormente terminem
		pthread_join(thread_array[size], NULL);
		size--;
	}

	close(fd1); //fecha os fifos
	close(fd2); 

 	shm->table[desk_number - 1][DURATION] = ((ArgsToSend *)args)->mytime; //Atualizar duracao na tabela quando o balcao fecha, valor diferente de -1
 	if(shm->table[shm->sum - 1][RECEPTIONED] > 0)
 		shm->table[desk_number - 1][AVERAGE_TIME] = time_sum / shm->table[shm->sum - 1][RECEPTIONED];



 	print_on_log(desk_number, "fecha_balcao");


	if(shm->running == 1) //Significa que este e o ultimo balcao em execucao, tem por isso que libertar a memoria partilhada
	{
		for(; shm->sum > 0; shm->sum--)
		{
			printf("Desk num: %d, opened at: %d, with duration of: %d, with pid of %d, with %d clients in reception, with %d receptioned clients, with %d seconds of average time\n",
				shm->table[shm->sum - 1][DESK_NUM], 
				shm->table[shm->sum - 1][TIME], 
				shm->table[shm->sum - 1][DURATION], 
				shm->table[shm->sum - 1][PID], 
				shm->table[shm->sum - 1][IN_RECEPTION], 
				shm->table[shm->sum - 1][RECEPTIONED],
				shm->table[shm->sum - 1][AVERAGE_TIME]);
		}

		print_on_log(desk_number, "fecha_loja");

		destroy_shm(shm,((ArgsToSend *)args)->name);
	}else{
		shm->running--;
	}

	close(log_file);
	free(args); //liberta memoria alocada anteriormente
	pthread_exit(NULL);
}
Exemple #4
0
Shared_memory * create_shm(char * mem_name, int duration)
{
	int exist = 0;
	int shmfd;
	Shared_memory * shm;
	shmfd = shm_open(mem_name, O_CREAT|O_RDWR|O_EXCL, 0660); //Criar a regiao de memoria partilhada

	if(shmfd < 0) //Verificar se o shm_open nao falha
	{	
		if((shmfd = shm_open(mem_name, O_RDWR, 0660)) < 0) //Hipotese de falha gracas a existencia de uma shm com o mesmo nome, tenta abertura de read 
		{ 
			perror("Failure in shm_open()");
			return NULL;

		}else{ //Significa que existe uma memoria partilhada com este nome
			exist = 1;
		}
	}
	
	if(ftruncate(shmfd, sizeof(Shared_memory)) < 0) //Especificar o tamanho da regiao de memoria partilhada
	{
		perror("Failure in ftruncate()");
		return NULL;
	} 

	shm = mmap(0, sizeof(Shared_memory), PROT_READ|PROT_WRITE, MAP_SHARED, shmfd, 0); //juntar a regiao a memoria virtual
	
	if(shm == MAP_FAILED) //Em caso do mmap falhar
	{
		perror("Failure in mmap()");
		return NULL;
	}

  //gerar o nome do log com o nome da memoria partilhada
	strcat(log_file_name, mem_name);
	strcat(log_file_name, ".log");
	chopN(log_file_name, 1);


	//inicializar dados na memoria partilhada

	if(exist == 0){ //Caso seja o primeiro balcao a ser criado

		shm->sum = 1;
		shm->running = 1;
		//Tempo do sistema
		time(&shm->mytime);

		pthread_mutex_init ( &shm->table_lock, NULL);

		char time_to_print[20];
		strftime(time_to_print, 20, "%Y-%m-%d %H:%M:%S", localtime(&shm->mytime)); //Uma maneira de passar o tempo para o formato correto

		printf("Nome da mem: %s\n", log_file_name);
		remove(log_file_name);
		log_file  =  open(log_file_name, O_CREAT | O_WRONLY, 0660);
		if (log_file < 0)
		{
			destroy_shm(shm, mem_name);
			perror("creating()");
			exit(EXIT_FAILURE);
		}


		char message1[] = "quando\t\t\t\t| quem\t | balcao\t| o_que\t\t\t\t| canal_criado/usado\n";
		char message2[] = "-------------------------------------------------------------------------------\n";
		char message3[MAX_SIZE];
		sprintf(message3, "%s\t| Balcao | 1\t\t| inicia_mempar\t\t| -\n", time_to_print);
		write(log_file, message1, strlen(message1));
		write(log_file, message2, strlen(message2));
		write(log_file, message3, strlen(message3));

		close(log_file);

	}else{ //Caso ja existam balcoes

		shm->sum++;
		shm->running++;

	}


	//Adicionar informacao ao log
	print_on_log(shm->sum, "cria_linh_mempart");


	//Adicionar uma linha a tabela
	shm->table[shm->sum - 1][DESK_NUM] = shm->sum;
	shm->table[shm->sum - 1][TIME] = time(NULL) - shm->mytime;
	shm->table[shm->sum - 1][DURATION] = -1;
	shm->table[shm->sum - 1][PID] = getpid();
	shm->table[shm->sum - 1][IN_RECEPTION] = 0;
	shm->table[shm->sum - 1][RECEPTIONED] = 0;
	shm->table[shm->sum - 1][AVERAGE_TIME] = 0;

	return shm;
}