void inicializar_CPU(char *path, uint32_t *retardo) { t_config* config = config_create(path); *retardo = config_get_int_value(config,"RETARDO"); uint16_t puertoMSP = config_get_int_value(config,"PUERTO_MSP"); char *direccionIpMSP = config_get_string_value(config,"IP_MSP"); uint16_t puertoKernel = config_get_int_value(config,"PUERTO_KERNEL"); char *direccionIpKernel = config_get_string_value(config,"IP_KERNEL"); if((Kernel = client_socket(direccionIpKernel, puertoKernel)) < 0) { puts("ERROR: No se pudo conectar al Kernel."); exit(EXIT_FAILURE); } t_msg *handshake = id_message(CPU_CONNECT); enviar_mensaje(Kernel, handshake); destroy_message(handshake); if((MSP = client_socket(direccionIpMSP, puertoMSP)) < 0) { puts("ERROR: No se pudo conectar a la MSP."); exit(EXIT_FAILURE); } config_destroy(config); MapRegistros['A'-'A'] = &Registros.registros_programacion[0]; MapRegistros['B'-'A'] = &Registros.registros_programacion[1]; MapRegistros['C'-'A'] = &Registros.registros_programacion[2]; MapRegistros['D'-'A'] = &Registros.registros_programacion[3]; MapRegistros['E'-'A'] = &Registros.registros_programacion[4]; MapRegistros['K'-'A'] = &Registros.K; MapRegistros['I'-'A'] = &Registros.I; MapRegistros['M'-'A'] = &Registros.M; MapRegistros['P'-'A'] = &Registros.P; MapRegistros['S'-'A'] = &Registros.S; MapRegistros['X'-'A'] = &Registros.X; inicializar_tabla_instrucciones(); }
void obtener_siguiente_hilo(void) { t_msg *msg = id_message(CPU_TCB); if(enviar_mensaje(Kernel,msg) == -1) { puts("ERROR: No se pudo obtener el siguiente hilo a ejecutar."); exit(EXIT_FAILURE); } destroy_message(msg); if((msg = recibir_mensaje(Kernel)) == NULL || msg->header.id != NEXT_TCB) { puts("ERROR: No se pudo obtener el siguiente hilo a ejecutar."); exit(EXIT_FAILURE); } Quantum = msg->argv[0]; Execution_State = RETURN_TCB; memcpy(&Hilo,msg->stream,sizeof(t_hilo)); destroy_message(msg); }
int hiloReduce(void* dato) { //sumar_hilo(); t_msg* mensaje; t_msg* mensaje_respuesta; int res = 0; int i; t_params_hiloReduce* args = (t_params_hiloReduce*) dato; int nodo_sock = client_socket(args->ip, args->puerto); if (nodo_sock < 0) { log_error_consola("No se pudo conectar al proceso %s - IP: %s - Puerto: %d", args->nombre_nodo, args->ip, args->puerto); mensaje_respuesta = argv_message(FIN_REDUCE_ERROR, 1, args->id_operacion); } else { log_debug_consola("Se conecto al proceso %s - IP: %s - Puerto: %d", args->nombre_nodo, args->ip, args->puerto); mensaje = string_message(EJECUTAR_REDUCE, args->archivo_final, 1, args->id_operacion); log_debug_interno("Enviando mensaje de solicitud de reduce. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje->header.id), mensaje->header.argc, mensaje->header.length); res = enviar_mensaje(nodo_sock, mensaje); if (res == -1) { log_error_consola("Fallo envio mensaje EJECUTAR_REDUCE"); shutdown(nodo_sock, 2); return res; } mensaje = rutina_message(RUTINA, configuracion->reduce, configuracion->tamanio_reduce); log_debug_interno("Enviando mensaje rutina. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje->header.id), mensaje->header.argc, mensaje->header.length); res = enviar_mensaje(nodo_sock, mensaje); if (res == -1) { log_error_consola("Fallo envio mensaje RUTINA"); shutdown(nodo_sock, 2); return res; } int cant_elementos = queue_size(args->archivos_tmp); for (i = 0; i < cant_elementos; i++) { mensaje = queue_pop(args->archivos_tmp); log_debug_interno("Enviando mensaje archivos de reduce. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje->header.id), mensaje->header.argc, mensaje->header.length); res = enviar_mensaje(nodo_sock, mensaje); if (res == -1) { log_error_consola("Fallo envio mensaje ARCHIVOS_NODOS_REDUCE"); shutdown(nodo_sock, 2); return res; } } mensaje = id_message(FIN_ENVIO_MENSAJE); log_debug_interno("Enviando mensaje fin de Mensaje. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje->header.id), mensaje->header.argc, mensaje->header.length); res = enviar_mensaje(nodo_sock, mensaje); if (res == -1) { log_error_consola("Fallo envio mensaje FIN_ENVIO_MENSAJE"); shutdown(nodo_sock, 2); return res; } log_info_consola("Envio REDUCE a Job OK. id_op:%d , nodo: %s ", args->id_operacion, args->nombre_nodo); mensaje = recibir_mensaje_sin_mutex(nodo_sock); if (!mensaje) { //Significa que recibir_mensaje devolvio NULL o sea que hubo un error en el recv o el nodo se desconecto log_info_consola("Respuesta REDUCE Error. id_op: %d, nodo: %s, enviando mensaje a MaRTA", args->id_operacion, args->nombre_nodo); mensaje_respuesta = argv_message(FIN_REDUCE_ERROR, 2, args->id_operacion, args->id_job); } else { log_info_consola("Respuesta REDUCE OK. id_op: %d, nodo: %s, enviando mensaje a MaRTA", args->id_operacion, args->nombre_nodo); mensaje_respuesta = argv_message(mensaje->header.id, 2, args->id_operacion, args->id_job); log_debug_interno("Se recibio mensaje de %s. Header.Id: %s - Argc: %d - Largo Stream: %d", args->nombre_nodo, id_string(mensaje->header.id), mensaje->header.argc, mensaje->header.length); } } //Se reenvia el resultado del reduce a marta log_debug_interno("Enviando mensaje respuesta a MaRTA. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje_respuesta->header.id), mensaje_respuesta->header.argc, mensaje_respuesta->header.length); res = enviar_mensaje(marta_sock, mensaje_respuesta); if (res == -1) { log_error_consola("fallo mensaje respuesta a MaRTA"); shutdown(nodo_sock, 2); return res; } log_info_consola("Respuesta REDUCE enviada. id_op: %d, nodo: %s", args->id_operacion, args->nombre_nodo); destroy_message(mensaje_respuesta); shutdown(nodo_sock, 2); //restar_hilo(); return res; }
t_msg* message = string_message(EJECUTAR_REDUCE, stream, 3, reduce->arch_tmp.nodo.puerto, reduce->id, job->id); reduce->estado = EN_EJECUCION; enviar_mensaje(job->socket, message); void _genera_mensaje(t_temp* temp) { stream = string_duplicate(temp->nodo.ip); string_append(&stream, "|"); string_append(&stream, temp->nodo.nombre); string_append(&stream, "|"); string_append(&stream, string_duplicate(temp->nombre)); t_msg* message = string_message(ARCHIVOS_NODO_REDUCE, stream, 1, temp->nodo.puerto); enviar_mensaje(job->socket, message); } list_iterate(reduce->temporales, (void*) _genera_mensaje); message = id_message(FIN_ENVIO_MENSAJE); enviar_mensaje(job->socket, message); destroy_message(message); } void ejecuta_reduce_final(t_job* job) { log_debug_interno("creando reduce final thread. job: %d", job->id); t_reduce* reduce = job->reduce_final; ejecuta_reduce(job, reduce); log_debug_interno("Reduce final thread creado. job: %d", job->id); } void ejecuta_reduces_parciales(t_job* job) {