Implement a lockless queue

This uses atomics to swap pointers from an array.  It is safe against
process death, and concurent writes.  It also uses signals to wakeup any
processes waiting for new data.

https://docs.google.com/document/d/10xulameLtEqjBFkm54UcN-5N-w5Q_XFNILvNf1Jl1Y4/edit#

Change-Id: Ie7b2aea6f869c1d84e0705aadb21d33fa8241b60
diff --git a/aos/ipc_lib/index.cc b/aos/ipc_lib/index.cc
new file mode 100644
index 0000000..ed58806
--- /dev/null
+++ b/aos/ipc_lib/index.cc
@@ -0,0 +1,33 @@
+#include "aos/ipc_lib/index.h"
+
+#include <string>
+#include <sstream>
+
+namespace aos {
+namespace ipc_lib {
+
+::std::string QueueIndex::DebugString() const {
+  if (valid()) {
+    ::std::stringstream s;
+    s << "QueueIndex(" << index_ << "/0x" << ::std::hex << index_ << ::std::dec
+      << ", count=" << count_ << ")";
+    return s.str();
+  } else {
+    return "QueueIndex::Invalid()";
+  }
+}
+
+::std::string Index::DebugString() const {
+  if (valid()) {
+    ::std::stringstream s;
+    s << "Index(queue_index=" << queue_index() << "/0x" << ::std::hex
+      << queue_index() << ::std::dec << ", message_index=" << message_index()
+      << ")";
+    return s.str();
+  } else {
+    return "QueueIndex::Invalid()";
+  }
+}
+
+}  // namespace ipc_lib
+}  // namespace aos