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); }
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; }
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); }
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; }