void destruir_segmento(uint32_t baseSegmento) { t_msg *msg = argv_message(DESTROY_SEGMENT,2,PID,baseSegmento); if(enviar_mensaje(MSP,msg) == -1) { puts("ERROR: Se ha perdido la conexión con la MSP."); exit(EXIT_FAILURE); } destroy_message(msg); if((msg = recibir_mensaje(MSP)) == NULL) { puts("ERROR: Se ha perdido la conexión con la MSP."); exit(EXIT_FAILURE); } if(msg->header.id != OK_DESTROY) { Quantum = 0; KernelMode = false; Execution_State = CPU_ABORT; } destroy_message(msg); }
main() { char * id; int fd = client_socket("127.0.0.1",2233); while(getchar() != EOF) { t_msg *msg = argv_message(REQUEST_MEMORY, 3, 74, 127, 30); enviar_mensaje(fd,msg); puts("Mensaje enviado"); msg = recibir_mensaje(fd); printf("%s\n%s",id = id_string(msg->header.id),msg->stream); free(msg); } }
uint32_t crear_segmento(uint32_t size) { uint32_t aux; t_msg *msg = argv_message(CREATE_SEGMENT,2,PID,size); if(enviar_mensaje(MSP,msg) == -1) { puts("ERROR: Se ha perdido la conexión con la MSP."); exit(EXIT_FAILURE); } destroy_message(msg); if((msg = recibir_mensaje(MSP)) == NULL) { puts("ERROR: Se ha perdido la conexión con la MSP."); exit(EXIT_FAILURE); } if(msg->header.id == OK_CREATE) aux = (uint32_t) msg->argv[0]; else { Quantum = 0; KernelMode = false; Execution_State = CPU_ABORT; } destroy_message(msg); return aux; }
char* solicitar_memoria(uint32_t pid,uint32_t direccionLogica,uint32_t size) { char *buffer = malloc(size); t_msg *msg = argv_message(REQUEST_MEMORY,3,pid,direccionLogica,size); if(enviar_mensaje(MSP,msg) == -1) { puts("ERROR: Se ha perdido la conexión con la MSP."); exit(EXIT_FAILURE); } destroy_message(msg); if((msg = recibir_mensaje(MSP)) == NULL) { puts("ERROR: Se ha perdido la conexión con la MSP."); exit(EXIT_FAILURE); } if(msg->header.id == OK_REQUEST) memcpy(buffer,msg->stream,size); else { free(buffer); buffer = NULL; Quantum = 0; KernelMode = false; Execution_State = CPU_ABORT; } destroy_message(msg); return buffer; }
int hiloMap(void* dato) { //sumar_hilo(); t_msg* mensaje; t_msg* mensaje_respuesta; t_params_hiloMap* args = (t_params_hiloMap*) dato; int nodo_sock = client_socket(args->ip, args->puerto); int res = 0; 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_MAP_ERROR, 2, args->id_operacion, args->id_job); } else { mensaje = string_message(EJECUTAR_MAP, args->archivo_final, 2, args->id_operacion, args->bloque); 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_MAP"); shutdown(nodo_sock, 2); } mensaje = rutina_message(RUTINA, configuracion->mapper, configuracion->tamanio_mapper); log_debug_interno("Enviando mensaje de rutina. Header.ID: %s - Argc: %d - Largo Stream: %d Al nodo: %s", id_string(mensaje->header.id), mensaje->header.argc, mensaje->header.length, args->nombre_nodo); res = enviar_mensaje(nodo_sock, mensaje); if (res == -1) { log_error_consola("Fallo envio mensaje RUTINA"); shutdown(nodo_sock, 2); } log_info_consola("Se envio SOLICITUD DE MAP correctamente. 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("El MAP id_op: %d en el nodo: %s fallo, enviando a MaRTA", args->id_operacion, args->nombre_nodo); mensaje_respuesta = argv_message(FIN_MAP_ERROR, 2, args->id_operacion, args->id_job); } else { log_info_consola("El MAP id_op: %d, en el nodo: %s finalizo bien. enviando 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); destroy_message(mensaje); } } //Se envia el resultado del map 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 envio de Mensaje a MaRTA."); shutdown(nodo_sock, 2); return res; } log_info_consola("Respuesta MAP enviada a MaRTA. id_op: %d, nodo: %s", args->id_operacion, args->nombre_nodo); destroy_message(mensaje_respuesta); //CERRAR CONEXIoN CON EL NODO// shutdown(nodo_sock, 2); //restar_hilo(); return res; }
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; }