void inicializarVariablesGlobales() {

	reiniciar(true);
	VIDAS = configPersonajeVidas();

	if (planDeNiveles != NULL)
		queue_destroy_and_destroy_elements(planDeNiveles, (void*)destruirObjetivosxNivel);

	planDeNiveles = configPersonajePlanDeNiveles();

	list_clean_and_destroy_elements(listaHilosxNivel, (void*)destruirEstructuraHiloPersonaje);
}
/**
 * @NAME: finalizarPersonaje
 * @DESC: Finaliza todas las variables y estructuras que fueron creadas para el proceso personaje
 */
void finalizarPersonaje() {
	log_info(LOGGER, "FINALIZANDO PROCESO PERSONAJE\n");
	reiniciar(false);

	// TODO Bajar Hilos
	finalizarHilosPersonaje();

	pthread_mutex_destroy(&mutexEnvioMensaje);
	pthread_mutex_destroy(&mutexVidas);
	pthread_mutex_destroy(&mutexListaHilosxNivel);
	pthread_mutex_destroy(&mutexReinicio);

	list_destroy_and_destroy_elements(listaHilosxNivel, (void*)destruirEstructuraHiloPersonaje);
	queue_destroy_and_destroy_elements(planDeNiveles, (void*)destruirObjetivosxNivel);

	destruirConfigPersonaje();
	log_destroy(LOGGER);
}
void liberarNodo(t_nodo *unNodo) {
	queue_destroy_and_destroy_elements(unNodo->bloquesLiberados, (void*) free);
	free(unNodo);
}
int main(){
	system("clear");

	tiempoEjec=time(NULL);

	listaEjecutando = list_create();
	listaCpuLibres = list_create();
	listaInicializando = list_create();
	listaAfinalizar = list_create();
	listaPorcentajeCpus = list_create();
	listaCpus = list_create();
	colaListos = queue_create();
	colaIO = queue_create();

	sem_init(&hayProgramas,0,0);
	sem_init(&hayCPU,0,0);
	sem_init(&hayIO,0,0);
	pthread_mutex_init(&mutexProcesoListo,NULL);
	pthread_mutex_init(&mutexInicializando,NULL);
	pthread_mutex_init(&mutexListaCpusLibres,NULL);
	pthread_mutex_init(&mutexIO,NULL);
	pthread_mutex_init(&mutexListaEjecutando,NULL);
	pthread_mutex_init(&mutexSwitchProc,NULL);
	pthread_mutex_init(&mutexFinalizarPid,NULL);
	pthread_mutex_init(&mutexListasCpu,NULL);
	pthread_mutex_init(&mutexListasPorcentajes,NULL);
	//creacion de la instancia de log
	logPlanificador = log_create("../src/log.txt", "planificador.c", false, LOG_LEVEL_INFO);

	//leemos el archivo de configuracion
	configPlanificador = leerConfiguracion();

	//Inicia el socket para escuchar
	int serverSocket;
	server_init(&serverSocket, configPlanificador->puertoEscucha);
	printf("Planificador listo...\n");

	tParametroSelector sel;
	sel.socket = serverSocket;
	sel.listaCpus = listaCpuLibres;

	pthread_t enviarAlCpu,selectorCpu,consumidorIO;
	pthread_attr_t attr;
	pthread_attr_init(&attr);
	/*creacion de hilos*/
	pthread_create(&selectorCpu,&attr,selector,(void*)&sel);
	pthread_create(&enviarAlCpu,&attr,enviar,NULL);
	pthread_create(&consumidorIO,&attr,consumidor,NULL);

	int enviar = 1;
	int cantProc = 1;
	int lng = 0;
	char * message = 0;

	while(enviar){
		/*reemplaza a fgets*/
		while(1){
			int c ;
			if ((c = getchar()) == EOF)
				break;

			message = realloc(message,lng + 1);
			message[lng] = c;
			lng++;

			if (c == '\n')
				break;
		}

		message = realloc(message,lng + 1);
		message[lng] = '\0';

		if (!strcmp(message,"exit\n")) {
			enviar = 0;
			llegoexit = true;
			sem_post(&hayCPU);
			sem_post(&hayProgramas);
			sem_post(&hayIO);
		}
		else
			procesarComando(clasificarComando(message),message,&cantProc);

		/*reinicio*/
		free(message);
		message = 0;
		lng = 0;
	}
	/*espero la terminacion de enviar*/
	pthread_join(enviarAlCpu,NULL);
	pthread_join(consumidorIO,NULL);

	sem_destroy(&hayCPU);
	sem_destroy(&hayIO);
	sem_destroy(&hayProgramas);
	pthread_mutex_destroy(&mutexIO);
	pthread_mutex_destroy(&mutexInicializando);
	pthread_mutex_destroy(&mutexListaCpusLibres);
	pthread_mutex_destroy(&mutexListaEjecutando);
	pthread_mutex_destroy(&mutexProcesoListo);
	pthread_mutex_destroy(&mutexSwitchProc);
	pthread_mutex_destroy(&mutexFinalizarPid);
	pthread_mutex_destroy(&mutexListasCpu);
	pthread_mutex_destroy(&mutexListasPorcentajes);
	/*destruyo la lista y sus elementos*/
	list_destroy_and_destroy_elements(listaCpuLibres,free);
	list_destroy_and_destroy_elements(listaEjecutando,free);
	list_destroy_and_destroy_elements(listaInicializando,free);
	list_destroy_and_destroy_elements(listaAfinalizar,free);
	list_destroy_and_destroy_elements(listaCpus,free);
	list_destroy_and_destroy_elements(listaPorcentajeCpus,free);
	/*destruyo la cola y sus elementos*/
	queue_destroy_and_destroy_elements(colaListos,free);

	close(serverSocket);
	logTpoTotal();
	return 0;
}