Closed ArgonzMatias closed 1 year ago
Buenas! Cómo va?
Creo que tu problema es realmente simple y viene de la mano de que está terminando el hilo main y como termina el hilo principal de tu proceso, todos los hilos hijos van a morir también.
Lo que deberían hacer es que al menos el main se quede esperando un hilo que no termine, como por ejemplo, el que escucha las conexiones entrantes.
Saludos.-
Buenas, es que es imposible que main se muera porque nueva_conex(socketKernel); (la ultima funcion que llama main) hace un loop infinito para que acepte todas las consolas. Te dejo el codigo de la funcion:
void nueva_conex(int socketEscucha){
struct sockaddr cliente = {0};
socklen_t aux = sizeof(cliente);
for(;;){
int clienteElegido = accept(socketEscucha, &cliente, &aux);
if(clienteElegido > -1){
int* socketCliente = malloc(sizeof(*socketCliente));
*socketCliente = clienteElegido;
crear_hilo_conex_entrante(socketCliente);
} else{
log_error(kernelLogger, "error en establecer conexion");
}
}}
Ok, entonces descartado que este terminando el proceso y por eso les matan los threads, los mismos se mueren porque tira seg fault el programa.
Por las dudas pregunto, para que estan haciendo strdup()
cuando leen las config? Porque revisando nuevamente veo que el error viene justo con un strdup()
al momento de levantar una config que me juego a que no la esta encontrando y por eso pincha porque les devuelve null el config_get_string_value()
Saludos.-
Hola, ese strdup es justamente para que me lea el puerto como un char en vez de un char. Que despues cuando levanta el servidor, necesita ese char en la funcion getaddrinfo(). Por ejemplo hice lo mismo en el modulo consola y anda sin problema. Aparte es raro, porque el valgrind me marca eso como mal pero ni uso esa variable todavia porque no hice la conexion con filesystem, y no me marca como mal el uso de strdup en las otras variables anteriores que uso como ip_cpu, ip_memoria, etc... Me tome el trabajo de ademas chequear que devuelven las variables con el debugger y dan lo que corresponden. Tipo no me suena a que sea esto porque tenia la misma estructura antes y andaba joya.
Pero bueno aparte de todo esto, los hilos que creo no usan estas variables, porque son solamente las configuraciones de kernel. Estos threads se me mueren pq reciben la senial SIGSEGV de la nada.
Hice mas pruebas y llegue a estas conclusiones. Siempre me crea 3 hilos y falla en uno de esos 3. Siempre son los hilos que tienen en sus procesos los semaforos de los estados para empezar a correr el algoritmo, el planificador de largo plazo nunca me tira el error. Nose si tendra que ver, pero bueno revise esto y no parece que este mal. Lo unico que se me ocurre es que se quede sin memoria (pero no tiene sentido, porque no estoy usando mucho creo) o sea algo particular en mi comutadora. Ahora a la tarde vamos a probar con la compu de mis companeros a ver si ellos tienen el mismo error.
Alguna otra idea de que puede ser? Gracias
Buenas, nose como pero magicamente ahora anda. Amo eclipse! Nose que era pero bueno. Gracias!
Buenos días. Estoy con el síguiente problema. Hasta hace unos días mi kernel era un kernel común y corriente. Pero, de repente, decidió ser un asesino serial de hilos. Ahora dejando los chistes de lado, el día del checkpoint 3 mi kernel estaba funcionando con normalidad. Hace una inicializacion de los 4 hilos, uno para planificación corto plazo, largo plazo, para ejecutar los procesos y el ultimo para la finalización de procesos. Luego sigue a esperar las conexiones de consola. Sin embargo, después del checkpoint hice cambios al código pero no toque nada de estos hilos, los dejé como estaban. Le agregue logs mas que nada, cosas que no llegan a ejecutar todavia. Pero ahora al ejecutar kernel, se muere en la inicializacion de estos hilos. Al usar el debugger me di cuenta que el problema son los hilos porque me tira segmentación fault thread 4. Probé cambiar el orden en el que inició los hilos y mismo resultado solo que va variando el hilo que muere. Estos hilos tiene un while(1) y sus respectivos semáforos. Lo que no puedo entender es porque si antes me andaba ahora no. Ah y yo todavía tengo una branch donde tengo mi kernel anterior sin los cambios que realize, y ese kernel si me anda y la funcion inicializar_planificador esta igual. Nose si metí la pata con los nuevos cambios porque para mi no tienen nada que ver con mi problema, ni siquiera llega a ejecutar hasta esa parte. Adjunto todo lo que creo que es neceseario abajo para entender este problema. Espero sus consejos, gracias!
🔎 Búsqueda en foros
Mi sospecha, por lo que estuve leyendo en distintos issues, es que mis hilos están teniendo problemas de memoria. Pero no me doy cuenta ni donde es ni cómo solucionarlo porque no encuentro cual seria el error.
📝 Código relevante
Main Kernel
Incializador planificador
Lo que me tira el Debugger de Eclipse:
Corto plazo
Largo Plazo
Estado end
Execute_pcb
Crear Estado
Inicializacion planificador antes de los cambios:
💻 Logs
Probé usar valgrind y me marca que cuando importo la configuración del kernel me esta dando este error. Pero primero q no entiende porque me lo marca como mal específicamente esa línea y segundo no entiendo porque eso me mata al hilo. Estoy recien aprendiendo a usar la herramienta asi que nose si es un error simple pero no encontre solucion. Si comento la linea que me tira el error, me salta nuevamente el mismo error en la linea siguiente.
Codigo donde me tira el error:
Valgrind error en eclipse