[tallerdeprogramacion] duda tp4

13 views
Skip to first unread message

.s.e.b.a. b.o.r.d.o.l.i.n.o.

unread,
May 9, 2010, 8:12:50 PM5/9/10
to tallerdepr...@googlegroups.com
Buenas: tengo un problemita en el tp4, cuando tengo que cerrar el servidor.
Tengo una funcion frenar que hace lo siguiente:

void Servidor::frenar(){

socket.cerrarSocket();
seguir = false;
Nodo<SocketServidor*>* aux = conexiones.getPrimero();
while(aux){
delete aux->getDato();
aux = aux->getSiguiente();
}
}

conexiones es una lista de los sockets dedicados a cada cliente
y
el seguir es para terminar el run de la clase (implementa Thread), que
en cada ciclo se fija si hay alguien para hacer el accept
el
problema es que al estar "trabado" en el accept, no sigue hasta el
final del ciclo, con lo cual como el Thread no termina, se queda
esperando el join y no libera la memoria (y algo similar me ocurre con
cada uno de los Sockets dedicados a cada cliente, que se quedan
esperando en el recv y no salen del run, con lo que tampoco puedo
liberarlos)
No sé si se entendió bien mi problema, espero que alguien me pueda ayudar. Desde ya muchas gracias! Sebastián Piccoli.

 

 

 

 

 

 

 






No importa si es pesado o liviano. Con Hotmail Skydrive tenés 25 GB para guardar todo. Más Info

--
Has recibido este mensaje porque estás suscrito al grupo "7542 - Taller de Programación" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a tallerdepr...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a tallerdeprograma...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/tallerdeprogramacion?hl=es.

Leandro Fernández

unread,
May 9, 2010, 8:25:24 PM5/9/10
to tallerdepr...@googlegroups.com
Simplemente tenés que ejecutar la función shutdown [1] sobre el socket en el cual está el accept y sale aunque no haya conexiones.

[1] http://linux.die.net/man/2/shutdown

2010/5/9 .s.e.b.a. b.o.r.d.o.l.i.n.o. <gallin...@hotmail.com>



--
_Leo_
[http://www.drk.com.ar]

.s.e.b.a. b.o.r.d.o.l.i.n.o.

unread,
May 10, 2010, 2:35:54 PM5/10/10
to tallerdepr...@googlegroups.com
Buenas: agregué la llamada a la función shutdown, y esto me permite salir del accept y del recv, sin embargo en el socket que está en el accept me aparece el mensaje:
ERROR: Invalid argument (aunque sale bien)
 
Y otro problema que me surgió fue, al correr el valgrind, estos mensajes de error:

==16006== Conditional jump or move depends on uninitialised value(s)
==16006==    at 0x40396E7: pthread_join (in /lib/tls/i686/cmov/libpthread-2.7.so)
==16006==    by 0x804A98F: Thread::esperar() (common_Thread.h:41)
==16006==    by 0x8049A10: Servidor::~Servidor() (server_Servidor.cpp:71)
==16006==    by 0x8049696: main (server_main.cpp:23)
==16006==
==16006== Use of uninitialised value of size 4
==16006==    at 0x40396F1: pthread_join (in /lib/tls/i686/cmov/libpthread-2.7.so)
==16006==    by 0x804A98F: Thread::esperar() (common_Thread.h:41)
==16006==    by 0x8049A10: Servidor::~Servidor() (server_Servidor.cpp:71)
==16006==    by 0x8049696: main (server_main.cpp:23)
==16006==
==16006== Process terminating with default action of signal 11 (SIGSEGV)
==16006==  Bad permissions for mapped region at address 0x8048E7B
==16006==    at 0x40396F1: pthread_join (in /lib/tls/i686/cmov/libpthread-2.7.so)
==16006==    by 0x804A98F: Thread::esperar() (common_Thread.h:41)
==16006==    by 0x8049A10: Servidor::~Servidor() (server_Servidor.cpp:71)
==16006==    by 0x8049696: main (server_main.cpp:23)

Lamento estar siendo tan molesto! Gracias, Sebastián Piccoli 







From: drk...@gmail.com
Date: Sun, 9 May 2010 21:25:24 -0300
Subject: Re: [tallerdeprogramacion] duda tp4
To: tallerdepr...@googlegroups.com

Subir, organizar y compartir documentos online, está a un clic de tu bandeja de entrada. Ver más

Leandro Fernández

unread,
May 10, 2010, 2:43:34 PM5/10/10
to tallerdepr...@googlegroups.com
Evidentemente el join de la línea 41 de common_Thread.h, llamado en el destructor, está pasándole un handle de thread inválido.

2010/5/10 .s.e.b.a. b.o.r.d.o.l.i.n.o. <gallin...@hotmail.com>

.s.e.b.a. b.o.r.d.o.l.i.n.o.

unread,
May 10, 2010, 2:57:46 PM5/10/10
to tallerdepr...@googlegroups.com
yo tengo esto:

    void esperar(){
        seguir = false;
        void * r;
        pthread_join(t , &r);
        pthread_exit(r);
    }   

donde t es:

    pthread_t t;

creado en:

    pthread_create(&t,NULL,run_thread,this);

 

 

 

 

 

 






From: drk...@gmail.com
Date: Mon, 10 May 2010 15:43:34 -0300

¿Tu casilla de email se queda sin espacio? Hotmail te ofrece 25 GB gratis. Registrá tu cuenta aquí

Leandro Fernández

unread,
May 10, 2010, 3:16:36 PM5/10/10
to tallerdepr...@googlegroups.com
Probá con

void * r = NULL;

Si eso no lo arregla, el problema está en t, el handle del thread.

2010/5/10 .s.e.b.a. b.o.r.d.o.l.i.n.o. <gallin...@hotmail.com>

.s.e.b.a. b.o.r.d.o.l.i.n.o.

unread,
May 10, 2010, 3:59:24 PM5/10/10
to tallerdepr...@googlegroups.com
Sigue igual... cuál puede ser el error en t? :S estoy buscando pero no encuentro nada en la web

 

 

 

 

 

 

 




From: drk...@gmail.com
Date: Mon, 10 May 2010 16:16:36 -0300

Tu vida no tiene límites, ahora Hotmail tampoco. 25 GB para organizar y compartir todo. Hacé clic aquí

Matias Mazzei

unread,
May 10, 2010, 4:00:11 PM5/10/10
to tallerdepr...@googlegroups.com
Quizá se deba a alguno de estos dos puntos que menciona el man de pthread_join:

===========================
The results of multiple simultaneous calls to pthread_join()
specifying the same target thread are undefined. If the thread calling
pthread_join() is canceled, then the target thread will not be
detached.
===========================

¡Saludos!

---
Matías Mazzei

2010/5/10 Leandro Fernández <drk...@gmail.com>:

Matias Mazzei

unread,
May 10, 2010, 4:02:16 PM5/10/10
to tallerdepr...@googlegroups.com
Por las dudas podrías probar evaluar el valor de retorno de
pthread_join y compararlo con los esperados para obtener la causa de
error (en caso de que haya alguna).

---
Matías Mazzei

.s.e.b.a. b.o.r.d.o.l.i.n.o.

unread,
May 11, 2010, 10:45:15 AM5/11/10
to tallerdepr...@googlegroups.com
el problema es que no puedo ver el valor de retorno porque en el join se produce la sementation fault... mi apuesta es que hay algo mal con el t que le estoy pasando pero la verdad no entiendo qué... es más ahora lo cambie para crearlos explícitamente joinables pero ni así



> Date: Mon, 10 May 2010 17:02:16 -0300

> Subject: Re: [tallerdeprogramacion] duda tp4

Tu vida no tiene límites, ahora Hotmail tampoco. 25 GB para organizar y compartir todo. Hacé clic aquí

--

Maximiliano Javier Stibel

unread,
May 11, 2010, 10:59:21 AM5/11/10
to tallerdepr...@googlegroups.com
Pregunta trivial:

¿dónde está declarado el handler t? ¿revisaste y aseguraste que se creara correctamente antes del join? no estarás haciendo alguna copia indebida del handler?

Saludos,
maxi

2010/5/11 .s.e.b.a. b.o.r.d.o.l.i.n.o. <gallin...@hotmail.com>

.s.e.b.a. b.o.r.d.o.l.i.n.o.

unread,
May 11, 2010, 11:25:11 AM5/11/10
to tallerdepr...@googlegroups.com
tengo un atributo:

    pthread_t t;

y se crea en el método:

    void start(){
           pthread_attr_t attr;
        pthread_attr_init(&attr);
           pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
        pthread_create(&t,&attr,run_thread,this);
    }


en el código, siempre que creo un objeto que hereda de thread, llamo a este método

 

 

 

 






From: m.st...@gmail.com
Date: Tue, 11 May 2010 11:59:21 -0300

Subject: Re: [tallerdeprogramacion] duda tp4

Subir, organizar y compartir documentos online, está a un clic de tu bandeja de entrada. Ver más

--

Maximiliano Javier Stibel

unread,
May 11, 2010, 11:49:58 AM5/11/10
to tallerdepr...@googlegroups.com
debuggeá el código y fijate si t no se altera en alguna parte, o si no estás llamando dos veces al método esperar.
por otro lado, el SIGSEGV que te aparecía antes, anteriormente a modificar la falta de inicialización de la variable r, sigue siendo el mismo?

saludos,
Maxi

2010/5/11 .s.e.b.a. b.o.r.d.o.l.i.n.o. <gallin...@hotmail.com>

.s.e.b.a. b.o.r.d.o.l.i.n.o.

unread,
May 11, 2010, 11:57:21 AM5/11/10
to tallerdepr...@googlegroups.com
Sí, es el mismo segmentation fault... llama una sóla vez al esperar, y cuando entra a la línea del join se produce

No importa si es pesado o liviano. Con Hotmail Skydrive tenés 25 GB para guardar todo. Más Info

--

.s.e.b.a. b.o.r.d.o.l.i.n.o.

unread,
May 11, 2010, 2:51:02 PM5/11/10
to tallerdepr...@googlegroups.com
Buenas: ya pude solucionar el problema de la SIGSEGV en el join: para arreglarlo creé un atributo booleano que se setea en caso de ejecutar el create y sólo en ese caso entra al join... es raro porque debuggeando me cercioré de que siempre se llamara al create pero buen... se que había alguien con un problema similar, espero que le sirva el dato.
Ahora mi problema es con el shutdown:
si pongo shutdown el programa anda bien pero aparece un mensaje de error: ERROR: Invalid argument
si no lo pongo se queda colgado en el accept...
alguien sabe a qué puede deberse esto? Saludos, Sebastián Piccoli

 

 

 

 

 

 




¿Tu casilla de email se queda sin espacio? Hotmail te ofrece 25 GB gratis. Registrá tu cuenta aquí
Reply all
Reply to author
Forward
0 new messages