diff options
author | Stefan Radomski <github@mintwerk.de> | 2016-06-18 11:55:39 (GMT) |
---|---|---|
committer | Stefan Radomski <github@mintwerk.de> | 2016-06-18 11:55:39 (GMT) |
commit | 0e0be07906a720ae54e4572d6ac0cb657424550d (patch) | |
tree | 7d48c87a9142a5dad06570ca4daf0212475d83f1 /src/uscxml/util/BlockingQueue.h | |
parent | 84bbbd42c3480c40c0355c64899f99f8d588d5c0 (diff) | |
download | uscxml-0e0be07906a720ae54e4572d6ac0cb657424550d.zip uscxml-0e0be07906a720ae54e4572d6ac0cb657424550d.tar.gz uscxml-0e0be07906a720ae54e4572d6ac0cb657424550d.tar.bz2 |
Started to port Debugger and issue 87
Diffstat (limited to 'src/uscxml/util/BlockingQueue.h')
-rw-r--r-- | src/uscxml/util/BlockingQueue.h | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/uscxml/util/BlockingQueue.h b/src/uscxml/util/BlockingQueue.h new file mode 100644 index 0000000..2f0ab2e --- /dev/null +++ b/src/uscxml/util/BlockingQueue.h @@ -0,0 +1,77 @@ +/** + * @file + * @author 2012-2013 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de) + * @copyright Simplified BSD + * + * @cond + * This program is free software: you can redistribute it and/or modify + * it under the terms of the FreeBSD license as published by the FreeBSD + * project. + * + * This program 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. + * + * You should have received a copy of the FreeBSD license along with this + * program. If not, see <http://www.opensource.org/licenses/bsd-license>. + * @endcond + */ + +#ifndef BLOCKINGQUEUE_H_4LEVMY0N +#define BLOCKINGQUEUE_H_4LEVMY0N + +#include "uscxml/Common.h" +#include <list> +#include <condition_variable> + +namespace uscxml { + +template <class T> +class BlockingQueue { +public: + BlockingQueue() {} + virtual ~BlockingQueue() { + } + + virtual void push(const T& elem) { + std::lock_guard<std::mutex> lock(_mutex); + _queue.push_back(elem); + _cond.notify_all(); + } + + virtual void push_front(const T& elem) { + std::lock_guard<std::mutex> lock(_mutex); + _queue.push_front(elem); + _cond.notify_all(); + } + + virtual T pop() { + std::lock_guard<std::mutex> lock(_mutex); +// std::cout << "Popping from " << this << std::endl; + while (_queue.empty()) { + _cond.wait(_mutex); + } + T ret = _queue.front(); + _queue.pop_front(); + return ret; + } + + virtual void clear() { + std::lock_guard<std::mutex> lock(_mutex); + _queue.clear(); + } + + virtual bool isEmpty() { + std::lock_guard<std::mutex> lock(_mutex); + return _queue.empty(); + } + +protected: + std::mutex _mutex; + std::condition_variable_any _cond; + std::list<T> _queue; +}; + +} + +#endif /* end of include guard: BLOCKINGQUEUE_H_4LEVMY0N */ |