]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/src/server.cpp
Se termina de poner prolijo Runnable:
[z.facultad/75.42/plaqui.git] / Server / src / server.cpp
index 340c2f05801dbeebdc216f63a056e851f5413b16..e332866d37954f4b22da97a9dbb3b3c1ae976d41 100644 (file)
@@ -29,6 +29,7 @@
 #include "plaqui/server/connection.h"
 #include "plaqui/server/controlserver.h"
 #include <sigc++/class_slot.h>
+#include <glibmm/timer.h>
 #include <sstream>
 #include <exception>
 #ifdef DEBUG
@@ -47,10 +48,19 @@ Server::~Server(void) {
        cerr << __FILE__ << "(" << __LINE__ << ")"
                <<  ": destructor." << endl;
 #endif // DEBUG
-       // Termino plantas.
-       Glib::Mutex::Lock lock(plants_mutex);
-       for (PlantList::iterator i = plants.end(); i != plants.end(); i++) {
-               i->second->finish(true);
+       // Mando a terminar todas las plantas.
+       plants_mutex.lock();
+       for (PlantList::iterator i = plants.begin(); i != plants.end(); i++) {
+               i->second->finish();
+       }
+       PlantList::size_type count = plants.size();
+       plants_mutex.unlock();
+       // Espero que terminen realmente.
+       while (count) {
+               Glib::usleep(10000); // 10 milisegundos
+               plants_mutex.lock();
+               count = plants.size();
+               plants_mutex.unlock();
        }
 }
 
@@ -60,7 +70,7 @@ Server::Server(const string& plant_filename, const Connection::Port& port)
        cerr << __FILE__ << "(" << __LINE__ << ")"
                <<  ": port = " << port << endl;
 #endif // DEBUG
-       // FIXME
+       // FIXME - hacer que se puedan cargar mas plantas bien.
        Glib::Mutex::Lock lock(plants_mutex);
        plants["default"] = new Plant(plant_filename);
        plants["default"]->signal_finished().connect(
@@ -114,6 +124,19 @@ void Server::on_control_command_received(const Command& command,
                        finish();
                        response = new HTTPResponse(HTTPMessage::OK,
                                        "<response desc=\"El server se apagará en instantes...\" />");
+                       response->headers["Content-Type"] = "text/xml; charset=iso-8859-1";
+                       controlserver->send(*response);
+                       delete response;
+                       // Creo una conexión suicida para que el accept() del server retorne
+                       // el control y el server pueda terminar realmente.
+                       try {
+                               sockinetbuf suicida(sockbuf::sock_stream);
+                               suicida.connect(socket.localhost(), socket.localport());
+                       } catch (...) {
+                               // FIXME
+                               signal_error().emit(12345, "ahhhh! no puedo crear conexion suicida");
+                       }
+                       return;
                } else {
                        response = new HTTPResponse(HTTPMessage::NOT_FOUND,
                                        "<response desc=\"Invalid command for 'server' taget!\" />");