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