<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -14,17 +14,18 @@ Syscall::Syscall(): _syscalls_assigned(0) {
 	addSyscall(5, (void *)&amp;User::irqListen);
 	addSyscall(6, (void *)&amp;User::panic);
 	addSyscall(7, (void *)&amp;User::registerName);
-	addSyscall(8, (void *)&amp;User::registerNode);
+	addSyscall(8, (void *)&amp;User::registerStream);
 	addSyscall(9, (void *)&amp;User::exit);
-	addSyscall(10, (void *)&amp;User::obtainNodeWriter);
-	addSyscall(11, (void *)&amp;User::obtainNodeListener);
-	addSyscall(12, (void *)&amp;User::readNode);
-	addSyscall(13, (void *)&amp;User::readNodeUnblock);
-	addSyscall(14, (void *)&amp;User::writeNode);
+	addSyscall(10, (void *)&amp;User::obtainStreamWriter);
+	addSyscall(11, (void *)&amp;User::obtainStreamListener);
+	addSyscall(12, (void *)&amp;User::readStream);
+	addSyscall(13, (void *)&amp;User::readStreamUnblock);
+	addSyscall(14, (void *)&amp;User::writeStream);
 	addSyscall(15, (void *)&amp;User::defer);
 	addSyscall(16, (void *)&amp;User::malloc);
 	addSyscall(17, (void *)&amp;User::free);
 	addSyscall(18, (void *)&amp;User::memcpy);
+	addSyscall(19, (void *)&amp;User::registerQueue);
 }
 
 u8 Syscall::versionMajor() const { return 0; }</diff>
      <filename>Syscall.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -234,10 +234,10 @@ void Tasks::Task::setIOMap(u8 port, bool enabled) {
 		iomap[port / 8] |= (1 &lt;&lt; (port % 8));
 }
 
-Tasks::Task::Node::Node(): _wl_id(0) {
+Tasks::Task::Stream::Stream(): _wl_id(0) {
 }
 
-u32 Tasks::Task::Node::registerWriter(bool exclusive) {
+u32 Tasks::Task::Stream::registerWriter(bool exclusive) {
 	if (_exclusive) return -1;
 
 	if (exclusive) {
@@ -253,13 +253,13 @@ u32 Tasks::Task::Node::registerWriter(bool exclusive) {
 	return id;
 }
 
-u32 Tasks::Task::Node::registerListener() {
+u32 Tasks::Task::Stream::registerListener() {
 	u32 id = _nextId();
 	_listeners.push_back(Listener(id));
 	return id;
 }
 
-Tasks::Task::Node::Listener &amp;Tasks::Task::Node::getListener(u32 id) {
+Tasks::Task::Stream::Listener &amp;Tasks::Task::Stream::getListener(u32 id) {
 	for (LinkedList&lt;Listener&gt;::iterator it = _listeners.begin(); it != _listeners.end(); ++it) {
 		if (it-&gt;_id == id)
 			return *it;
@@ -267,13 +267,13 @@ Tasks::Task::Node::Listener &amp;Tasks::Task::Node::getListener(u32 id) {
 	AkariPanic(&quot;No matching listener - TODO: something more useful.&quot;);
 }
 
-void Tasks::Task::Node::writeAllListeners(const char *buffer, u32 n) {
+void Tasks::Task::Stream::writeAllListeners(const char *buffer, u32 n) {
 	for (LinkedList&lt;Listener&gt;::iterator it = _listeners.begin(); it != _listeners.end(); ++it) {
 		it-&gt;append(buffer, n);
 	}
 }
 
-bool Tasks::Task::Node::hasWriter(u32 id) const {
+bool Tasks::Task::Stream::hasWriter(u32 id) const {
 	for (LinkedList&lt;u32&gt;::iterator it = _writers.begin(); it != _writers.end(); ++it) {
 		if (*it == id)
 			return true;
@@ -281,7 +281,7 @@ bool Tasks::Task::Node::hasWriter(u32 id) const {
 	return false;
 }
 
-bool Tasks::Task::Node::hasListener(u32 id) const {
+bool Tasks::Task::Stream::hasListener(u32 id) const {
 	for (LinkedList&lt;Listener&gt;::iterator it = _listeners.begin(); it != _listeners.end(); ++it) {
 		if (it-&gt;_id == id)
 			return true;
@@ -289,10 +289,10 @@ bool Tasks::Task::Node::hasListener(u32 id) const {
 	return false;
 }
 
-Tasks::Task::Node::Listener::Listener(u32 id): _id(id), _buffer(0), _buflen(0), _hooked(0)
+Tasks::Task::Stream::Listener::Listener(u32 id): _id(id), _buffer(0), _buflen(0), _hooked(0)
 { }
 
-void Tasks::Task::Node::Listener::append(const char *data, u32 n) {
+void Tasks::Task::Stream::Listener::append(const char *data, u32 n) {
 	// HACK: hacky little appending string reallocing stupid buffer.
 	// Write a proper appending buffer (with smarts) and refactor it later.
 	if (n == 0) return;
@@ -315,7 +315,7 @@ void Tasks::Task::Node::Listener::append(const char *data, u32 n) {
 	}
 }
 
-void Tasks::Task::Node::Listener::reset() {
+void Tasks::Task::Stream::Listener::reset() {
 	if (_buffer) {
 		delete [] _buffer;
 		_buffer = 0;
@@ -323,7 +323,7 @@ void Tasks::Task::Node::Listener::reset() {
 	}
 }
 
-void Tasks::Task::Node::Listener::cut(u32 n) {
+void Tasks::Task::Stream::Listener::cut(u32 n) {
 	if (!_buffer) return;
 	if (_buflen &lt;= n) {
 		delete [] _buffer;
@@ -341,26 +341,28 @@ void Tasks::Task::Node::Listener::cut(u32 n) {
 	}
 }
 
-void Tasks::Task::Node::Listener::hook(Task *task) {
+void Tasks::Task::Stream::Listener::hook(Task *task) {
 	_hooked = task;
 }
 
-void Tasks::Task::Node::Listener::unhook() {
+void Tasks::Task::Stream::Listener::unhook() {
 	_hooked = 0;
 }
 
-const char *Tasks::Task::Node::Listener::view() const {
+const char *Tasks::Task::Stream::Listener::view() const {
 	return _buffer;
 }
 
-u32 Tasks::Task::Node::Listener::length() const {
+u32 Tasks::Task::Stream::Listener::length() const {
 	return _buflen;
 }
 
-u32 Tasks::Task::Node::_nextId() {
+u32 Tasks::Task::Stream::_nextId() {
 	return ++_wl_id;
 }
 
+Tasks::Task::Queue::Queue() { }
+
 Tasks::Task::Task(u8 cpl):
 		next(0), priorityNext(0), irqWaiting(false), irqListen(0), irqListenHits(0),
 		userWaiting(false), userCall(0),
@@ -374,5 +376,6 @@ Tasks::Task::Task(u8 cpl):
 	for (u8 i = 0; i &lt; 32; ++i)
 		iomap[i] = 0xFF;
 
-	nodesByName = new HashTable&lt;Symbol, Node *&gt;();
+	streamsByName = new HashTable&lt;Symbol, Stream *&gt;();
+	queuesByName = new HashTable&lt;Symbol, Queue *&gt;();
 }</diff>
      <filename>Tasks.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -113,11 +113,10 @@ void ATAProcess() {
 	 */
 
 	// Now we need to wait and listen for commands!
-	// I think we need a message passing method for this, not just our current reader/writer.
 	if (!SYSCALL_BOOL(syscall_registerName(&quot;system.io.ata&quot;)))
 		syscall_panic(&quot;could not register system.io.ata&quot;);
 
-	if (!SYSCALL_BOOL(syscall_registerNode(&quot;command&quot;)))
+	if (!SYSCALL_BOOL(syscall_registerQueue(&quot;command&quot;)))
 		syscall_panic(&quot;could not register system.io.ata:command&quot;);
 }
 </diff>
      <filename>TmpATA.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -7,6 +7,7 @@
 #include &lt;Tasks.hpp&gt;
 #include &lt;Syscall.hpp&gt;
 
+
 namespace User {
 	void putc(char c) {
 		Akari-&gt;console-&gt;putChar(c);
@@ -58,8 +59,8 @@ namespace User {
 		return true;
 	}
 
-	bool registerNode(const char *node) {
-		Symbol sNode(node);
+	bool registerStream(const char *name) {
+		Symbol sNode(name);
 		if (!Akari-&gt;tasks-&gt;current-&gt;registeredName) {
 			// TODO: just kill the process, don't kill the system.
 			// TODO: is this correct behaviour? Or could we have registered nodes
@@ -67,13 +68,30 @@ namespace User {
 			AkariPanic(&quot;name not registered - cannot register node&quot;);
 		}
 
-		if (Akari-&gt;tasks-&gt;current-&gt;nodesByName-&gt;hasKey(node)) {
+		if (Akari-&gt;tasks-&gt;current-&gt;streamsByName-&gt;hasKey(name)) {
+			AkariPanic(&quot;node already registered - cannot register atop it&quot;);
+		}
+
+		Tasks::Task::Stream *target = new Tasks::Task::Stream();
+
+		(*Akari-&gt;tasks-&gt;current-&gt;streamsByName)[sNode] = target;
+		return true;
+	}
+
+	bool registerQueue(const char *name) {
+		Symbol sNode(name);
+		if (!Akari-&gt;tasks-&gt;current-&gt;registeredName) {
+			// TODO
+			AkariPanic(&quot;name not registered - cannot register node&quot;);
+		}
+
+		if (Akari-&gt;tasks-&gt;current-&gt;streamsByName-&gt;hasKey(name)) {
 			AkariPanic(&quot;node already registered - cannot register atop it&quot;);
 		}
 
-		Tasks::Task::Node *target = new Tasks::Task::Node();
+		Tasks::Task::Queue *target = new Tasks::Task::Queue();
 
-		(*Akari-&gt;tasks-&gt;current-&gt;nodesByName)[sNode] = target;
+		(*Akari-&gt;tasks-&gt;current-&gt;queuesByName)[sNode] = target;
 		return true;
 	}
 
@@ -95,33 +113,33 @@ namespace User {
 		// Gone! XXX what happens when the last task exists!? Everything probably goes to hell ...
 	}
 
-	static inline Tasks::Task::Node *getNode(const char *name, const char *node) {
+	static inline Tasks::Task::Stream *getStream(const char *name, const char *node) {
 		Symbol sName(name), sNode(node);
 
 		if (!Akari-&gt;tasks-&gt;registeredTasks-&gt;hasKey(sName))
 			return 0;
 
 		Tasks::Task *task = (*Akari-&gt;tasks-&gt;registeredTasks)[sName];
-		if (!task-&gt;nodesByName-&gt;hasKey(sNode))
+		if (!task-&gt;streamsByName-&gt;hasKey(sNode))
 			return 0;
 
-		return (*task-&gt;nodesByName)[sNode];
+		return (*task-&gt;streamsByName)[sNode];
 	}
 
-	u32 obtainNodeWriter(const char *name, const char *node, bool exclusive) {
-		Tasks::Task::Node *target = getNode(name, node);
+	u32 obtainStreamWriter(const char *name, const char *node, bool exclusive) {
+		Tasks::Task::Stream *target = getStream(name, node);
 		if (!target) return -1;
 		return target-&gt;registerWriter(exclusive);
 	}
 
-	u32 obtainNodeListener(const char *name, const char *node) {
-		Tasks::Task::Node *target = getNode(name, node);
+	u32 obtainStreamListener(const char *name, const char *node) {
+		Tasks::Task::Stream *target = getStream(name, node);
 		if (!target) return -1;
 		return target-&gt;registerListener();
 	}
 
 	// Keeping in mind that `buffer''s data probably isn't asciz.
-	u32 readNode_impl(const char *name, const char *node, u32 listener, char *buffer, u32 n, bool block) {
+	u32 readStream_impl(const char *name, const char *node, u32 listener, char *buffer, u32 n, bool block) {
 		ReadCall c(name, node, listener, buffer, n);
 		u32 r = c();
 		if (!block || !c.shallBlock())
@@ -129,7 +147,7 @@ namespace User {
 	
 		// block &amp;&amp; r.shallBlock()
 		// Block until such time as some data is available.
-		Tasks::Task::Node::Listener *l = c.getListener();
+		Tasks::Task::Stream::Listener *l = c.getListener();
 
 		Akari-&gt;tasks-&gt;current-&gt;userWaiting = true;
 		Akari-&gt;tasks-&gt;current-&gt;userCall = new ReadCall(c);
@@ -138,15 +156,15 @@ namespace User {
 		return 0;
 	}
 
-	u32 readNode(const char *name, const char *node, u32 listener, char *buffer, u32 n) {
-		return readNode_impl(name, node, listener, buffer, n, true);
+	u32 readStream(const char *name, const char *node, u32 listener, char *buffer, u32 n) {
+		return readStream_impl(name, node, listener, buffer, n, true);
 	}
 
-	u32 readNodeUnblock(const char *name, const char *node, u32 listener, char *buffer, u32 n) {
-		return readNode_impl(name, node, listener, buffer, n, false);
+	u32 readStreamUnblock(const char *name, const char *node, u32 listener, char *buffer, u32 n) {
+		return readStream_impl(name, node, listener, buffer, n, false);
 	}
-	u32 writeNode(const char *name, const char *node, u32 writer, const char *buffer, u32 n) {
-		Tasks::Task::Node *target = getNode(name, node);
+	u32 writeStream(const char *name, const char *node, u32 writer, const char *buffer, u32 n) {
+		Tasks::Task::Stream *target = getStream(name, node);
 		if (!target || !target-&gt;hasWriter(writer)) return -1;
 
 		// We do have a writer, so we can go ahead and write to all listeners.
@@ -177,11 +195,11 @@ namespace User {
 		return dest;
 	}
 
-	ReadCall::ReadCall(const char *name, const char *node, u32 listener, char *buffer, u32 n):
-		_listener(&amp;getNode(name, node)-&gt;getListener(listener)), _buffer(buffer), _n(n)
+    ReadCall::ReadCall(const char *name, const char *node, u32 listener, char *buffer, u32 n):
+		_listener(&amp;getStream(name, node)-&gt;getListener(listener)), _buffer(buffer), _n(n)
 	{ }
 
-	Tasks::Task::Node::Listener *ReadCall::getListener() const {
+	Tasks::Task::Stream::Listener *ReadCall::getListener() const {
 		return _listener;
 	}
 </diff>
      <filename>UserCalls.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -63,3 +63,4 @@ DEFN_SYSCALL0(defer, 15);
 DEFN_SYSCALL1(malloc, 16, u32);
 DEFN_SYSCALL1(free, 17, void *);
 DEFN_SYSCALL3(memcpy, 18, void *, const void *, u32);
+DEFN_SYSCALL1(registerQueue, 19, const char *);</diff>
      <filename>UserGates.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -30,9 +30,10 @@ public:
 
 	class Task {
 	public:
-		class Node {
+
+		class Stream {
 		public:
-			Node();
+			Stream();
 			class Listener;
 
 			u32 registerWriter(bool exclusive);
@@ -44,7 +45,7 @@ public:
 			bool hasListener(u32 id) const;
 
 			class Listener {
-			friend class Node;
+			friend class Stream;
 			public:
 				Listener(u32 id);
 
@@ -73,6 +74,12 @@ public:
 			u32 _nextId();
 		};
 
+		class Queue {
+		public:
+			Queue();
+
+		};
+
 		static Task *BootstrapInitialTask(u8 cpl, Memory::PageDirectory *pageDirBase);
 		static Task *CreateTask(u32 entry, u8 cpl, bool interruptFlag, u8 iopl, Memory::PageDirectory *pageDirBase);
 
@@ -102,7 +109,8 @@ public:
 		u32 ks;
 		u8 iomap[32];
 
-		HashTable&lt;Symbol, Node *&gt; *nodesByName;
+		HashTable&lt;Symbol, Stream *&gt; *streamsByName;
+		HashTable&lt;Symbol, Queue *&gt; *queuesByName;
 
 	protected:
 		Task(u8 cpl);</diff>
      <filename>inc/Tasks.hpp</filename>
    </modified>
    <modified>
      <diff>@@ -15,13 +15,14 @@ namespace User {
 	void irqListen(u32 irq);
 	void panic(const char *s);
 	bool registerName(const char *name);
-	bool registerNode(const char *name);
+	bool registerStream(const char *name);
+	bool registerQueue(const char *name);
 	void exit();
-	u32 obtainNodeWriter(const char *name, const char *node, bool exclusive);
-	u32 obtainNodeListener(const char *name, const char *node);
-	u32 readNode(const char *name, const char *node, u32 listener, char *buffer, u32 n);
-	u32 readNodeUnblock(const char *name, const char *node, u32 listener, char *buffer, u32 n);
-	u32 writeNode(const char *name, const char *node, u32 writer, const char *buffer, u32 n);
+	u32 obtainStreamWriter(const char *name, const char *node, bool exclusive);
+	u32 obtainStreamListener(const char *name, const char *node);
+	u32 readStream(const char *name, const char *node, u32 listener, char *buffer, u32 n);
+	u32 readStreamUnblock(const char *name, const char *node, u32 listener, char *buffer, u32 n);
+	u32 writeStream(const char *name, const char *node, u32 writer, const char *buffer, u32 n);
 	void defer();
 	void *malloc(u32 n);
 	void free(void *p);
@@ -31,12 +32,12 @@ namespace User {
 	public:
 		ReadCall(const char *name, const char *node, u32 listener, char *buffer, u32 n);
 
-		Tasks::Task::Node::Listener *getListener() const;
+		Tasks::Task::Stream::Listener *getListener() const;
 
 		u32 operator ()();
 
 	protected:
-		Tasks::Task::Node::Listener *_listener;
+		Tasks::Task::Stream::Listener *_listener;
 		char *_buffer;
 		u32 _n;
 	};</diff>
      <filename>inc/UserCalls.hpp</filename>
    </modified>
    <modified>
      <diff>@@ -31,6 +31,7 @@ DECL_SYSCALL0(defer);
 DECL_SYSCALL1(malloc, u32);
 DECL_SYSCALL1(free, void *);
 DECL_SYSCALL3(memcpy, void *, const void *, u32);
+DECL_SYSCALL1(registerQueue, const char *);
 
 #define SYSCALL_BOOL(x) ((bool)((x) &amp; 0xFF))
 </diff>
      <filename>inc/UserGates.hpp</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>2e1976e2030f1f531bd057728b4e48bdead4c7fd</id>
    </parent>
  </parents>
  <author>
    <name>Arlen Cuss</name>
    <email>celtic@sairyx.org</email>
  </author>
  <url>http://github.com/celtic/akari/commit/eaed73dbbcc8cfb778edec21e8642a29cd4ce933</url>
  <id>eaed73dbbcc8cfb778edec21e8642a29cd4ce933</id>
  <committed-date>2009-11-06T20:25:37-08:00</committed-date>
  <authored-date>2009-11-06T20:25:37-08:00</authored-date>
  <message>After much deliberation, streams and queues ...</message>
  <tree>f4cbc3897f05eb31b1eace1846ba0e14b4e55c74</tree>
  <committer>
    <name>Arlen Cuss</name>
    <email>celtic@sairyx.org</email>
  </committer>
</commit>
