From 69bbae0072638a88b3d2d722167fba24713e165f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Wed, 22 Jul 2015 17:03:22 +0200 Subject: [PATCH] concurrent_queue --- libdevcore/concurrent_queue.h | 60 +++++++++++++++++++++++++++++++++++ libevm/SmartVM.cpp | 34 +------------------- 2 files changed, 61 insertions(+), 33 deletions(-) create mode 100644 libdevcore/concurrent_queue.h diff --git a/libdevcore/concurrent_queue.h b/libdevcore/concurrent_queue.h new file mode 100644 index 000000000..2e88fc576 --- /dev/null +++ b/libdevcore/concurrent_queue.h @@ -0,0 +1,60 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + cpp-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with cpp-ethereum. If not, see . +*/ +#pragma once +#include +#include +#include +#include + + +namespace dev +{ + +/// Concurrent queue. +/// You can push and pop elements to/from the queue. Pop will block until the queue is not empty. +/// The default backend (_QueueT) is std::queue. It can be changed to any type that has +/// proper push(), pop(), empty() and front() methods. +template> +class concurrent_queue +{ +public: + template + void push(_U&& _elem) + { + { + std::lock_guard guard{x_mutex}; + m_queue.push(std::forward<_U>(_elem)); + } + m_cv.notify_one(); + } + + _T pop() + { + std::unique_lock lock{x_mutex}; + m_cv.wait(lock, [this]{ return !m_queue.empty(); }); + auto item = std::move(m_queue.front()); + m_queue.pop(); + return item; + } + +private: + _QueueT m_queue; + std::mutex x_mutex; + std::condition_variable m_cv; +}; + +} diff --git a/libevm/SmartVM.cpp b/libevm/SmartVM.cpp index 2246e0455..5d814eff0 100644 --- a/libevm/SmartVM.cpp +++ b/libevm/SmartVM.cpp @@ -21,9 +21,7 @@ #include "SmartVM.h" #include #include -#include -#include -#include +#include #include #include #include @@ -33,36 +31,6 @@ namespace dev { - -template> -class concurrent_queue -{ -public: - template - void push(_U&& _elem) - { - { - std::lock_guard guard{x_mutex}; - m_queue.push(std::forward<_U>(_elem)); - } - m_cv.notify_one(); - } - - _T pop() - { - std::unique_lock lock{x_mutex}; - m_cv.wait(lock, [this]{ return !m_queue.empty(); }); - auto item = std::move(m_queue.front()); - m_queue.pop(); - return item; - } - -private: - _QueueT m_queue; - std::mutex x_mutex; - std::condition_variable m_cv; -}; - namespace eth { namespace