Initial commit of a simple OpenOLT simulator

make openoltsim
./build/openoltsim

Openoltsim is meant to simulate an OLT running the OpenOLT driver.
Currently, it only sends the the "olt up" indication allowing
voltha pre-provision/enable commands to connect to openoltsim.

Change-Id: I95910657d269e37f4e4943d2b91f2780ecd8fd08
diff --git a/openoltsim/Queue.h b/openoltsim/Queue.h
new file mode 100644
index 0000000..854851e
--- /dev/null
+++ b/openoltsim/Queue.h
@@ -0,0 +1,60 @@
+//
+// Copyright (c) 2013 Juan Palacios juan.palacios.puyana@gmail.com
+// Subject to the BSD 2-Clause License
+// - see < http://opensource.org/licenses/BSD-2-Clause>
+//
+
+#ifndef CONCURRENT_QUEUE_
+#define CONCURRENT_QUEUE_
+
+#include <queue>
+#include <thread>
+#include <mutex>
+#include <condition_variable>
+
+template <typename T>
+class Queue
+{
+ public:
+
+  T pop() 
+  {
+    std::unique_lock<std::mutex> mlock(mutex_);
+    while (queue_.empty())
+    {
+      cond_.wait(mlock);
+    }
+    auto val = queue_.front();
+    queue_.pop();
+    return val;
+  }
+
+  void pop(T& item)
+  {
+    std::unique_lock<std::mutex> mlock(mutex_);
+    while (queue_.empty())
+    {
+      cond_.wait(mlock);
+    }
+    item = queue_.front();
+    queue_.pop();
+  }
+
+  void push(const T& item)
+  {
+    std::unique_lock<std::mutex> mlock(mutex_);
+    queue_.push(item);
+    mlock.unlock();
+    cond_.notify_one();
+  }
+  Queue()=default;
+  Queue(const Queue&) = delete;            // disable copying
+  Queue& operator=(const Queue&) = delete; // disable assignment
+  
+ private:
+  std::queue<T> queue_;
+  std::mutex mutex_;
+  std::condition_variable cond_;
+};
+
+#endif