From 20124b259c408a3ad4427df5176553298907106c Mon Sep 17 00:00:00 2001
From: Pixel <pixel@nobis-crew.org>
Date: Fri, 14 Oct 2011 08:52:01 -0700
Subject: Tweaking the Task class a bit. -) setPreemptible now returns the
 previous state -) Events may now not have an owner -) Events may now have a
 callback (even though it still needs an owner to get into the ev_loop, for
 these kind of watchers...)

TODO:
-) think about a way to start a watcher without requireing a Task
-) add a few more things in the Tasks unit tests
---
 includes/Task.h | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

(limited to 'includes')

diff --git a/includes/Task.h b/includes/Task.h
index 1fca27e..b106e9c 100644
--- a/includes/Task.h
+++ b/includes/Task.h
@@ -13,9 +13,18 @@ class Task;
 
 namespace Events {
 
+class BaseEvent;
+
+class Callback {
+  protected:
+    virtual void gotEvent(BaseEvent *) = 0;
+    friend class BaseEvent;
+};
+
 class BaseEvent {
   public:
-      BaseEvent() : m_signal(false), m_task(NULL) { }
+      BaseEvent() : m_cb(NULL), m_signal(false), m_task(NULL) { }
+      virtual ~BaseEvent() { if (m_cb) delete m_cb; }
     bool gotSignal() { return m_signal; }
     void doSignal();
     void reset() { Assert(m_task != NULL); m_signal = false; gotOwner(m_task); }
@@ -24,6 +33,7 @@ class BaseEvent {
   protected:
     virtual void gotOwner(Task * task) { }
   private:
+    Callback * m_cb;
     bool m_signal;
     Task * m_task;
 };
@@ -85,7 +95,7 @@ class Task {
     void yield(bool override = false);
     virtual void Do() = 0;
     void waitFor(Events::BaseEvent * event, bool override = false);
-    void setPreemptible(bool enable);
+    bool setPreemptible(bool enable);
   private:
     size_t stackSize() { return 128 * 1024; }
     void switchTo();
-- 
cgit v1.2.3