void _destruyo_proceso(proceso_msp_t* proceso, direccion base, bool* ok)
	{
		(*ok) = quitar_segmento(proceso, base);
		list_destroy(proceso->segmentos);
		liberar_marcos_proceso(proceso->pid);
		list_remove_and_destroy_by_condition(get_lista_procesos(), (void*) _es_proceso, (void*) _destruyo_proc);
	}
// ver de notificar que elimino un job, blah
void job_eliminar(int fdJob, header_t header){
	bool buscarJobPorFd(void* element){
		return ((t_job*)element)->fd == fdJob;
	}
	pthread_mutex_lock(&mutex_lista_jobs);
	list_remove_and_destroy_by_condition(lista_jobs, (void*)job_buscar_por_fd, (void*)job_liberar);
	pthread_mutex_unlock(&mutex_lista_jobs);

}
void openFileListRemoveAndDestroy(open_file_list_t* list, open_file_t* file) {
    bool cmpOfPaths(open_file_t* openFile) {
        if (strlen(file->path) == strlen(openFile->path)) {
            if (strncmp(file->path, openFile->path, strlen(file->path) + 1)
                    == 0) {
                return true;
            }
        }
        return false;
    }
    list_remove_and_destroy_by_condition(list->open_file_list, cmpOfPaths,
                                         open_file_destroyer);
}
int32_t hiloEjecucionCPU(t_HiloCPU* paramsCPU)
{
	log_info(MemoriaLog,"Esperando pedidos de Cpu \n");

	int32_t codigoOperacion;
	codigoOperacion = recibirCodigoOperacion(paramsCPU->cpuSocket);
	if(codigoOperacion==-1)	{
		log_error(MemoriaLog, RED"No se recibió correctamente el código de operación\n"RESET);
		return EXIT_FAILURE;
	}
	while(codigoOperacion!=0) 	{

		switch(codigoOperacion)	{
		case codigo_iniciar:
			iniciar(paramsCPU->cpuSocket, paramsCPU->swapSocket);
			break;
		case codigo_finalizar:
			finalizar(paramsCPU->cpuSocket, paramsCPU->swapSocket);
			break;
		case codigo_leer:
			lectura(paramsCPU->cpuSocket, paramsCPU->swapSocket);
			break;
		case codigo_escribir:
			escritura(paramsCPU->cpuSocket, paramsCPU->swapSocket);
			break;
		}

		codigoOperacion = recibirCodigoOperacion(paramsCPU->cpuSocket);
		if(codigoOperacion==-1) {
			log_error(MemoriaLog, RED"No se recibió correctamente el código de operación\n"RESET);
			return EXIT_FAILURE;
		}
	}

	if(codigoOperacion==0){
		log_info(MemoriaLog, "Se desconectó un CPU\n");
		bool PorCerrado(sock_t* socket){
			return socket->fd==0;
		}
		int32_t veces = list_count_satisfying(CPUsConectados,(void*)PorCerrado);
		int32_t it;
		for(it=0; it<veces; it++){
			list_remove_and_destroy_by_condition(CPUsConectados, (void*)PorCerrado, (void*)clean_socket);
		}
	}
int compactacion() {

	t_link_element* nodo;
	t_link_element* nodoSiguiente;
	t_link_element* nodoAnterior;
	t_segmento* segmentoLibre;	//segmento libre
	t_segmento* segmentoReservado;	//segmento ocupado
	t_segmento* segmentoSiguiente;
	t_segmento* segmentoCero;
	t_segmento* segmento;
	t_segmento* segmentoSiguienteAlLibre;
	t_segmento* segmentoAnterior;
	pthread_mutex_lock(&escribirListaUMV);

	int diferenciaEntreSegmentos = 0;
	int cantidadDeSegmentosDeDiferencia = 0;
	int i;
	segmentoCero = list_get(UMV, 0);

	if (UMV->elements_count != 1) {
		nodo = UMV->head->next;
	} else
		goto error;
	segmento = nodo->data;

	while (nodo != NULL ) {
		libre: if (segmento->segmentoReservado == 0) {

			//Preparo el ambiente para poder realizar las operaciones

			segmentoLibre = segmento;

			//Busco el primer segmento reservado para subirlo a la posicion del segmento libre

			nodoSiguiente = nodo->next;

			if (nodoSiguiente == NULL )
				goto error;

			segmentoSiguiente = nodoSiguiente->data;
			segmentoSiguienteAlLibre = nodoSiguiente->data;

			//Busco el primer segmento reservado
			while (segmentoSiguiente->segmentoReservado != 1) {
				nodoSiguiente = nodoSiguiente->next;
				if (nodoSiguiente == NULL )
					goto error;
				segmentoSiguiente = nodoSiguiente->data;/*CORREGIDO*///CORREGIR, NO AVANZA,SIEMPRE ES EL MISMO NODO
				++cantidadDeSegmentosDeDiferencia;
			}
			//Encontre el segmento reservado
			segmentoReservado = segmentoSiguiente;

			//Me fijo si el segmento reservado es el siguiente al libre

			if (segmentoReservado == segmentoSiguienteAlLibre) {

				//Si es igual, y el segmento libre es mayor al reservado
				if (segmentoLibre->size > segmentoReservado->size) {
					void* posHacia;
					void* posDesde;
					posHacia = segmentoLibre->posMemoria;
					posDesde = segmentoReservado->posMemoria;
					memcpy(posHacia, posDesde, segmentoReservado->size);
					diferenciaEntreSegmentos = segmentoLibre->size
							- segmentoLibre->size;

					segmentoLibre->size = segmentoLibre->size
							- diferenciaEntreSegmentos;
					segmentoLibre->posInicial = segmentoReservado->posInicial;
					segmentoLibre->segmentoReservado = 1;
					segmentoLibre->pid = segmentoReservado->pid;

					segmentoReservado->posInicial =
							segmentoReservado->posInicial
									- diferenciaEntreSegmentos;
					segmentoReservado->posMemoria =
							segmentoReservado->posMemoria
									- diferenciaEntreSegmentos;

					/*ultima modificacion*/
					segmentoReservado->size = segmentoReservado->size + diferenciaEntreSegmentos;

					segmentoReservado->pid = -1;
					segmentoReservado->segmentoReservado = 0;

				} else {
					//el segmento libre es mas chico que el segmento reservado, debo agrandar el libre y achicar el ocupado

					if (segmentoLibre->size < segmentoReservado->size) {
						void* posHacia;
						void* posDesde;
						posHacia = segmentoLibre->posMemoria;
						posDesde = segmentoReservado->posMemoria;
						memcpy(posHacia, posDesde, segmentoReservado->size);
						diferenciaEntreSegmentos = segmentoReservado->size
								- segmentoLibre->size;

						segmentoLibre->size = segmentoLibre->size
								+ diferenciaEntreSegmentos;
						segmentoLibre->posInicial =
								segmentoReservado->posInicial;
						segmentoLibre->segmentoReservado = 1;
						segmentoLibre->pid = segmentoReservado->pid;

						segmentoReservado->posInicial =
								segmentoReservado->posInicial
										+ diferenciaEntreSegmentos;
						segmentoReservado->posMemoria =
								segmentoReservado->posMemoria
										+ diferenciaEntreSegmentos;
						segmentoReservado->size = segmentoReservado->size
								- diferenciaEntreSegmentos;

						segmentoReservado->pid = -1;
						segmentoReservado->segmentoReservado = 0;

					} else {
						//Los segmentos son iguales
						void* posHacia;
						void* posDesde;
						posHacia = segmentoLibre->posMemoria;
						posDesde = segmentoReservado->posMemoria;
						memcpy(posHacia, posDesde, segmentoReservado->size);

						segmentoLibre->posInicial =
								segmentoReservado->posInicial;
						segmentoLibre->segmentoReservado = 1;
						segmentoLibre->pid = segmentoReservado->pid;

						segmentoReservado->pid = -1;
						segmentoReservado->segmentoReservado = 0;
						segmentoReservado->posInicial =
								segmentoReservado->posInicial + 1;// pos inicial es ilustrativo,
																  //no me dice nada mas que el id del segmento
					}

				}

			} else {
				/*HAY UNO O MAS SEGMENTOS DE DIFERENCIA ENTRE EL LIBRE Y EL RESERVADO
				 * LIBRE LIBRE RESERVADO*/
				//distino al siguiente
				if (segmentoLibre->size > segmentoReservado->size) {
					void* posHacia;
					void* posDesde;
					posHacia = segmentoLibre->posMemoria;
					posDesde = segmentoReservado->posMemoria;
					memcpy(posHacia, posDesde, segmentoReservado->size);
					diferenciaEntreSegmentos = segmentoLibre->size
							- segmentoReservado->size;

					segmentoLibre->size = segmentoLibre->size
							- diferenciaEntreSegmentos;
					segmentoLibre->posInicial = segmentoReservado->posInicial;
					segmentoLibre->segmentoReservado = 1;
					segmentoLibre->pid = segmentoReservado->pid;

					segmentoSiguienteAlLibre->posInicial =  //cambiado
							segmentoSiguienteAlLibre->posInicial
									- diferenciaEntreSegmentos;
					segmentoSiguienteAlLibre->posMemoria =
							segmentoSiguienteAlLibre->posMemoria
									- diferenciaEntreSegmentos;
					segmentoSiguienteAlLibre->size =
							segmentoSiguienteAlLibre->size
									+ diferenciaEntreSegmentos;

					segmentoReservado->pid = -1;
					segmentoReservado->segmentoReservado = 0;

				} else {
					if (segmentoLibre->size == segmentoReservado->size) {
						void* posHacia;
						void* posDesde;
						posHacia = segmentoLibre->posMemoria;
						posDesde = segmentoReservado->posMemoria;
						memcpy(posHacia, posDesde, segmentoReservado->size);

						segmentoLibre->posInicial =
								segmentoReservado->posInicial;
						segmentoLibre->segmentoReservado = 1;
						segmentoLibre->pid = segmentoReservado->pid;

						segmentoReservado->pid = -1;
						segmentoReservado->segmentoReservado = 0;
						segmentoReservado->posInicial =
								segmentoReservado->posInicial + 1;
					} else {
						if (segmentoLibre->size < segmentoReservado->size) {
							//segmentolibre menor al segmento reservado
							//Ya sabemos que debemos ocupar el libre y por lo menos el siguiente al libre
							void* posHacia;
							void* posDesde;
							posHacia = segmentoLibre->posMemoria;
							posDesde = segmentoReservado->posMemoria;
							memcpy(posHacia, posDesde, segmentoReservado->size);
							diferenciaEntreSegmentos = segmentoReservado->size
									- segmentoLibre->size;
							//ocupar el segmento libre
							segmentoLibre->posInicial =
									segmentoReservado->posInicial;
							segmentoLibre->segmentoReservado = 1;
							segmentoLibre->pid = segmentoReservado->pid;
							segmentoLibre->size = segmentoReservado->size;
							//empezar a restar de los segmentos siguientes
							for (i = 0; i <= cantidadDeSegmentosDeDiferencia;//revisar acá
									++i) {
								if (segmentoSiguienteAlLibre->size
										> diferenciaEntreSegmentos/*ultima modificacion*/) {
									//Termino aca y achico
									segmentoSiguienteAlLibre->size =
											segmentoSiguienteAlLibre->size
													- diferenciaEntreSegmentos;
									segmentoSiguienteAlLibre->posInicial =
											segmentoSiguienteAlLibre->posInicial
													+ diferenciaEntreSegmentos;
									segmentoSiguienteAlLibre->posMemoria =
											segmentoSiguienteAlLibre->posMemoria
													+ diferenciaEntreSegmentos;
									segmentoReservado->pid = -1;
									segmentoReservado->segmentoReservado = 0;
									break;

								} else {
									if (segmentoSiguienteAlLibre->size
											< diferenciaEntreSegmentos) {/*ULTIMA MODIFICACION*/
										diferenciaEntreSegmentos =
												diferenciaEntreSegmentos
														- segmentoSiguienteAlLibre->size;

										nodoSiguiente = nodo->next;

										nodoAnterior = nodoSiguiente;
										segmentoAnterior = nodoAnterior->data;

										nodoSiguiente = nodoSiguiente->next;
										segmentoSiguienteAlLibre =
												nodoSiguiente->data;

										bool _destructorSegmentoConsumido(
												t_segmento* segmentoADestruir) {
											return segmentoADestruir->posInicial
													== segmentoAnterior->posInicial
													&& segmentoADestruir->size/*CAMBIE ACA*/
															== segmentoAnterior->size;
										}
										list_remove_and_destroy_by_condition(
												UMV,
												(void*) _destructorSegmentoConsumido,
												free);

										//Lo ocupo y disminuyo la difDeSegmentos,
										//tomo el siguiente para ver si está ocupado , elimino
									} else {					// son iguales
										segmentoReservado->pid = -1;
										segmentoReservado->segmentoReservado =
												0;

										bool _destructorSegmentoConsumido(
												t_segmento* segmentoADestruir) {
											return segmentoADestruir->posInicial
													== segmentoSiguienteAlLibre->posInicial
													&& segmentoADestruir->posInicial
															== segmentoSiguienteAlLibre->size;
										}
										list_remove_and_destroy_by_condition(
												UMV,
												(void*) _destructorSegmentoConsumido,
												free);
										break;
									}

								}

							}

						}
					}
				}