void data_arrived(SOCKET sock, char buffer[BUF_SIZE]){ if (strcmp(buffer, "new") == 0){ nb_client = nb_client + 1; new_console(0); if (nb_client){ new_console(0); } } if (strcmp(buffer, "del") == 0){ nb_client = nb_client - 1; new_console(0); } if (strstr(buffer, "#1")){ nb_rcv_packets = nb_rcv_packets +1; remove_packet_account(sock, buffer); } if (nb_client == -1){ nb_client = 0; new_console(0); } if (!nb_client){ message_info("Waiting for first client"); } return ; }
void *loader(void *arg) { while (1) { if(sem_wait(&sem_loader) == -1) { perror("loader"); exit(EXIT_FAILURE); } if(!thread_alive) return NULL; pthread_mutex_lock(&loader_mutex); t_msg *recibido = queue_pop(loader_queue); pthread_mutex_unlock(&loader_mutex); t_console *console = new_console(recibido->argv[0]); pthread_mutex_lock(&console_list_mutex); list_add(console_list, console); pthread_mutex_unlock(&console_list_mutex); conexion_consola(console->pid); log_trace(logger_old, "[NEW_CONNECTION @ LOADER]: (CONSOLE_ID %u, CONSOLE_SOCK %u).", console->pid, console->sock_fd); t_hilo *new_tcb = ult_tcb(console->pid); int status = reservar_memoria(new_tcb, recibido); if (status == -1) { log_warning(logger_old, "No se pudo cargar a memoria el hilo principal de la Consola %u.", console->pid); new_tcb->cola = EXIT; list_add(process_list, new_tcb); t_msg *msg = string_message(KILL_CONSOLE, "Finalizando consola. Motivo: no hay espacio suficiente en MSP.", 0); if(enviar_mensaje(console->sock_fd, msg) == -1) { log_warning(logger_old, "Se perdio la conexion con la consola %u.", console->pid); remove_console_by_sock_fd(console->sock_fd); } destroy_message(msg); } else { pthread_mutex_lock(&process_list_mutex); list_add(process_list, new_tcb); pthread_mutex_unlock(&process_list_mutex); log_trace(logger_old, "[LOADER]: (PID %u, TID %u) => NEW.", new_tcb->pid, new_tcb->tid); sem_post(&sem_planificador); } } return NULL; }