From e3da235a829e066a349afa256e40a5c05daec7bc Mon Sep 17 00:00:00 2001 From: Vasilis Liaskovitis Date: Wed, 30 Apr 2014 01:41:38 +0200 Subject: [PATCH] add AsyncQueue (needed for VIdeoImpl) taken from gst-plugins-gl/tests/examples/qt/qglwtextureshare --- AsyncQueue.h | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 AsyncQueue.h diff --git a/AsyncQueue.h b/AsyncQueue.h new file mode 100644 index 0000000..7c6e1af --- /dev/null +++ b/AsyncQueue.h @@ -0,0 +1,77 @@ +/* + * GStreamer + * Copyright (C) 2009 Andrey Nechypurenko + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __ASYNCQUEUE_H +#define __ASYNCQUEUE_H + +#include +#include +#include + +/** + * This is the thread safe implementation of the Queue. It can be + * used in classical producers/consumers multithreaded scenario. The + * template parameter is the class which can be put/get to/from the + * queue. + */ +template +class AsyncQueue +{ +public: + AsyncQueue() : waitingReaders(0) {} + + int size() + { + QMutexLocker locker(&mutex); + return this->buffer.size(); + } + + void put(const T& item) + { + QMutexLocker locker(&mutex); + this->buffer.push_back(item); + if(this->waitingReaders) + this->bufferIsNotEmpty.wakeOne(); + } + + T get() + { + QMutexLocker locker(&mutex); + while(this->buffer.size() == 0) + { + ++(this->waitingReaders); + this->bufferIsNotEmpty.wait(&mutex); + --(this->waitingReaders); + } + T item = this->buffer.front(); + this->buffer.pop_front(); + return item; + } + +private: + typedef QList Container; + QMutex mutex; + QWaitCondition bufferIsNotEmpty; + Container buffer; + short waitingReaders; +}; + + +#endif // __ASYNCQUEUE_H