summaryrefslogtreecommitdiff
path: root/src/util/channel.h
diff options
context:
space:
mode:
authorMorgan Deters <mdeters@gmail.com>2012-02-20 17:59:33 +0000
committerMorgan Deters <mdeters@gmail.com>2012-02-20 17:59:33 +0000
commit3d2b33d66998261f9369cccc098140f64bc8b417 (patch)
tree9176ad2684415f8fb95f75a5655e8b17dcdf9793 /src/util/channel.h
parent92155f5e40ed2cf452dc5e2f618e7be6542293e8 (diff)
portfolio merge
Diffstat (limited to 'src/util/channel.h')
-rw-r--r--src/util/channel.h96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/util/channel.h b/src/util/channel.h
new file mode 100644
index 000000000..1701feba9
--- /dev/null
+++ b/src/util/channel.h
@@ -0,0 +1,96 @@
+
+#ifndef __CVC4__CHANNEL_H
+#define __CVC4__CHANNEL_H
+
+#include <boost/circular_buffer.hpp>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/condition.hpp>
+#include <boost/thread/thread.hpp>
+#include <boost/call_traits.hpp>
+#include <boost/progress.hpp>
+#include <boost/bind.hpp>
+
+
+namespace CVC4 {
+
+template <typename T>
+class SharedChannel {
+private:
+ int d_maxsize; // just call it size?
+public:
+ SharedChannel() {}
+ SharedChannel(int maxsize) : d_maxsize(maxsize) {}
+
+ /* Tries to add element and returns true if successful */
+ virtual bool push(const T&) = 0;
+
+ /* Removes an element from the channel */
+ virtual T pop() = 0;
+
+ /* */
+ virtual bool empty() = 0;
+
+ /* */
+ virtual bool full() = 0;
+};
+
+/*
+This code is from
+
+http://live.boost.org/doc/libs/1_46_1/libs/circular_buffer/doc/circular_buffer.html#boundedbuffer
+*/
+template <typename T>
+class SynchronizedSharedChannel: public SharedChannel<T> {
+public:
+ typedef boost::circular_buffer<T> container_type;
+ typedef typename container_type::size_type size_type;
+ typedef typename container_type::value_type value_type;
+ typedef typename boost::call_traits<value_type>::param_type param_type;
+
+ explicit SynchronizedSharedChannel(size_type capacity) : m_unread(0), m_container(capacity) {}
+
+ bool push(param_type item){
+ // param_type represents the "best" way to pass a parameter of type value_type to a method
+
+ boost::mutex::scoped_lock lock(m_mutex);
+ m_not_full.wait(lock, boost::bind(&SynchronizedSharedChannel<value_type>::is_not_full, this));
+ m_container.push_front(item);
+ ++m_unread;
+ lock.unlock();
+ m_not_empty.notify_one();
+ return true;
+ }//function definitions need to be moved to cpp
+
+ value_type pop(){
+ value_type ret;
+ boost::mutex::scoped_lock lock(m_mutex);
+ m_not_empty.wait(lock, boost::bind(&SynchronizedSharedChannel<value_type>::is_not_empty, this));
+ ret = m_container[--m_unread];
+ lock.unlock();
+ m_not_full.notify_one();
+ return ret;
+ }
+
+
+ bool empty() { return not is_not_empty(); }
+ bool full() { return not is_not_full(); }
+
+private:
+ SynchronizedSharedChannel(const SynchronizedSharedChannel&); // Disabled copy constructor
+ SynchronizedSharedChannel& operator = (const SynchronizedSharedChannel&); // Disabled assign operator
+
+ bool is_not_empty() const { return m_unread > 0; }
+ bool is_not_full() const { return m_unread < m_container.capacity(); }
+
+ size_type m_unread;
+ container_type m_container;
+ boost::mutex m_mutex;
+ boost::condition m_not_empty;
+ boost::condition m_not_full;
+};
+
+}
+
+#endif /* __CVC4__CHANNEL_H */
+
+
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback