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);
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
	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) {