]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/src/runnable.cpp
Se corrige el bug encontrado por Nico.
[z.facultad/75.42/plaqui.git] / Server / src / runnable.cpp
index d96298013f1141648f738efd2f59afcd042b3077..0c6b477306347ffd64f012fc5b43817b7094bf5d 100644 (file)
 // $Id$
 //
 
 // $Id$
 //
 
-#include "runnable.h"
+#include "plaqui/server/runnable.h"
 #include <sigc++/class_slot.h>
 #include <glibmm/thread.h>
 #ifdef DEBUG
 #      include <iostream>
 #endif // DEBUG
 
 #include <sigc++/class_slot.h>
 #include <glibmm/thread.h>
 #ifdef DEBUG
 #      include <iostream>
 #endif // DEBUG
 
-using namespace Plaqui;
+PlaQui::Server::Runnable::~Runnable(void) {
+#ifdef DEBUG
+       std::cerr << __FILE__ << ": destructor." << std::endl;
+#endif // DEBUG
+}
+
+PlaQui::Server::Runnable::Runnable(void): thread(0), stop(false) {
+#ifdef DEBUG
+       std::cerr << __FILE__ << ": constructor." << std::endl;
+#endif // DEBUG
+}
 
 
-Runnable::Runnable(void): thread(0) {
+void PlaQui::Server::Runnable::static_run(PlaQui::Server::Runnable* runner) {
+#ifdef DEBUG
+       std::cerr << __FILE__ << ": runner = " << runner << std::endl;
+#endif // DEBUG
+       runner->real_run();
+       runner->signal_finished().emit();
+       delete runner;
 }
 
 }
 
-void Runnable::run(bool detach) {
+void PlaQui::Server::Runnable::run(bool detach) {
 #ifdef DEBUG
        std::cerr << __FILE__ << ": detach = " << detach << std::endl;
 #endif // DEBUG
 #ifdef DEBUG
        std::cerr << __FILE__ << ": detach = " << detach << std::endl;
 #endif // DEBUG
@@ -47,9 +63,13 @@ void Runnable::run(bool detach) {
                if (!Glib::thread_supported()) {
                        Glib::thread_init();
                }
                if (!Glib::thread_supported()) {
                        Glib::thread_init();
                }
-               // Corremos el thread.
+               // Corremos el thread en una funcion estática para poder destruirlo al
+               // finalizar, pasandole el puntero al objeto.
                thread = Glib::Thread::create(
                thread = Glib::Thread::create(
-                               SigC::slot_class(*this, &Runnable::real_run), true);
+                               SigC::bind<Runnable*>(
+                                       SigC::slot(&PlaQui::Server::Runnable::static_run),
+                                       this),
+                               true);
        // Si no corremos la tarea normalmente.
        } else {
                real_run();
        // Si no corremos la tarea normalmente.
        } else {
                real_run();
@@ -57,3 +77,19 @@ void Runnable::run(bool detach) {
                
 }
 
                
 }
 
+void PlaQui::Server::Runnable::finish(bool attach) {
+#ifdef DEBUG
+       std::cerr << __FILE__ << ": attach = " << attach << std::endl;
+#endif // DEBUG
+       // TODO - necesita un mutex?
+       stop = true;
+       if (attach) {
+               thread->join();
+       }
+}
+
+PlaQui::Server::Runnable::SignalFinished&
+PlaQui::Server::Runnable::signal_finished(void) {
+       return finished;
+}
+