void* conectarseConWorkerRedGlobal(void* params){
	parametrosReduccionGlobal* parametrosConexion= malloc(sizeof(parametrosReduccionGlobal));
	respuestaReduccionGlobal* infoRedGlobal =(respuestaReduccionGlobal*) params;
	respuesta confirmacionWorker;

	int socketWorker = crearSocket();
	struct sockaddr_in direccion = cargarDireccion(infoRedGlobal->ip.cadena,infoRedGlobal->puerto);
	if(!conectarCon(direccion, socketWorker, 2)){//2 id master
		mandarFalloEnReduccion();
		return 0;
	}

	log_trace(loggerMaster, "Inicio Red. Global con Worker %d para Job %d", infoRedGlobal->numero, infoRedGlobal->job);

	struct stat fileStat;
	if(stat(miJob->rutaReductor.cadena,&fileStat) < 0){
		printf("No se pudo abrir el archivo\n");
		return 0;
	}

	int fd = open(miJob->rutaReductor.cadena,O_RDWR);
	int size = fileStat.st_size;

	parametrosConexion->contenidoScript.cadena = mmap(NULL,size,PROT_READ,MAP_SHARED,fd,0);
	parametrosConexion->contenidoScript.longitud = size;
	parametrosConexion->archivoTemporal.cadena = strdup(infoRedGlobal->archivoTemporal.cadena);
	parametrosConexion->archivoTemporal.longitud = infoRedGlobal->archivoTemporal.longitud;
	parametrosConexion->infoWorkers = list_create();
	list_add_all(parametrosConexion->infoWorkers,infoRedGlobal->parametros->infoWorkers);

	empaquetar(socketWorker, mensajeProcesarRedGlobal, 0, parametrosConexion);

	confirmacionWorker = desempaquetar(socketWorker);

	if (munmap(parametrosConexion->contenidoScript.cadena, parametrosConexion->contenidoScript.longitud) == -1){
		perror("Error un-mmapping the file");
		exit(EXIT_FAILURE);
	}
	close(fd);

	switch(confirmacionWorker.idMensaje){
		case mensajeOk:
		case mensajeRedGlobalCompleta:
			log_trace(loggerMaster, "Informo YAMA fin de Reduccion Global en nodo %i",infoRedGlobal->numero);
			empaquetar(socketYama, mensajeRedGlobalCompleta, 0 , 0);
			estadisticas->cantTareas[RED_GLOBAL]++;
			finalizarTiempo(estadisticas->tiempoFinRedGlobal,infoRedGlobal->numero);
			break;

		case mensajeDesconexion:
		case mensajeFalloRedGlobal:
			log_trace(loggerMaster, "Informo a  YAMA fallo en Reduccion Global del nodo %d.",infoRedGlobal->numero);
			estadisticas->cantFallos++;
			mandarFalloEnReduccion();
			break;
	}

	return 0;
}
void* conectarseConWorkersTransformacion(void* params) {
	parametrosTransformacion* infoTransformacion= (parametrosTransformacion*)params;
	respuesta confirmacionWorker;
	bloqueYNodo* bloqueOK;

	int socketWorker = crearSocket();
	struct sockaddr_in direccion = cargarDireccion(infoTransformacion->ip.cadena,infoTransformacion->puerto);
	if(!conectarCon(direccion, socketWorker, 2)){//2 id master
		mandarAReplanificar(infoTransformacion);
		return 0;

	}

	log_trace(loggerMaster, "Conexion con Worker %d para bloque %d", infoTransformacion->numero, infoTransformacion->bloquesConSusArchivos.numBloque);

	struct stat fileStat;
	if(stat(miJob->rutaTransformador.cadena,&fileStat) < 0){
		printf("No se pudo abrir el archivo\n");
		return 0;
	}

	int fd = open(miJob->rutaTransformador.cadena,O_RDWR);
	int size = fileStat.st_size;

	infoTransformacion->contenidoScript.cadena = mmap(NULL,size,PROT_READ,MAP_SHARED,fd,0);
	infoTransformacion->contenidoScript.longitud = size;

	empaquetar(socketWorker, mensajeProcesarTransformacion, 0, infoTransformacion);

	confirmacionWorker = desempaquetar(socketWorker);

	if (munmap(infoTransformacion->contenidoScript.cadena, infoTransformacion->contenidoScript.longitud) == -1){
		perror("Error un-mmapping the file");
		exit(EXIT_FAILURE);
	}
	close(fd);

	switch(confirmacionWorker.idMensaje){

		case mensajeTransformacionCompleta:
			log_trace(loggerMaster, "Informo a YAMA fin Transformacion para bloque %d en nodo %d.",infoTransformacion->bloquesConSusArchivos.numBloque,infoTransformacion->numero);
			bloqueOK = malloc(sizeof(bloqueYNodo));
			bloqueOK->workerId = infoTransformacion->numero;
			bloqueOK->bloque = infoTransformacion->bloquesConSusArchivos.numBloque;
			empaquetar(socketYama, mensajeTransformacionCompleta, 0 , bloqueOK);
			finalizarTiempo(estadisticas->tiempoFinTrans,bloqueOK->bloque);
			estadisticas->cantTareas[TRANSFORMACION]++;
			free(bloqueOK);
			break;

		case mensajeDesconexion:
			mandarAReplanificar(infoTransformacion);
			break;


	}
	return 0;
}
void* conectarseConWorkersRedLocal(void* params){
	parametrosReduccionLocal* infoRedLocal= (parametrosReduccionLocal*)params;
	respuesta confirmacionWorker;
	int numeroNodo;

	int socketWorker = crearSocket();
	struct sockaddr_in direccion = cargarDireccion(infoRedLocal->ip.cadena,infoRedLocal->puerto);
	if(!conectarCon(direccion, socketWorker, 2)){//2 id master
		mandarFalloEnReduccion();
		return 0;

	}

	log_trace(loggerMaster, "Conexion con Worker %d para estos tmp %d", infoRedLocal->numero, list_size(infoRedLocal->archivosTemporales));

	struct stat fileStat;
	if(stat(miJob->rutaReductor.cadena,&fileStat) < 0){
		printf("No se pudo abrir el archivo\n");
		return 0;
	}

	int fd = open(miJob->rutaReductor.cadena,O_RDWR);
	int size = fileStat.st_size;

	infoRedLocal->contenidoScript.cadena = mmap(NULL,size,PROT_READ,MAP_SHARED,fd,0);
	infoRedLocal->contenidoScript.longitud = size;

	empaquetar(socketWorker, mensajeProcesarRedLocal, 0, infoRedLocal);

	confirmacionWorker = desempaquetar(socketWorker);

	if (munmap(infoRedLocal->contenidoScript.cadena, infoRedLocal->contenidoScript.longitud) == -1){
		perror("Error un-mmapping the file");
		exit(EXIT_FAILURE);
	}
	close(fd);

	switch(confirmacionWorker.idMensaje){

	case mensajeRedLocalCompleta:
		log_trace(loggerMaster, "Informo a  YAMA fin Reduccion Local en nodo %d.",infoRedLocal->numero);
		numeroNodo = *(int*)confirmacionWorker.envio;
		empaquetar(socketYama, mensajeRedLocalCompleta, 0 , &numeroNodo);
		finalizarTiempo(estadisticas->tiempoFinRedLocal,numeroNodo);
		estadisticas->cantTareas[RED_LOCAL]++;
		break;

	case mensajeDesconexion:
	case mensajeFalloRedLocal:
		log_trace(loggerMaster, "Informo a  YAMA fallo en Reduccion Local en nodo %d.",infoRedLocal->numero);
		estadisticas->cantFallos++;
		mandarFalloEnReduccion();
		break;
	}
	return 0;
}
void mandarAReplanificar(parametrosTransformacion* infoTransformacion){
	log_trace(loggerMaster, "Informo a  YAMA replanificacion nodo %d.",infoTransformacion->numero);
	bloqueYNodo* bloqueReplanificar=malloc(sizeof(bloqueYNodo));
	bloqueReplanificar->workerId = infoTransformacion->numero;
	bloqueReplanificar->bloque = infoTransformacion->bloquesConSusArchivos.numBloque;
	empaquetar(socketYama, mensajeFalloTransformacion, 0 , bloqueReplanificar);
	estadisticas->cantFallos++;
	free(bloqueReplanificar);
}
Beispiel #5
0
int main (int argc, char* argv[])
{
	int bitsPorMuestreo;
	
	if ( argc != 4 ){
		printf( "Faltan argumentos - Deben ser 3 archivos:\n" );
		printf( "  - archivo de entrada 1 (monofonico)\n" );
        printf( "  - archivo de entrada 2 (monofonico)\n" );
        printf( "  - archivo de salida (esfonico)\n" );
		system( "pause" );
		return -1;
	}
	
	printf( "Archivo fuente 1 %s\n", argv[1] );	
	printf( "Archivo fuente  2 %s\n", argv[2] );
	printf( "Archivo Destino %s\n", argv[3] );
	system( "pause" );

	cargarWAVE( &Header, &pistaEntrada1, argv[1] );
	cargarWAVE( &Header, &pistaEntrada2, argv[2] );

	bitsPorMuestreo = detectarBitsPorMuestreo( &pistaEntrada1 );
  if ( bitsPorMuestreo != detectarBitsPorMuestreo( &pistaEntrada2 ) ){
    printf( "Los archivos tienen diferente numero de bits por muestreo\n" );
  }
	empaquetar( &pistaEntrada1, bitsPorMuestreo );
	empaquetar( &pistaEntrada2, bitsPorMuestreo );

	pistaSalida.bitsPerSample = bitsPorMuestreo;
	pistaSalida.numSamples = pistaEntrada1.numSamples;
	pistaSalida.SoundLength = 2*pistaEntrada1.SoundLength;
	pistaSalida.Sample = (unsigned short*)malloc( pistaSalida.SoundLength );

	unirArchivosWAVE( pistaEntrada1.numSamples, pistaEntrada1.Sample, pistaEntrada2.Sample, pistaSalida.Sample, bitsPorMuestreo );
	corregirHeader( &Header );
	desempaquetar( &pistaSalida, bitsPorMuestreo );
	escribirWAVE( &Header, &pistaSalida, argv[3] );

	printf ("Concluy� exitosamente.\n");
	system("pause");
	return 0;
}
void* conectarseConWorkerAlmacenamiento(void* params){
	parametrosAlmacenamiento* parametrosConexion= malloc(sizeof(parametrosAlmacenamiento));
	respuestaAlmacenamiento* almacenamiento =(respuestaAlmacenamiento*) params;
	respuesta confirmacionWorker ;

	int socketWorker = crearSocket();
	struct sockaddr_in direccion = cargarDireccion(almacenamiento->ip.cadena,almacenamiento->puerto);
	if(!conectarCon(direccion, socketWorker, 2)){//2 id master
		mandarFalloEnReduccion();
		return 0;
	}

	log_trace(loggerMaster, "Inicio Almacenamiento Final con Worker %d", almacenamiento->nodo);

	parametrosConexion->rutaAlmacenamiento.longitud = miJob->rutaResultado.longitud;
	parametrosConexion->rutaAlmacenamiento.cadena= strdup(miJob->rutaResultado.cadena);
	parametrosConexion->archivoTemporal.cadena = strdup(almacenamiento->archivo.cadena);
	parametrosConexion->archivoTemporal.longitud = almacenamiento->archivo.longitud;

	empaquetar(socketWorker, mensajeProcesarAlmacenamiento, 0, parametrosConexion);

	confirmacionWorker = desempaquetar(socketWorker);

	switch(confirmacionWorker.idMensaje){
		case mensajeAlmacenamientoCompleto:
			log_trace(loggerMaster, "Informo YAMA fin de Almacenamiento Final en nodo.",almacenamiento->nodo);
			empaquetar(socketYama, mensajeAlmacenamientoCompleto, 0 , 0);
			break;
		case mensajeFalloAlmacenamiento:
		case mensajeDesconexion:
			log_trace(loggerMaster, "Informo a YAMA fallo en Almacenamiento Final del nodo %d.",almacenamiento->nodo);
			estadisticas->cantFallos++;
			empaquetar(socketYama, mensajeFalloAlmacenamiento, 0 , 0);
			break;
	}

	return 0;
}
void enviarJobAYama(job* miJob) {
	empaquetar(socketYama,mensajeSolicitudTransformacion, 0 ,miJob);
	log_trace(loggerMaster,"Enviando solicitud de etapa Transformacion a YAMA");

	respuesta respuestaYama = desempaquetar(socketYama);

	if(respuestaYama.idMensaje != mensajeOk){
		log_error(loggerMaster,"No se pudo iniciar correctamente el job");
		exit(1);
	}

	log_trace(loggerMaster, "Envio correcto de datos a Yama.");

}
Beispiel #8
0
void planificar(job* job){
	pthread_mutex_lock(&mutexJobs);
	infoNodo* worker = malloc(sizeof(infoNodo));
	pthread_mutex_unlock(&mutexJobs);
	t_list* listaNodos = list_create();
	int nodos,bloques;

	informacionArchivoFsYama* infoArchivo = recibirInfoArchivo(job);//RECIBE BLOQUES Y TAMAÑO DE FS SOBRE EL ARCHIVO DEL JOB

	llenarListaNodos(listaNodos,infoArchivo);

	if(list_is_empty(listaNodos)){
		finalizarJob(job,TRANSFORMACION,FALLO_INGRESO);
	}

	calcularDisponibilidadWorkers(listaNodos);

	worker = posicionarClock(listaNodos);//POSICIONA EL CLOCK EN EL WORKER DE MAYOR DISPONIBILIDAD

	calcularNodosYBloques(infoArchivo,&nodos,&bloques);

	bool** matrix = llenarMatrizNodosBloques(infoArchivo,nodos,bloques);

	respuestaSolicitudTransformacion* respuestaMaster = moverClock(worker, listaNodos, matrix, infoArchivo->informacionBloques,job->id);

	empaquetar(job->socketFd,mensajeRespuestaTransformacion,0,respuestaMaster);

	actualizarCargasNodos(job->id,TRANSFORMACION);

	planificarReduccionesLocales(job,matrix,respuestaMaster,nodos,bloques);

	enviarReduccionGlobalAMaster(job);

	actualizarCargasNodos(job->id,RED_GLOBAL);
	mostrarTablaDeEstados();
	esperarRespuestaReduccionDeMaster(job);

	realizarAlmacenamientoFinal(job);

	free(infoArchivo);
	free(respuestaMaster);
	free(listaNodos);
	free(worker);

	finalizarJob(job,4,OK);
}
Beispiel #9
0
void procesar_mensaje (int sock_plataforma, int nro_nivel, t_paquete paqueteAux, t_list *ListaItems, t_list *ListaPersonajes, t_configNivel datosNivel, pthread_mutex_t *mutexListaItems, pthread_mutex_t *mutexListaPersonajes, pthread_mutex_t *mutexEnemigos, t_log *logger)
{
    switch(paqueteAux.selector)
    {
    case NUEVO_PERSONAJE:
    {
        t_nuevoPersonaje *nuevoPersonaje = (t_nuevoPersonaje *) paqueteAux.datos;

        pthread_mutex_lock(mutexListaItems);
        pthread_mutex_lock(mutexListaPersonajes);
        t_personaje *personaje = (t_personaje *) malloc(sizeof(t_personaje));
        personaje->personajeID = nuevoPersonaje->personajeID;
        personaje->nivelID = nuevoPersonaje->nivelID;
        personaje->recursosAsignados = list_create();
        personaje->recursosNecesitados = list_create();
        personaje->posX = 0;
        personaje->posY = 0;
        personaje->recursoBloqueante = '\0';
        personaje->prioridad = prioridad;
        ++prioridad;
        crearListaRecursosNecesitados(nuevoPersonaje->recursosNecesitados,personaje->recursosNecesitados);

        ITEM_NIVEL *itemPersonaje = malloc(sizeof(ITEM_NIVEL));
        itemPersonaje->id = nuevoPersonaje->personajeID;
        itemPersonaje->posx = 0;
        itemPersonaje->posy = 0;
        itemPersonaje->item_type = PERSONAJE_ITEM_TYPE;

        list_add(ListaItems,itemPersonaje);
        list_add(ListaPersonajes,personaje);
        nivel_gui_dibujar(ListaItems,datosNivel.nombre);
        pthread_mutex_unlock(mutexListaItems);
        pthread_mutex_unlock(mutexListaPersonajes);

        log_info(logger, "Personaje: %c conectado.", personaje->personajeID);

        break;
    }

    case UBICACION_RECURSO:
    {
        log_info(logger, "Mensaje UBICACION_RECURSO recibido.");

        t_ubicacionRecurso *ubicacionRecurso = (t_ubicacionRecurso *) paqueteAux.datos;

        pthread_mutex_lock(mutexListaItems);
        bool _funcBuscarRecurso(ITEM_NIVEL *item) {
            return item->id == ubicacionRecurso->recursoID;
        }
        ITEM_NIVEL *itemBuscado = list_find(ListaItems,(void *)_funcBuscarRecurso);
        pthread_mutex_unlock(mutexListaItems);

        ubicacionRecurso->posX = itemBuscado->posx;
        ubicacionRecurso->posY = itemBuscado->posy;

        t_paquete *paquete = empaquetar(UBICACION_RECURSO, sizeof(t_ubicacionRecurso), ubicacionRecurso);

        if(send(sock_plataforma,paquete,sizeof(t_paquete),0) == -1)
        {
            log_error(logger, "Error al enviar mensaje UBICACION_RECURSO.");
            exit(1);
        }

        free(paquete);

        log_info(logger, "Mensaje UBICACION_RECURSO enviado.");

        break;
    }

    case UBICACION_PERSONAJE:
    {
        log_info(logger, "Mensaje UBICACION_PERSONAJE recibido.");

        t_ubicacionPersonaje *ubicacionPersonaje = (t_ubicacionPersonaje *) paqueteAux.datos;

        pthread_mutex_lock(mutexListaItems);
        pthread_mutex_lock(mutexListaPersonajes);
        bool _funcBuscarEnListaItems(ITEM_NIVEL *personaje) {
            return personaje->id == ubicacionPersonaje->personajeID;
        }
        ITEM_NIVEL *itemPersonaje = list_find(ListaItems,(void *)_funcBuscarEnListaItems);
        bool _funcBuscarEnListaPersonajes(t_personaje *personaje) {
            return personaje->personajeID == ubicacionPersonaje->personajeID;
        }
        t_personaje *personaje = list_find(ListaPersonajes,(void *)_funcBuscarEnListaPersonajes);

        if((itemPersonaje != NULL) && (personaje != NULL))
        {
            itemPersonaje->posx = ubicacionPersonaje->posX;
            itemPersonaje->posy = ubicacionPersonaje->posY;

            personaje->posX = ubicacionPersonaje->posX;
            personaje->posY = ubicacionPersonaje->posY;

            bool _funcPisarEnemigo(ITEM_NIVEL *itemEnemigo)
            {
                if(itemEnemigo->item_type == ENEMIGO_ITEM_TYPE)
                {
                    return ((itemPersonaje->posx == itemEnemigo->posx) && (itemPersonaje->posy == itemEnemigo->posy));
                }

                return false;
            }

            bool muertePorEnemigo = list_any_satisfy(ListaItems, (void *) _funcPisarEnemigo);

            if(muertePorEnemigo)
            {
                t_victimaEnemigo victimaEnemigo;
                victimaEnemigo.personajeID = itemPersonaje->id;
                victimaEnemigo.nivelID = nro_nivel;

                t_paquete *paquete = empaquetar(VICTIMA_ENEMIGO, sizeof(t_victimaEnemigo), &victimaEnemigo);

                if(send(sock_plataforma, paquete, sizeof(t_paquete), 0) == -1)
                {
                    log_error(logger, "Error al enviar mensaje VICTIMA_ENEMIGO.");
                    exit(1);
                }

                free(paquete);

                log_info(logger, "Mensaje VICTIMA_ENEMIGO enviado.");
            }

            nivel_gui_dibujar(ListaItems,datosNivel.nombre);
            pthread_mutex_unlock(mutexListaItems);
            pthread_mutex_unlock(mutexListaPersonajes);
        }

        break;
    }

    case INSTANCIA_RECURSO:
    {
        log_info(logger, "Mensaje INSTANCIA_RECURSO recibido.");

        t_instanciaRecurso *instanciaRecurso = (t_instanciaRecurso *) paqueteAux.datos;

        pthread_mutex_lock(mutexListaItems);
        pthread_mutex_lock(mutexListaPersonajes);
        bool _funcBuscarRecursoEnItems(ITEM_NIVEL *rec) {
            return rec->id == instanciaRecurso->recursoID;
        }
        ITEM_NIVEL *itemRecurso = list_find(ListaItems,(void *)_funcBuscarRecursoEnItems);

        bool _funcBuscarPersonaje(t_personaje *pers) {
            return pers->personajeID == instanciaRecurso->personajeID;
        }
        t_personaje *personaje = list_find(ListaPersonajes,(void *)_funcBuscarPersonaje);

        if(personaje != NULL)
        {
            if(itemRecurso->quantity)
            {
                --itemRecurso->quantity;

                bool _funcBuscarRecurso(t_recurso *recurso) {
                    return recurso->recursoID == instanciaRecurso->recursoID;
                }
                t_recurso *recursoAsignado = list_find(personaje->recursosAsignados, (void *) _funcBuscarRecurso);
                t_recurso *recursoNecesitado = list_find(personaje->recursosNecesitados, (void *) _funcBuscarRecurso);

                if(recursoAsignado != NULL)
                {
                    ++recursoAsignado->cantidad;
                }
                else
                {
                    t_recurso *recurso = malloc(sizeof(t_recurso));
                    recurso->recursoID = instanciaRecurso->recursoID;
                    recurso->cantidad = 1;
                    list_add (personaje->recursosAsignados, recurso);
                }

                --recursoNecesitado->cantidad;

                if(recursoNecesitado->cantidad == 0)
                {
                    list_remove_by_condition(personaje->recursosNecesitados, (void *) _funcBuscarRecurso);
                }

                if (send(sock_plataforma,&paqueteAux,sizeof(t_paquete),0) == -1)
                {
                    log_error(logger, "Error al enviar mensaje RESPUESTA.");
                    exit(1);
                }

                log_info(logger, "Mensaje INSTANCIA_RECURSO enviado.");

            }
            else
            {
                personaje->recursoBloqueante = instanciaRecurso->recursoID;
            }
        }
void mandarFalloEnReduccion(){
	estadisticas->cantFallos++;
	empaquetar(socketYama,mensajeFalloReduccion,0,0);
}