]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/src/runnable.cpp
Se corrige un bug.
[z.facultad/75.42/plaqui.git] / Server / src / runnable.cpp
index 0e8b4bde525dae9c80e9cdd4382fab2e5bd47b41..0439ca0d0e3f655011e90c9531d8e9eee485e1ff 100644 (file)
 #      include <iostream>
 #endif // DEBUG
 
-using namespace Plaqui;
+using namespace std;
 
-Runnable::Runnable(void): thread(0) {
+namespace PlaQui {
+
+namespace Server {
+
+Runnable::~Runnable(void) {
+#ifdef DEBUG
+       cerr << __FILE__ << ": destructor(this = " << this << ")"
+               << endl;
+#endif // DEBUG
+}
+
+Runnable::Runnable(void): thread(0), stop(false) {
+#ifdef DEBUG
+       cerr << __FILE__ << ": constructor." << endl;
+#endif // DEBUG
+}
+
+void Runnable::static_run(Runnable* runner) {
+#ifdef DEBUG
+       cerr << __FILE__ << ": static_run(runner = " << runner << ")"
+               << endl;
+#endif // DEBUG
+       runner->real_run();
+       runner->signal_finished().emit();
+       delete runner;
 }
 
 void Runnable::run(bool detach) {
 #ifdef DEBUG
-       std::cerr << __FILE__ << ": detach = " << detach << std::endl;
+       cerr << __FILE__ << ": run(detach = " << detach << ")" << endl;
 #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.
+               // Corremos el thread en una funcion estática para poder destruirlo al
+               // finalizar, pasandole el puntero al objeto.
                thread = Glib::Thread::create(
-                               SigC::slot_class(*this, &Runnable::real_run), true);
+                               SigC::bind<Runnable*>(SigC::slot(&Runnable::static_run), this),
+                               true);
        // Si no corremos la tarea normalmente.
        } else {
                real_run();
@@ -57,3 +79,21 @@ void Runnable::run(bool detach) {
                
 }
 
+void Runnable::finish(bool attach) {
+#ifdef DEBUG
+       cerr << __FILE__ << ": finish(attach = " << attach << ")" << endl;
+#endif // DEBUG
+       stop = true;
+       if (attach) {
+               thread->join();
+       }
+}
+
+Runnable::SignalFinished& Runnable::signal_finished(void) {
+       return finished;
+}
+
+} // namespace Server
+
+} // namespace PlaQui
+