Ejemplo n.º 1
0
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;
}