X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fthreads%2FSGQueue.hxx;h=80877375e96fa391c57c449e54aa1d670d73ad4e;hb=eb06a90109f9a69a7cf0d2af87714b8147acc024;hp=83a1cfebecdf2352117984b8af7bda77eb5280df;hpb=765763202489b4981a98d6964945057fd1279774;p=simgear.git diff --git a/simgear/threads/SGQueue.hxx b/simgear/threads/SGQueue.hxx index 83a1cfeb..80877375 100644 --- a/simgear/threads/SGQueue.hxx +++ b/simgear/threads/SGQueue.hxx @@ -3,15 +3,11 @@ #include -#if defined ( SG_HAVE_STD_INCLUDES ) -# include -#else -# include -#endif - +#include #include -#include "SGThread.hxx" -#include "SGGuard.hxx" +#include +#include +#include /** * SGQueue defines an interface for a FIFO. @@ -61,6 +57,13 @@ public: */ virtual T pop() = 0; + /** + * Query the size of the queue + * + * @return size_t size of queue. + */ + virtual size_t size() = 0; + protected: /** * @@ -71,7 +74,7 @@ protected: /** * A simple thread safe queue. All access functions are guarded with a mutex. */ -template +template class SGLockedQueue : public SGQueue { public: @@ -92,7 +95,7 @@ public: * @return bool True if queue is empty, otherwisr false. */ virtual bool empty() { - SGGuard g(mutex); + OpenThreads::ScopedLock g(mutex); return this->fifo.empty(); } @@ -102,7 +105,7 @@ public: * @param T object to add. */ virtual void push( const T& item ) { - SGGuard g(mutex); + OpenThreads::ScopedLock g(mutex); this->fifo.push( item ); } @@ -112,7 +115,7 @@ public: * @return T next available object. */ virtual T front() { - SGGuard g(mutex); + OpenThreads::ScopedLock g(mutex); assert( ! this->fifo.empty() ); T item = this->fifo.front(); return item; @@ -124,7 +127,7 @@ public: * @return T next available object. */ virtual T pop() { - SGGuard g(mutex); + OpenThreads::ScopedLock g(mutex); //if (fifo.empty()) throw NoSuchElementException(); assert( ! this->fifo.empty() ); // if (fifo.empty()) @@ -136,6 +139,17 @@ public: this->fifo.pop(); return item; } + + /** + * Query the size of the queue + * + * @return size_t size of queue. + */ + virtual size_t size() { + OpenThreads::ScopedLock g(mutex); + return this->fifo.size(); + } + private: /** @@ -165,13 +179,13 @@ public: /** * Destroy this queue. */ - ~SGBlockingQueue() { mutex.unlock(); } + ~SGBlockingQueue() {} /** * */ virtual bool empty() { - SGGuard g(mutex); + OpenThreads::ScopedLock g(mutex); return this->fifo.empty(); } @@ -181,7 +195,7 @@ public: * @param T object to add. */ virtual void push( const T& item ) { - SGGuard g(mutex); + OpenThreads::ScopedLock g(mutex); this->fifo.push( item ); not_empty.signal(); } @@ -193,7 +207,7 @@ public: * @return T next available object. */ virtual T front() { - SGGuard g(mutex); + OpenThreads::ScopedLock g(mutex); assert(this->fifo.empty() != true); //if (fifo.empty()) throw ?? @@ -209,10 +223,10 @@ public: * @return T next available object. */ virtual T pop() { - SGGuard g(mutex); + OpenThreads::ScopedLock g(mutex); while (this->fifo.empty()) - not_empty.wait(mutex); + not_empty.wait(&mutex); assert(this->fifo.empty() != true); //if (fifo.empty()) throw ?? @@ -222,17 +236,27 @@ public: return item; } + /** + * Query the size of the queue + * + * @return size_t size of queue. + */ + virtual size_t size() { + OpenThreads::ScopedLock g(mutex); + return this->fifo.size(); + } + private: /** * Mutex to serialise access. */ - SGMutex mutex; + OpenThreads::Mutex mutex; /** * Condition to signal when queue not empty. */ - SGPthreadCond not_empty; + OpenThreads::Condition not_empty; private: // Prevent copying.