]> git.llucax.com Git - z.facultad/75.42/plaqui.git/commitdiff
Se agregan un par de mutex porque el server se muere con segmentation fault
authorLeandro Lucarella <llucax@gmail.com>
Thu, 23 Oct 2003 02:59:19 +0000 (02:59 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Thu, 23 Oct 2003 02:59:19 +0000 (02:59 +0000)
cuando recibe muchas conexiones simultaneas. Tambien se agrega un limite a las
conexiones pendientes en el listen(). Con todo esto se sigue colgando.

Server/include/plaqui/server/runnable.h
Server/include/plaqui/server/tcpserver.h
Server/src/runnable.cpp
Server/src/tcpserver.cpp
Server/tests/server_test.cpp

index 7896090370af01d016ff3da2bd31b84326a80db3..cc3bb0ec16df90260b871e4608ec8966b0b6d55d 100644 (file)
@@ -64,6 +64,12 @@ namespace Server {
                         */
                        bool stop;
 
                         */
                        bool stop;
 
+                       /**
+                        * Exclusión mutua.
+                        * Recurso usado para recibir la exclusividad sobre un recurso.
+                        */
+                       Glib::Mutex mutex;
+
                // Métodos.
 
                private:
                // Métodos.
 
                private:
index b3ecfa6c25c1b0f392103b592e360560eb8570bd..02906290f6cfd601fb95e4d8f03b3e1c50d3057e 100644 (file)
@@ -47,6 +47,9 @@ namespace Server {
 
                private:
 
 
                private:
 
+                       /// Cantidad máxima de conexiones pendientes.
+                       static const unsigned MAX_PENDING_CONNECTIONS;
+
                        /// Lista de conexiones de control.
                        typedef std::list<Connection*> ConnectionList;
 
                        /// Lista de conexiones de control.
                        typedef std::list<Connection*> ConnectionList;
 
index 7fd410535c9c6893145182e8a3b3f358636eb4fc..cb3ba6fc84f1d14c1fee71ead30f98eadd4eef43 100644 (file)
@@ -61,10 +61,6 @@ void PlaQui::Server::Runnable::run(bool detach) {
 #endif // DEBUG
        // Si vamos a correr la tarea en un thread.
        if (detach) {
 #endif // DEBUG
        // Si vamos a correr la tarea en un thread.
        if (detach) {
-               // Nos aseguramos de tener threads.
-               if (!Glib::thread_supported()) {
-                       Glib::thread_init();
-               }
                // Corremos el thread en una funcion estática para poder destruirlo al
                // finalizar, pasandole el puntero al objeto.
                thread = Glib::Thread::create(
                // Corremos el thread en una funcion estática para poder destruirlo al
                // finalizar, pasandole el puntero al objeto.
                thread = Glib::Thread::create(
@@ -81,7 +77,6 @@ void PlaQui::Server::Runnable::finish(bool attach) {
 #ifdef DEBUG
        std::cerr << __FILE__ << ": finish(attach = " << attach << ")" << std::endl;
 #endif // DEBUG
 #ifdef DEBUG
        std::cerr << __FILE__ << ": finish(attach = " << attach << ")" << std::endl;
 #endif // DEBUG
-       // TODO - necesita un mutex?
        stop = true;
        if (attach) {
                thread->join();
        stop = true;
        if (attach) {
                thread->join();
index 413122464a6b263b54762937d2a83296cc11a8a9..a9ce0303b6642aa0465cf443e498a88d74673d9c 100644 (file)
@@ -31,6 +31,8 @@
 #      include <iostream>
 #endif // DEBUG
 
 #      include <iostream>
 #endif // DEBUG
 
+const unsigned PlaQui::Server::TCPServer::MAX_PENDING_CONNECTIONS = 5;
+
 PlaQui::Server::TCPServer::~TCPServer(void) {
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": destructor." << std::endl;
 PlaQui::Server::TCPServer::~TCPServer(void) {
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": destructor." << std::endl;
@@ -47,7 +49,7 @@ PlaQui::Server::TCPServer::TCPServer(int port):
        std::cerr << __FILE__ <<  ": escuchando en " << socket.localhost()
                << ":" << socket.localport() << "." << std::endl;
 #endif // DEBUG
        std::cerr << __FILE__ <<  ": escuchando en " << socket.localhost()
                << ":" << socket.localport() << "." << std::endl;
 #endif // DEBUG
-       socket.listen();
+       socket.listen(MAX_PENDING_CONNECTIONS);
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": [despues de listen()] escuchando en "
                << socket.localhost() << ":" << socket.localport() << "." << std::endl;
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": [despues de listen()] escuchando en "
                << socket.localhost() << ":" << socket.localport() << "." << std::endl;
@@ -60,7 +62,7 @@ void PlaQui::Server::TCPServer::on_connection_finished(
        std::cerr << __FILE__ <<  ": on_connection_finished(connection = "
                << connection << ")" << std::endl;
 #endif // DEBUG
        std::cerr << __FILE__ <<  ": on_connection_finished(connection = "
                << connection << ")" << std::endl;
 #endif // DEBUG
-       // TODO: poner lock.
+       mutex.lock();
        connections.remove(connection);
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": lista de conexiones" << std::endl;
        connections.remove(connection);
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": lista de conexiones" << std::endl;
@@ -69,33 +71,32 @@ void PlaQui::Server::TCPServer::on_connection_finished(
                std::cerr << "\t " << *i << std::endl;
        }
 #endif // DEBUG
                std::cerr << "\t " << *i << std::endl;
        }
 #endif // DEBUG
-       // TODO: sacar lock.
+       mutex.unlock();
 }
 
 }
 
+/// \todo TODO: ver tema de timeout o como salir de un accept().
 void PlaQui::Server::TCPServer::real_run(void) {
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": real_run()" << std::endl;
 #endif // DEBUG
        Connection* connection;
        while (!stop) {
 void PlaQui::Server::TCPServer::real_run(void) {
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": real_run()" << std::endl;
 #endif // DEBUG
        Connection* connection;
        while (!stop) {
-               // TODO: ver tema de timeout o como salir de un accept().
                // Forma grasa de salir del accept: crear conexion que salga al toque.
                connection = new_connection(socket.accept());
 #ifdef DEBUG
                // Forma grasa de salir del accept: crear conexion que salga al toque.
                connection = new_connection(socket.accept());
 #ifdef DEBUG
-       std::cerr << __FILE__ <<  ": real_run(): connection = " << connection
-               << std::endl;
+               std::cerr << __FILE__ <<  ": real_run(): connection = " << connection
+                       << std::endl;
 #endif // DEBUG
 #endif // DEBUG
-               // TODO: poner lock.
+               mutex.lock();
                connections.push_back(connection);
 #ifdef DEBUG
                connections.push_back(connection);
 #ifdef DEBUG
-       std::cerr << __FILE__ <<  ": real_run(): lista de conexiones" << std::endl;
-       for (ConnectionList::const_iterator i = connections.begin();
-                       i != connections.end(); i++) {
-               std::cerr << "\t " << *i << std::endl;
-       }
+               std::cerr << __FILE__ <<  ": real_run(): lista de conexiones" << std::endl;
+               for (ConnectionList::const_iterator i = connections.begin();
+                               i != connections.end(); i++) {
+                       std::cerr << "\t " << *i << std::endl;
+               }
 #endif // DEBUG
 #endif // DEBUG
-               // TODO: sacar lock.
-               // TODO: esto va en Server::new_connection()
+               mutex.unlock();
                // Conecto la señal para cuando termina una conexión, borrarla.
                connection->signal_finished().connect(
                                SigC::bind<Connection*>(
                // Conecto la señal para cuando termina una conexión, borrarla.
                connection->signal_finished().connect(
                                SigC::bind<Connection*>(
index eddd8dda9ce9217a7aa57cdf1788395bd2340a59..1927af4fb518a0f17a0bd3120ebe7b9e206e3a72 100644 (file)
@@ -53,6 +53,9 @@ int main(int argc, char* argv[]) {
                str >> port;
        }
 
                str >> port;
        }
 
+       // Inicializa threads.
+       Glib::thread_init();
+
        // Corre el server.
        Server server(port);
        server.run(false);
        // Corre el server.
        Server server(port);
        server.run(false);