Esempio n. 1
0
void gestionarDeadLock() {
	int i;
	t_list* bloqueados = obtenerPersonajesEnDL(listaRecursos, listaPersonajes);
	ITEM_NIVEL * temp = NULL;
	ITEM_NIVEL * menor = NULL;

	if (list_is_empty(bloqueados) || bloqueados->elements_count == 1) {
		list_destroy_and_destroy_elements(bloqueados, (void *) free);
		return;
	}

	logBloqueados(bloqueados);

	if (!configObj->recovery) {
		return;
	}

	menor = list_get(bloqueados, 0);
	for (i = 0; i < list_size(bloqueados); i++) {
		temp = list_get(bloqueados, i);
		if (temp->socket < menor->socket) {
			menor = temp;
		}
	}

	log_info(logFile, "Victima DeadLock: %c", menor->id);
	notificarMuertePersonaje(menor->id, VICTIMA_DEADLOCK);
	list_destroy_and_destroy_elements(bloqueados, (void *) free);
}
void liberaMemoriaMarta(t_estructuraMarta* ptrMarta) {
	list_destroy_and_destroy_elements(ptrMarta->listaArchivosProcesados,
			(void*)liberaMemoriaArchivoProcesado);
	list_destroy_and_destroy_elements(ptrMarta->listaInformacionDelArchivo,
			(void*)liberaMemoriaInformacionArchivo);
	list_destroy_and_destroy_elements(ptrMarta->listaSolicitudes,
			(void*)liberaMemoriaSolicitud);
	free(ptrMarta);
}
Esempio n. 3
0
void freeJob(t_job *job) {
	list_iterate(job->maps, (void *) removeMapNode);
	list_destroy_and_destroy_elements(job->files, (void *) freeFile);
	list_destroy_and_destroy_elements(job->maps, (void *) freeMap);
	list_destroy_and_destroy_elements(job->partialReduces, (void *) freeReduce);
	freeReduce(job->finalReduce);
	free(job->resultFile);
	free(job);
}
void finalizar_panel(void)
{
	if(proceso_tipo == KERNEL) {
		list_destroy_and_destroy_elements(kernel_cpus_conectadas, (void *) free);
		list_destroy_and_destroy_elements(kernel_consolas_conectadas, (void *) free);
	}

	log_destroy(logger);
}
void liberaMemoriaJob(t_job* ptrJob) {

	list_destroy_and_destroy_elements(ptrJob->listaSolicitudDeTrabajo,
									  (void*) liberaMemoriaSolicitudDeTrabajo);
	list_destroy_and_destroy_elements(ptrJob->listasTareasMap,
								      (void*) liberaMemoriaTareaMap);
	list_destroy_and_destroy_elements(ptrJob->listasTareasReduce,
									  (void*) liberaMemoriaTareaReduce);
	free(ptrJob);
}
Esempio n. 6
0
void *comienzaPCP() {
	listaVarCompartidas = list_create(); // Lista de las variables compartidas
	listaSemaforos = list_create(); // Lista de Semaforos
	listaIO = list_create(); // Lista de los Dispositivos IO
	listaBloqueados = list_create(); //Lista de procesos bloqueados por semaforo
	config = config_create(getenv("CONFIG_KERNEL"));
	log_pcp = creacionLog(config_get_string_value(config, "LOG_KERNEL"), "PCP");
	log_debug(log_pcp, "Inicia el proceso PCP..");
	log_trace(log_pcp, "Creado log del PCP");
	log_trace(log_pcp, "Cargado el archivo de configuracion");

	// ######################## Cargo Archivo de config ######################## //
	// Cargo QUANTUM y retardo Quantum en estructuraInicial
	estructuraInicial = malloc(sizeof(t_EstructuraInicial));
	estructuraInicial->Quantum = config_get_int_value(config, "QUANTUM");
	estructuraInicial->RetardoQuantum = config_get_int_value(config, "RETARDO");
	log_trace(log_pcp, "Cargado el Quantum: %d , retardoQuantum:%d",
			estructuraInicial->Quantum, estructuraInicial->RetardoQuantum);
	cpuAcerrar=0;
	// Cargo las varCompartidas en listaVarCompartidas asi es mas comodo manejarlas
	cargoVarCompartidasEnLista();
	// Cargo los semaforos en listaSemaforos
	cargoSemaforosEnLista();
	// Cargo los IO en listaIO
	cargoIOenLista();
	pthread_t hiloIO, hiloPCB;					//hilo por IO y PCB
	sem_init(&semClienteOcioso, 1, 0);		// Semaforo para clientes ociosos

	//Creo hilo por cada dispositivo
	void _creoHilos(void* entradaSalida) {
		if (pthread_create(&hiloIO, NULL, hiloPorIO, (void*) entradaSalida)
				!= 0) {
			perror("could not create thread");
		}
	}

	list_iterate(listaIO, (void*) _creoHilos);

	// creo hilo para manejar programas que se cierren inesperadamente
	if (pthread_create(&hiloPCB, NULL, (void*) hiloPCBaFinalizar, NULL ) != 0) {
		perror("could not create thread");
	}
	// ######################## 	Fin loading		 ######################## //

	server_cpu();

	config_destroy(config);
	log_destroy(log_pcp);
	list_destroy_and_destroy_elements(listaVarCompartidas, free);
	list_destroy_and_destroy_elements(listaIO, free);
	list_destroy_and_destroy_elements(listaSemaforos, free);
	return 0;
}
Esempio n. 7
0
void limpiar_estructuras_swap() {

    log_destroy(loggerDebug);
    log_destroy(loggerError);
    log_destroy(loggerInfo);
    list_destroy_and_destroy_elements(metricas, free);
    list_destroy_and_destroy_elements(espacioLibre, free);
    list_destroy_and_destroy_elements(espacioOcupado, free);
    sem_destroy(&sem_mutex_libre);
    sem_destroy(&sem_mutex_ocupado);
    free(arch);
    clean_socket(socketServidor);
}
void liberaMemoriaUbicacionBloque(t_ubicacionBloque* ptrUbicacionBloque) {

	list_destroy_and_destroy_elements(
			ptrUbicacionBloque->listaRelacionesNodoBloque,
			(void*) liberaMemoriaRelacionNodoBloque);
	free(ptrUbicacionBloque);
}
Esempio n. 9
0
void recibirOrdenReduce(int socketQueEscribe){
	uint32_t longNombreEnDondeGuardarlo;
	recibir(socketQueEscribe,&longNombreEnDondeGuardarlo,sizeof(uint32_t));
	char* nombreEnDondeGuardarlo = malloc(longNombreEnDondeGuardarlo);
	recibir(socketQueEscribe,nombreEnDondeGuardarlo,longNombreEnDondeGuardarlo);


	//uint32_t tamanioPaquete;
	//recv(socketQueEscribe, &tamanioPaquete, sizeof(tamanioPaquete),0);
	//printf("recibi el tamanioPaquete: %d\n", tamanioPaquete);
	//char* mensajeSerializado = malloc(tamanioPaquete);
	//recibir(socketQueEscribe,mensajeSerializado, tamanioPaquete);
	//t_list* listaNodoNombres = deserializarOrdenDeReduce(mensajeSerializado);

	t_list* listaNodoNombres = recibirEstructurasDelNodo(socketQueEscribe);

	char* identificador = string_itoa(socketQueEscribe);
	char* nombre = "reducer.pl";
	//logearOrdenReduce(identificador,nombre);
	string_append(&identificador,nombre);

	char respuesta = ejecutarReduce(identificador,nombreEnDondeGuardarlo,listaNodoNombres);

	enviarRespuestaDelMapAlJob(respuesta,socketQueEscribe);

	free(nombreEnDondeGuardarlo);
	list_destroy_and_destroy_elements(listaNodoNombres, (void*) estructuraN_destroy);
}
Esempio n. 10
0
void procesarReaddir(t_log *s_log,t_socket_client *client,void *buffer,Superblock *sb, Group_descriptor *bgdt,FILE *ext2fs){

	void *path;
	uint32_t nroInodo;
	size_t block_size = 1024 << sb->s_log_block_size;
	t_list *listaDir;
	SerReadDir_resp respuesta;

	pthread_mutex_lock(&mt_log);
		log_debug(s_log,"El Cliente ID: %d solicito READDIR: %s",client->socket->desc,(char *)buffer);
	pthread_mutex_unlock(&mt_log);
	path = (char *)buffer; //payload = path
	nroInodo = Dir_buscarPath(ext2fs,path,sb->s_inodes_per_group,bgdt,block_size);
	if(nroInodo==0) { //el path no se encontro
		procesarError(client);
	}else{
		Sincro_monitorLock(nroInodo,listaInodos,TIPOREAD);
			listaDir = Dir_listar(ext2fs,nroInodo,sb->s_inodes_per_group,bgdt,block_size);
		Sincro_monitorUnlock(nroInodo,listaInodos);
		respuesta = serializar_readdir_Rta(listaDir);
		sockets_send(client,respuesta.paquete,respuesta.tamano+HEADERSIZE);
		list_destroy_and_destroy_elements(listaDir,(void *) Dir_destroy);
		free(respuesta.paquete);
	}
	free(path);
}
Esempio n. 11
0
int removerPersonaje(header_t *header, datos_planificador_t *datosPlan,
		char *motivo) {
	int nbytes = 0;
	char *data = malloc(header->length);
	nbytes = recv(datosPlan->sockfdNivel, data, header->length, MSG_WAITALL);
	char idPersonaje;
	memcpy(&idPersonaje, data, sizeof(char));
	t_list *recursosLiberados = listaRecursos_deserializer(data + sizeof(char),
			header->length - sizeof(char));
	free(data);
	datos_personaje_t *personajeMuerto = removerPersonajePorSimbolo(datosPlan,
			idPersonaje);
	t_list *recursosUsados = desbloquearPersonajes(recursosLiberados,
			datosPlan);
	nbytes = informarRecursosUsados(recursosUsados, datosPlan);
	list_destroy_and_destroy_elements(recursosUsados, (void *) free);

	if (personajeMuerto == NULL )
		log_warning(logFile, "Personaje %c muerto no encontrado.", idPersonaje);
	else {
		nbytes = notificarMuertePersonaje(personajeMuerto, datosPlan);
		log_info(logFile, "Personaje %c muerto por %s.",
				personajeMuerto->simbolo, motivo);
		FD_CLR(personajeMuerto->sockfd, datosPlan->bagMaster);
		close(personajeMuerto->sockfd);
		datosPersonaje_destroy(personajeMuerto);
	}

	return nbytes;
}
int main(int argc, char*argv[]) {

	pthread_mutex_init(&semModificadorDeVidas, NULL);
	sem_init(&semReinicio, 0, 0);
	sem_init(&semFinPlan, 0, 0);

	// Inicializa el log.
	logger = logInit(argv, "PERSONAJE");

	if (signal(SIGINT, muertoPorSenial) == SIG_ERR) {
		log_error(logger, "Error en el manejo de la senal de muerte del personaje.\n", stderr);
		exit(EXIT_FAILURE);
	}

	if (signal(SIGTERM, restarVida) == SIG_ERR) {
		log_error(logger, "Error en el manejo de la senal de restar vidas del personaje.\n", stderr);
		exit(EXIT_FAILURE);
	}

	if (signal(SIGUSR1, sig_aumentar_vidas) == SIG_ERR) {
		log_error(logger, "Error en el manejo de la senal de de aumentar vidas del personaje.\n", stderr);
		exit(EXIT_FAILURE);
	}

	// Creamos el archivo de Configuración
	cargarArchivoConfiguracion(argv[1]);
	//Me conecto con la plataforma para despues de terminar todos los niveles correctamente avisarle
	socketOrquestador = connectToServer(ip_plataforma, atoi(puerto_orq), logger);
	log_debug(logger, "El personaje se conecto con el orquestador");

	//vuelve a tirar todos los hilos por todos los niveles

	do {
		log_debug(logger, "Tiro los hilos para jugar en cada nivel");

		reiniciar = false;

		crearTodosLosHilos();

		sem_wait(&semReinicio);
		sem_wait(&semFinPlan);
		//Ya terminaron todos los hilos. Si murio el ultimo me va a decir que reinicie o no.
		if (reiniciar) {
			liberarHilos();
			log_debug(logger, "El personaje %c termina su conexion y reinicia todos los niveles", personaje.simbolo);
		}

	} while (reiniciar);

	notificarFinPlanNiveles();

	cerrarConexion(&socketOrquestador);
	log_debug(logger, "El personaje se desconecto del orquestador");

	log_destroy(logger);
	config_destroy(configPersonaje);
	list_destroy_and_destroy_elements(personaje.lPersonajes, (void*) _liberar_personaje_individual);
	exit(EXIT_SUCCESS);

}
Esempio n. 13
0
void openFileListDestroy(open_file_list_t* list) {
    pthread_mutex_lock(&list->mutex);
    list_destroy_and_destroy_elements(list->open_file_list,
                                      open_file_destroyer);
    pthread_mutex_unlock(&list->mutex);
    pthread_mutex_destroy(&list->mutex);
    free(list);
}
Esempio n. 14
0
void freeFile(t_file *file) {
	if (file->path) {
		free(file->path);
	}

	list_destroy_and_destroy_elements(file->blocks, (void *) freeCopies);
	free(file);
}
void liberaMemoriaInformacionArchivo(
		t_informacionDelArchivo* ptrInformacionArchivo) {
	free(ptrInformacionArchivo->nombreArchivo);
	list_destroy_and_destroy_elements(
			ptrInformacionArchivo->listaUbicacionBloques,
			(void*) liberaMemoriaInformacionArchivo);
	free(ptrInformacionArchivo);
}
Esempio n. 16
0
void spock_destroy(t_spock* spock) {
	if (spock != NULL) {
		free(spock->nombre);
		mascota_destroy(spock->mascota);
		mision_destroy(spock->mision);
		list_destroy_and_destroy_elements(spock->villanos, (void*) villano_destroy);
		free(spock);
	}
}
void finish(){
	// crear una funcion que libere BIEN el job de la lista, que incluya diccionario..
	list_destroy_and_destroy_elements(lista_jobs, (void*)free);
	dictionary_clean_and_destroy_elements(mapa_nodos, (void*)free);
	pthread_mutex_destroy(&mutex_mapa_nodos);
	pthread_mutex_destroy(&mutex_lista_jobs);
	log_destroy(LOGGER);
	config_destroy(CONF);
}
Esempio n. 18
0
void freeReduce(t_reduce *reduce) {
	if (reduce->finalNode != NULL) {
		free(reduce->finalNode);
	}
	if (reduce->nodeIP != NULL) {
		free(reduce->nodeIP);
	}
	list_destroy_and_destroy_elements(reduce->temps, (void *) freeTemp);
	free(reduce);
}
Esempio n. 19
0
void freeMaRTA() {
	if (cfgMaRTA->fsIP) {
		free(cfgMaRTA->fsIP);
	}
	free(cfgMaRTA);
	list_destroy_and_destroy_elements(nodes, (void *) freeNode);
	pthread_mutex_destroy(&McantJobs);
	pthread_mutex_destroy(&Mnodes);
	log_destroy(logger);
	exit(0);
}
Esempio n. 20
0
bool filesystem_format() {
	log_info(mdfs_logger, "Format FS.");
	if (mongo_dir_deleteAll() && mongo_file_deleteAll()) {
		t_list *nodes = mongo_node_getAll();

		list_iterate(nodes, (void *) filesystem_formatNode);
		list_destroy_and_destroy_elements(nodes, (void *) node_free);

		return 1;
	}
	return 0;
}
Esempio n. 21
0
int gestionarDesbloqueoPersonajes(header_t *header,
		datos_planificador_t *datosPlan) {
	int nbytes = 0;

	if (header->length == 0) {
		nbytes = informarRecursosUsados(NULL, datosPlan);
	} else {
		char *data = malloc(header->length);
		nbytes = recv(datosPlan->sockfdNivel, data, header->length,
				MSG_WAITALL);
		t_list *recursosLiberados = listaRecursos_deserializer(data,
				header->length);
		free(data);
		t_list *recursosUsados = desbloquearPersonajes(recursosLiberados,
				datosPlan);
		nbytes = informarRecursosUsados(recursosUsados, datosPlan);
		list_destroy_and_destroy_elements(recursosUsados, (void *) free);
		list_destroy_and_destroy_elements(recursosLiberados, (void *) free);
	}

	return nbytes;
}
Esempio n. 22
0
int main(int argc, char** argv) {

	//Verifico que se haya recibido por parámetro el archivo config.
	printf("%s", argv[1]);
	if (argc <= 1) {
		perror(
				"Se debe ingresar la dirección de un archivo de configuración\n");
		return EXIT_FAILURE;
	}

	t_config *config = config_create(argv[1]);

	//Verifico que estén todos los valores esperados en el config.
	if (validarConfig(config)) {
		config_destroy(config);
		perror("El archivo de configuración no es correcto");
		return EXIT_FAILURE;
	}

	//Cargo parámetros del config en variables de UMV.
	cargarConfig(config);
	//Creo Log.
	logger = log_create("logUmv", "UMV", false, LOG_LEVEL_TRACE);
	log_info(logger, "Comienza la ejecución de la UMV.");

	baseUMV = malloc(tamanoUMV);
	listaProcesos = list_create();
	int* sinParametros=baseUMV;
	//Creo hilo que atiende a la consola.
	if (pthread_create(&atencion_consola, NULL, (void *) consola, (void*)sinParametros )) {
		log_error(logger, "Hubo un error en la creación del hilo de consola");
	} else {
		log_info(logger, "El hilo de consola se creó correctamente");
	}

	//Creo hilo que creará hilos que atienden al kernel/cpu's.
	if (pthread_create(&atencion_interna, NULL, (void *) atencionInterna,
			(void*)sinParametros )) {
		log_error(logger, "Hubo un error en la creación del hilo de atención interna");
	} else {
		log_info(logger, "El hilo de atención interna se creó correctamente");
	}
	pthread_join(atencion_consola,NULL);
	pthread_join(atencion_interna,NULL);
	list_destroy_and_destroy_elements(listaProcesos, (void*)free);
	config_destroy(config);
	log_info(logger, "El proceso UMV ha finalizado");
	log_destroy(logger);
	return EXIT_SUCCESS;
}
Esempio n. 23
0
bool hayCaja(int x, int y){
	int i = 0;
	bool hay = false;
	tRecursosNivel * recurso;
	t_list * listaRecursosNivel = obtenerListaCajas();

	while(i< list_size(listaRecursosNivel) && !hay){
		recurso = list_get(listaRecursosNivel, i);
		if (recurso->posX == x && recurso->posY == y)
			hay = true;
		i++;
	}

	list_destroy_and_destroy_elements(listaRecursosNivel, (void*)recurso_destroy);

	return hay;
}
/**
 * @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);
}
Esempio n. 25
0
t_list * buscarPersonajesAtacables(){
	int i;
	int j;
	t_personaje_niv1 * personaje;
	tRecursosNivel * caja;
	bool encontrado;
	t_list * listaPersonajesAtacablesUbicaciones;
	t_list * listaRecursosNivel;
	t_list * lista = list_create();

	listaPersonajesAtacablesUbicaciones = obtenerListaPersonajesAtacables();
	listaRecursosNivel = obtenerListaCajas();

	int cantPersonajesEnNivel = list_size(listaPersonajesAtacablesUbicaciones);
	int cantCajas = list_size(listaRecursosNivel);

	if (cantPersonajesEnNivel > 0){
		for(i=0;i<cantPersonajesEnNivel;i++){
			personaje = list_get(listaPersonajesAtacablesUbicaciones,i);

			encontrado = false;
			j=0;
			while (j<cantCajas && !encontrado){
				caja = list_get(listaRecursosNivel, j);

				if (personajeEstaEnCaja(personaje, caja->posX, caja->posY))
					encontrado = true;
				j++;
			}

			if(!encontrado)
				list_add(lista,personaje);
			else
				personaje_destroy(personaje);

		}
	}

	list_destroy(listaPersonajesAtacablesUbicaciones);
	list_destroy_and_destroy_elements(listaRecursosNivel, (void*)recurso_destroy);
	return lista;
}
Esempio n. 26
0
void tratarFinalizacionPersonaje(char* data) {
//  TODO: REvisar con plataforma
	char pId;
	t_list* adquiridos = NULL;
//	t_list* asignados = NULL;

	pId = data[0];
	log_info(logFile, "Matando personaje..");
	adquiridos = getObjetosAdquiridosSerializable(listaPersonajes, pId);
	log_error(logFile, "Saco %c de listaPersonajes.", pId);
	matarPersonaje(listaPersonajes, listaRecursos, pId, logFile);
	mandarRecursosLiberados(adquiridos);
//	asignados = esperarRecursosAsignadosMain();
//	actualizarEstado(asignados);
//	listaRecursos_destroy(adquiridos);
//	listaRecursos_destroy(asignados);
//	log_info(logFile, "El personaje: %c, finalizo el nivel", pId);
//	dibujar();
	list_destroy_and_destroy_elements(adquiridos, (void *)free);
}
void handler_crear_segmento(uint32_t *respuesta, char *orden, t_param_memoria *parametros_memoria, char **savePtr1, t_log *logger)
{
	char *id_prog = strtok_r(NULL, ",", savePtr1);
	char *tamanio = strtok_r(NULL, ",", savePtr1);
	
	pthread_mutex_lock(&op_atomica);
		void *mem_ppal = parametros_memoria->mem_ppal;
		uint32_t tamanio_mem_ppal = parametros_memoria->tamanio_mem_ppal;
		t_list *lista_segmentos = parametros_memoria->listaSegmentos;
		char *algoritmo_compactacion = parametros_memoria->algoritmo_comp;

		t_list *espacios_libres = buscarEspaciosLibres(lista_segmentos, mem_ppal, tamanio_mem_ppal);
		*respuesta = crearSegmento(atoi(id_prog), atoi(tamanio), espacios_libres, lista_segmentos, algoritmo_compactacion);

		if(*respuesta == 0){
			log_info(logger, "[ATENCION_CONN] No hay espacio para este segmento. Voy a intentar compactar.");
			compactar(lista_segmentos, mem_ppal, tamanio_mem_ppal);

			if (!list_is_empty(espacios_libres)) {
				list_clean_and_destroy_elements(espacios_libres, eliminarEspacioLibre);
			}

			list_destroy(espacios_libres);

			espacios_libres = buscarEspaciosLibres(lista_segmentos, mem_ppal, tamanio_mem_ppal);
			*respuesta = crearSegmento(atoi(id_prog), atoi(tamanio), espacios_libres, lista_segmentos, algoritmo_compactacion);

			if((*respuesta == 0) || (respuesta == NULL))
				log_info(logger, "[ATENCION_CONN] No hay lugar para crear un segmento, incluso después de haber compactado la memoria.");
		}

		list_destroy_and_destroy_elements(espacios_libres, eliminarEspacioLibre);
	pthread_mutex_unlock(&op_atomica);

	if(respuesta == NULL)
		log_info(logger, "[ATENCION_CONN] RESPUESTA ES NULL!!!! QUE CARAJO PASÓ???");

	log_info(logger, "[ATENCION_CONN] La respuesta al comando crear_segmento será: %d.", *respuesta);
	return;
}
Esempio n. 28
0
int main(int argc, char *argv[]) {
	logger = log_create("MaRTA.log", "MaRTA", 1, log_level_from_string("TRACE"));
	cantJobs = 0;
	if (argc != 2) {
		log_error(logger, "Missing config file");
		freeMaRTA();
		return EXIT_FAILURE;
	}
	if (!initConfig(argv[1])) {
		log_error(logger, "Config failed");
		freeMaRTA();
		return EXIT_FAILURE;
	}

	nodes = list_create();
	signal(SIGINT, freeMaRTA);

	initConnection();

	list_destroy_and_destroy_elements(nodes, (void *) freeNode);
	freeMaRTA();
	return EXIT_SUCCESS;
}
void liberaMemoriaTareaMap(t_tareaMap* ptrTareaMap) {
	free(&ptrTareaMap->dirMapExec);
	list_destroy_and_destroy_elements(ptrTareaMap->listaRelacionNodoBloque,
									  (void*) liberaMemoriaRelacionNodoBloque);
	free(ptrTareaMap);
}
void liberaMemoriaTareaReduce(t_tareaReduce* ptrTareaReduce) {
	free(&ptrTareaReduce->dirReduceExec);
	list_destroy_and_destroy_elements(ptrTareaReduce->listaRelacionNodoArchTemp,
									  (void*) liberaMemoriaRelacionNodoArchTemp);
	free(ptrTareaReduce);
}