void _atiendo_crear_segmento(sock_t* sock, char* msg){
	pedido_de_crear_segmento_t* pedido_crear = deserializar_pedido_de_crear_segmento_t(msg);

	loggear_trace("Atiendo solicitud de Crear Segmento.\nPID: %d\nBytes: %d",
			pedido_crear->pid, pedido_crear->tamano);

	resultado_t* resultado = malloc(sizeof(resultado_t));
	direccion dir_base = crear_segmento(pedido_crear->pid, pedido_crear->tamano, resultado);

	respuesta_de_crear_segmento_t* respuesta_crear = malloc(sizeof(respuesta_de_crear_segmento_t));
	respuesta_crear->direccion_virtual = dir_base;
	respuesta_crear->flag = TOMA_SEGMENTO;
	respuesta_crear->resultado = *(resultado);

	free(resultado);

	char* msg_respuesta_crear = serializar_respuesta_de_crear_segmento_t(respuesta_crear);

	uint32_t len_msg_crear = tamanio_respuesta_de_crear_segmento_t_serializado();

	enviar(sock,msg_respuesta_crear, &len_msg_crear);

	free(pedido_crear);
	free(respuesta_crear);
	free(msg_respuesta_crear);
}
Esempio n. 2
0
void consola (void* param)
{
	cantidad_dumps = 0;
	char comando[50];
	char comando2[50];
	int flag_comandoOK;
	int flag_comandoOK2;
	int nuevo_valor;
	int valor_numerico;
	int valor_numerico2;
	int valor_numerico3;
	int proc_id = -1;
	int respuesta;
	int dir_fisica;
	char *buffer;
	log_info(logger, "Se lanzo el hilo de consola");
	printw("-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-\n");
	printw("         Bienvenido a la consola de UMV           \n");
	printw("-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-\n");
	refresh();
	int i;
	int cant_num_leidos;
	int *buffer_int;
	int tecla_ingresada;
	int tecla_ingresada2;
	// Bucle principal esperando peticiones del usuario
	for(;;)
	{
		flag_comandoOK = 0;
		flag_comandoOK2 = 0;
		fflush(stdin);
    	printw("Ingrese el comando: \n");
    	printw(">");
    	refresh();
    	getstr(comando);
   		if (flag_comandoOK == 0 && strcmp(comando, "operacion") == 0)
   		{
   			printw("Operaciones disponibles: \n");
   			printw("\tcrear segmento\n");
   			printw("\tsolicitar memoria\n");
   			printw("\tescribir memoria\n");
   			printw("\tdestruir segmentos\n");
   			printw("Ingrese la operacion: \n");
   			printw(">");
   			refresh();
   			getstr(comando2);
   			if (flag_comandoOK2 == 0 && strcmp(comando2, "crear segmento") == 0)
   			{
   				printw("Ingrese proceso: \n");
   				printw(">");
   				refresh();
   				scanw("%d", &proc_id);
   				respuesta = verificar_proc_id(proc_id);
   				if (respuesta == 0)
   				{
   					printw("El proceso ingresado no existe en memoria.\n");
   					printw("Ingrese un proceso que exista en memoria para crear un segmento.\n");
   					refresh();
   				}
   				else
   				{
   					printw("Ingrese tamanio del segmento: \n");
   					printw(">");
   					refresh();
   					scanw("%d", &valor_numerico);
   					pthread_mutex_lock(&semCompactacion);
   					respuesta = crear_segmento(proc_id, valor_numerico);
   					pthread_mutex_unlock(&semCompactacion);
   					switch(respuesta)
   					{
   					case -1:
   						printw("No hay memoria disponible para ese tamanio de segmento.\n");
   						printw("El segmento no fue creado.\n");
   						refresh();
   						break;
   					default:
   						log_info(logger, "Segmento de proceso %d creado.", proc_id);
   						printw("El segmento fue creado.\n");
   						dir_fisica = transformar_direccion_en_fisica(respuesta, proc_id);
   						printw("Posicion en memoria del segmento: %d\n", dir_fisica);
   						refresh();
   						break;
   					}
   				}
   				flag_comandoOK2 = 1;
   			}
   			if (flag_comandoOK2 == 0 && strcmp(comando2, "solicitar memoria") == 0)
   			{
   				printw("Ingrese proceso: \n");
   				printw(">");
   				refresh();
   				scanw("%d", &proc_id);
   				respuesta = verificar_proc_id(proc_id);
   				if (respuesta == 0)
   				{
   					printw("El proceso ingresado no existe en memoria.\n");
   					printw("Ingrese un proceso que exista en memoria.\n");
   					refresh();
   				}
   				else
   				{
   					printw("Ingrese base: \n");
   					printw(">");
   					refresh();
   					scanw("%d", &valor_numerico);
   					printw("Ingrese offset: \n");
   					printw(">");
   					refresh();
   					scanw("%d", &valor_numerico2);
   					printw("Ingrese cantidad de bytes a leer: \n");
   					printw(">");
   					refresh();
   					scanw("%d", &valor_numerico3);
   					buffer = (char *)malloc(valor_numerico3);
   					valor_numerico = transformar_direccion_en_logica(valor_numerico, proc_id);
   					pthread_mutex_lock(&semProcesoActivo);
   					pthread_mutex_lock(&semCompactacion);
   					respuesta = atender_solicitud_bytes(valor_numerico, valor_numerico2, valor_numerico3, 0, &buffer);
   					pthread_mutex_unlock(&semCompactacion);
   					pthread_mutex_unlock(&semProcesoActivo);
   					switch(respuesta)
   					{
   					case PROGRAMA_INVALIDO:
   						printw("El proceso es invalido.\n");
   						refresh();
   						break;
   					case SEGMENTATION_FAULT:
   						printw("Segmentation fault.\n");
   						refresh();
   						break;
   					default:
   						printw("Posicion de memoria solicitada: %d\n", respuesta);
   						printw("Contenido: ");
   						for (i = 0; i < valor_numerico3; i++)
   						{
   							printw("%c", buffer[i]);
   						}
   						printw("\n");
   						refresh();
   						free(buffer);
   						break;
   					}
   				}
   				flag_comandoOK2 = 1;
   			}
   			if (flag_comandoOK2 == 0 && strcmp(comando2, "solicitar memoria int") == 0)
			{
				printw("Ingrese proceso: \n");
				printw(">");
				refresh();
				scanw("%d", &proc_id);
				respuesta = verificar_proc_id(proc_id);
				if (respuesta == 0)
				{
					printw("El proceso ingresado no existe en memoria.\n");
					printw("Ingrese un proceso que exista en memoria.\n");
					refresh();
				}
				else
				{
					printw("Ingrese base: \n");
					printw(">");
					refresh();
					scanw("%d", &valor_numerico);
					printw("Ingrese offset: \n");
					printw(">");
					refresh();
					scanw("%d", &valor_numerico2);
					printw("Ingrese cantidad de bytes a leer: \n");
					printw(">");
					refresh();
					scanw("%d", &valor_numerico3);
					buffer_int = (int *)malloc(valor_numerico3);
					valor_numerico = transformar_direccion_en_logica(valor_numerico, proc_id);
					pthread_mutex_lock(&semProcesoActivo);
					pthread_mutex_lock(&semCompactacion);
					respuesta = atender_solicitud_bytes_int(valor_numerico, valor_numerico2, valor_numerico3, 0, &buffer_int);
					pthread_mutex_unlock(&semCompactacion);
					pthread_mutex_unlock(&semProcesoActivo);
					switch(respuesta)
					{
					case PROGRAMA_INVALIDO:
						printw("El proceso es invalido.\n");
						refresh();
						break;
					case SEGMENTATION_FAULT:
						printw("Segmentation fault.\n");
						refresh();
						break;
					default:
						printw("Posicion de memoria solicitada: %d\n", respuesta);
						printw("Contenido: \n");
						cant_num_leidos = (int)valor_numerico3 / 4;
						for (i = 0; i < cant_num_leidos; i++)
						{
							printw("%d\n", buffer_int[i]);
						}
						refresh();
						free(buffer);
						break;
					}
				}
				flag_comandoOK2 = 1;
			}
   			if (flag_comandoOK2 == 0 && strcmp(comando2, "escribir memoria") == 0)
   			{
   				printw("Ingrese proceso: \n");
   				printw(">");
   				refresh();
   				scanw("%d", &proc_id);
   				respuesta = verificar_proc_id(proc_id);
   				if (respuesta == 0)
   				{
   					printw("El proceso ingresado no existe en memoria.\n");
   					printw("Ingrese un proceso que exista en memoria.\n");
   					refresh();
   				}
   				else
   				{
   					printw("Ingrese base: \n");
   					printw(">");
   					refresh();
   					scanw("%d", &valor_numerico);
   					printw("Ingrese offset: \n");
   					printw(">");
   					refresh();
   					scanw("%d", &valor_numerico2);
   					printw("Ingrese cantidad de bytes a escribir: \n");
   					printw(">");
   					refresh();
   					scanw("%d", &valor_numerico3);
   					valor_numerico = transformar_direccion_en_logica(valor_numerico, proc_id);
   					pthread_mutex_lock(&semProcesoActivo);
   					pthread_mutex_lock(&semCompactacion);
   					respuesta = atender_envio_bytes(valor_numerico, valor_numerico2, valor_numerico3, 0);
   					pthread_mutex_unlock(&semCompactacion);
   					pthread_mutex_unlock(&semProcesoActivo);
   					switch(respuesta)
   					{
   					case 0:
   						printw("Se escribio la memoria satisfactoriamente.\n");
   						refresh();
   						break;
   					case PROGRAMA_INVALIDO:
   						printw("El proceso es invalido.\n");
   						refresh();
   						break;
   					case SEGMENTATION_FAULT:
   						printw("Segmentation fault.\n");
   						refresh();
   						break;
   					}
   				}
   				flag_comandoOK2 = 1;
   			}
   			if (flag_comandoOK2 == 0 && strcmp(comando2, "destruir segmentos") == 0)
   			{
   				printw("Ingrese proceso: \n");
   				printw(">");
   				refresh();
   				scanw("%d", &proc_id);
   				pthread_mutex_lock(&semCompactacion);
   				respuesta = destruir_segmentos(proc_id);
   				pthread_mutex_unlock(&semCompactacion);
   				if (respuesta == 1)
   				{
   					log_info(logger, "Segmentos de proceso %d destruidos satisfactoriamente.", proc_id);
   					printw("Los segmentos del programa fueron destruidos satisfactoriamente.\n");
   					refresh();
   				}
   				else
   				{
   					printw("El programa ingresado no es valido.\n");
   					refresh();
   				}
   				flag_comandoOK2 = 1;
   			}
   			flag_comandoOK = 1;
   		}
   		if (flag_comandoOK == 0 && strcmp(comando, "retardo") == 0)
   		{
   			log_info(logger, "Se cambio el valor de retardo por consola.");
   			printw("Nuevo valor de retardo: ");
   			refresh();
   			scanw("%d", &nuevo_valor);
   			printw("Valor anterior de retardo: %d\n", retardo);
   			cambiar_retardo(nuevo_valor);
   			printw("Valor actual de retardo: %d\n", retardo);
   			refresh();
   			flag_comandoOK = 1;
   		}
   		if (flag_comandoOK == 0 && strcmp(comando, "algoritmo") == 0)
   		{
   			log_info(logger, "Se cambio el algoritmo por consola.");
   			printw("Se cambio el algoritmo.\n");
   			printw("Algoritmo anterior: %s\n", algoritmo);
   			cambiar_algoritmo();
   			printw("Algoritmo actual: %s\n", algoritmo);
   			refresh();
   		   	flag_comandoOK = 1;
   		}
   		if (flag_comandoOK == 0 && strcmp(comando, "compactacion") == 0)
   		{
   			log_info(logger, "Se pidio compactar memoria por consola.");
   			pthread_mutex_lock(&semCompactacion);
   			compactar_memoria();
   			pthread_mutex_unlock(&semCompactacion);
   		   	flag_comandoOK = 1;
   		}
   		if (flag_comandoOK == 0 && strcmp(comando, "dump procesos") == 0)
   		{
   			log_info(logger, "Se pidio dump de procesos.");
   			printw("¿Desea mostrar la informacion de todos los procesos? (s/n): ");
   			tecla_ingresada = getch();
   			printw("\n");
   			refresh();
   			printw("¿Desea guardar los datos del dump en un archivo en disco? (s/n): ");
			tecla_ingresada2 = getch();
			printw("\n");
			refresh();
   			if (tecla_ingresada != 115)
   			{
   				printw("Ingrese el id del proceso que desea mostrar informacion: ");
   				refresh();
   				scanw("%d", &proc_id);
   				respuesta = verificar_proc_id(proc_id);
   				if (respuesta == 0)
   				{
   					printw("El proceso ingresado no existe en memoria.\n");
   					printw("Ingrese un proceso que exista en memoria.\n");
   					refresh();
   				}
   				else
   				{
   					pthread_mutex_lock(&semCompactacion);
   					dump_proceso(proc_id, tecla_ingresada2);
   					pthread_mutex_unlock(&semCompactacion);
   				}
   			}
   			else
   			{
   				pthread_mutex_lock(&semCompactacion);
   				dump_memoria(tecla_ingresada2);
   				pthread_mutex_unlock(&semCompactacion);
   			}
   			flag_comandoOK = 1;
   		}
   		if (flag_comandoOK == 0 && strcmp(comando, "dump memoria") == 0)
   		{
   			printw("¿Desea guardar los datos del dump en un archivo en disco? (s/n): ");
   			tecla_ingresada = getch();
   			printw("\n");
   			printw("Ingrese direccion de memoria de comienzo: \n");
			printw(">");
			refresh();
			scanw("%d", &valor_numerico);
			printw("Ingrese cantidad de bytes a leer: \n");
			printw(">");
			refresh();
			scanw("%d", &valor_numerico2);
			if (valor_numerico + valor_numerico2 <= space && valor_numerico >= 0 && valor_numerico2 >= 0)
			{
				pthread_mutex_lock(&semCompactacion);
				mostrar_memoria(valor_numerico, valor_numerico2, tecla_ingresada);
				pthread_mutex_unlock(&semCompactacion);
			}
			printw("\n");
   			flag_comandoOK = 1;
   		}
   		if (flag_comandoOK == 0 && strcmp(comando, "help") == 0)
   		{
   			printw("Los unicos comandos habilitados son: \n");
   			printw("\toperacion\n");
   			printw("\tretardo\n");
   			printw("\talgoritmo\n");
   			printw("\tcompactacion\n");
   			printw("\tdump memoria\n");
   			printw("\tdump procesos\n");
   			refresh();
   			flag_comandoOK = 1;
   		}
   		if(flag_comandoOK == 0)
   		{
   			printw("Por favor verifique la sintaxis de los comandos utilizados.\n");
   			printw("Los unicos comandos habilitados son: \n");
   			printw("\toperacion\n");
   			printw("\tretardo\n");
   			printw("\talgoritmo\n");
   			printw("\tcompactacion\n");
   			printw("\tdump memoria\n");
   			printw("\tdump procesos\n");
   			refresh();
   		}
   	}
}
Esempio n. 3
0
void atender_kernel(int sock)
{
	t_mensaje mensaje;
	if (recv(sock, &mensaje, sizeof(t_mensaje), 0) == 0)
	{
		log_error(logger, "Kernel desconectado.");
		depuracion(SIGINT);
	}
	t_msg_destruir_segmentos msg;
	t_msg_crear_segmento msg2;
	t_msg_envio_bytes msg3;
	int respuesta;
	switch(mensaje.tipo)
	{
	case DESTRUIRSEGMENTOS:
		pthread_mutex_lock(&semRetardo);
		usleep(retardo);
		pthread_mutex_unlock(&semRetardo);
		pthread_mutex_lock(&semCompactacion);
		if (recv(sock, &msg, sizeof(t_msg_destruir_segmentos), 0) == 0)
		{
			log_error(logger, "Kernel desconectado.");
			depuracion(SIGINT);
		}
		log_info(logger, "Se recibio peticion para destruir segmentos de kernel.");
		mensaje.datosNumericos = destruir_segmentos(msg.id_programa);
		pthread_mutex_unlock(&semCompactacion);
		send(sock, &mensaje, sizeof(t_mensaje), 0);
		log_info(logger, "Se eliminaron segmentos de programa %d", msg.id_programa);
		break;
	case CREARSEGMENTO:
		pthread_mutex_lock(&semRetardo);
		usleep(retardo);
		pthread_mutex_unlock(&semRetardo);
		pthread_mutex_lock(&semCompactacion);
		if (recv(sock, &msg2, sizeof(t_msg_crear_segmento), 0) == 0)
		{
			log_error(logger, "Kernel desconectado.");
			depuracion(SIGINT);
		}
		log_info(logger, "Se recibe peticion para crear segmento de kernel.");
		mensaje.datosNumericos = crear_segmento(msg2.id_programa, msg2.tamanio);
		pthread_mutex_unlock(&semCompactacion);
		mensaje.id_proceso = UMV;
		send(sock, &mensaje, sizeof(t_mensaje), 0);
		log_info(logger, "Se creo segmento de programa %d", msg2.id_programa);
		break;
	case ENVIOBYTES:
		pthread_mutex_lock(&semRetardo);
		usleep(retardo);
		pthread_mutex_unlock(&semRetardo);
		pthread_mutex_lock(&semProcesoActivo);
		pthread_mutex_lock(&semCompactacion);
		if (recv(sock, &msg, sizeof(t_msg_cambio_proceso_activo), 0) == 0)
		{
			log_error(logger, "Kernel desconectado.");
			depuracion(SIGINT);
		}
		proceso_activo = msg.id_programa;
		if (recv(sock, &msg3, sizeof(t_msg_envio_bytes), 0) == 0)
		{
			log_error(logger, "Kernel desconectado.");
			depuracion(SIGINT);
		}
		log_info(logger, "Se recibio envio de bytes de kernel.");
		respuesta = atender_envio_bytes(msg3.base, msg3.offset, msg3.tamanio, sock);
		if (respuesta != 0)
		{
			mensaje.tipo = respuesta;
			mensaje.id_proceso = proceso_activo;
			send(sock, &mensaje, sizeof(t_mensaje), 0);
		}
		log_info(logger, "Se recibieron %d bytes de programa %d", msg3.tamanio, msg.id_programa);
		pthread_mutex_unlock(&semCompactacion);
		pthread_mutex_unlock(&semProcesoActivo);
		break;
	}
}