// $Id$
//
-#include "runnable.h"
+#include "plaqui/server/runnable.h"
#include <sigc++/class_slot.h>
#include <glibmm/thread.h>
#ifdef DEBUG
# 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();
}
+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
+