summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
Diffstat (limited to 'includes')
-rw-r--r--includes/Handle.h64
-rw-r--r--includes/Input.h18
-rw-r--r--includes/Task.h12
3 files changed, 93 insertions, 1 deletions
diff --git a/includes/Handle.h b/includes/Handle.h
new file mode 100644
index 0000000..d2e1f8c
--- /dev/null
+++ b/includes/Handle.h
@@ -0,0 +1,64 @@
+#pragma once
+
+#include <Exceptions.h>
+
+namespace Balau {
+
+class EAgain : public GeneralException {
+ public:
+ EAgain() : GeneralException("Try Again") { }
+};
+
+class IO;
+
+class Handle {
+ public:
+ virtual ~Handle() { Assert(m_refCount == 0); }
+ virtual void close() throw (GeneralException) = 0;
+ virtual bool isClosed() = 0;
+ virtual bool canSeek();
+ virtual bool canRead();
+ virtual bool canWrite();
+ virtual const char * getName() = 0;
+ virtual ssize_t read(void * buf, size_t count) throw (GeneralException);
+ virtual ssize_t write(const void * buf, size_t count) throw (GeneralException);
+ virtual void rseek(off_t offset, int whence = SEEK_SET) throw (GeneralException);
+ virtual void wseek(off_t offset, int whence = SEEK_SET) throw (GeneralException);
+ virtual off_t rtell() throw (GeneralException);
+ virtual off_t wtell() throw (GeneralException);
+ virtual off_t getSize();
+ protected:
+ Handle() : m_refCount(0) { }
+ private:
+ void addRef() { m_refCount++; }
+ void delRef() { if (--m_refCount == 0) { if (!isClosed()) close(); delete this; } }
+ int refCount() { return m_refCount; }
+ friend class IO;
+
+ int m_refCount;
+};
+
+class IO {
+ public:
+ template<class T> IO(T * h) { setHandle(h); }
+ ~IO() { m_h->delRef(); }
+ IO(const IO & io) { setHandle(io.m_h); }
+ Handle * operator->() { return m_h; }
+ protected:
+ void setHandle(Handle * h) { m_h = h; m_h->addRef(); }
+ private:
+ Handle * m_h;
+};
+
+class SeekableHandle : public Handle {
+ public:
+ virtual bool canSeek();
+ virtual void rseek(off_t offset, int whence = SEEK_SET) throw (GeneralException);
+ virtual void wseek(off_t offset, int whence = SEEK_SET) throw (GeneralException);
+ virtual off_t rtell() throw (GeneralException);
+ virtual off_t wtell() throw (GeneralException);
+ private:
+ off_t m_wOffset, m_rOffset;
+};
+
+};
diff --git a/includes/Input.h b/includes/Input.h
new file mode 100644
index 0000000..418b018
--- /dev/null
+++ b/includes/Input.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include <Handle.h>
+
+namespace Balau {
+
+class Input : public SeekableHandle {
+ public:
+ Input(const char * fname) throw (GeneralException);
+ virtual void close() throw (GeneralException);
+ virtual bool isClosed();
+ virtual const char * getName();
+ private:
+ int m_fd;
+ String m_name;
+};
+
+};
diff --git a/includes/Task.h b/includes/Task.h
index f0c1bbb..8a504c7 100644
--- a/includes/Task.h
+++ b/includes/Task.h
@@ -44,6 +44,15 @@ class TaskEvent : public BaseEvent {
Task * m_taskWaited;
};
+class Custom : public BaseEvent {
+ public:
+ void doSignal() { BaseEvent::doSignal(); ev_break(m_loop, EVBREAK_ALL); }
+ protected:
+ virtual void gotOwner(Task * task);
+ private:
+ struct ev_loop * m_loop;
+};
+
};
class Task {
@@ -60,9 +69,10 @@ 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(); }
TaskMan * getTaskMan() { return m_taskMan; }
protected:
- void suspend();
+ void yield();
virtual void Do() = 0;
void waitFor(Events::BaseEvent * event);
private: