From 3cf44918b7d7f1cba6a71bdbe1ecb3742941b034 Mon Sep 17 00:00:00 2001 From: Pixel Date: Thu, 13 Oct 2011 23:51:21 -0700 Subject: The tasks can now set themselves to be non-preemptible. Also implemented a mechanism to re-arm an event. --- includes/Task.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'includes/Task.h') diff --git a/includes/Task.h b/includes/Task.h index 8a504c7..c4d9a46 100644 --- a/includes/Task.h +++ b/includes/Task.h @@ -18,8 +18,9 @@ class BaseEvent { BaseEvent() : m_signal(false), m_task(NULL) { } bool gotSignal() { return m_signal; } void doSignal(); + void reset() { Assert(m_task != NULL); m_signal = false; gotOwner(m_task); } Task * taskWaiting() { Assert(m_task); return m_task; } - void registerOwner(Task * task) { Assert(m_task == NULL); m_task = task; gotOwner(task); } + void registerOwner(Task * task) { if (m_task == task) return; Assert(m_task == NULL); m_task = task; gotOwner(task); } protected: virtual void gotOwner(Task * task) { } private: @@ -31,6 +32,7 @@ class Timeout : public BaseEvent { public: Timeout(ev_tstamp tstamp); void evt_cb(ev::timer & w, int revents); + void set(ev_tstamp tstamp); private: virtual void gotOwner(Task * task); ev::timer m_evt; @@ -69,12 +71,14 @@ class Task { virtual const char * getName() = 0; Status getStatus() { return m_status; } static Task * getCurrentTask(); - static void yield(Events::BaseEvent * evt) { Task * t = getCurrentTask(); t->waitFor(evt); t->yield(); } + static void yield(Events::BaseEvent * evt) { Task * t = getCurrentTask(); t->waitFor(evt, true); t->yield(true); } TaskMan * getTaskMan() { return m_taskMan; } + struct ev_loop * getLoop(); protected: - void yield(); + void yield(bool override = false); virtual void Do() = 0; - void waitFor(Events::BaseEvent * event); + void waitFor(Events::BaseEvent * event, bool override = false); + void setPreemptible(bool enable); private: size_t stackSize() { return 128 * 1024; } void switchTo(); @@ -88,6 +92,7 @@ class Task { friend class Events::TaskEvent; typedef std::vector waitedByList_t; waitedByList_t m_waitedBy; + struct ev_loop * m_loop; }; }; -- cgit v1.2.3