diff options
Diffstat (limited to 'util/queue.h')
-rw-r--r-- | util/queue.h | 54 |
1 files changed, 40 insertions, 14 deletions
diff --git a/util/queue.h b/util/queue.h index 35e02a8..6a1e33a 100644 --- a/util/queue.h +++ b/util/queue.h @@ -18,12 +18,13 @@ #pragma once #include "../pch.h" -#include "../util/goodies.h" #include <queue> +#include "../util/timer.h" + namespace mongo { - + /** * simple blocking queue */ @@ -31,42 +32,67 @@ namespace mongo { public: BlockingQueue() : _lock("BlockingQueue") { } - void push(T const& t){ + void push(T const& t) { scoped_lock l( _lock ); _queue.push( t ); _condition.notify_one(); } - + bool empty() const { scoped_lock l( _lock ); return _queue.empty(); } - - bool tryPop( T & t ){ + + bool tryPop( T & t ) { scoped_lock l( _lock ); if ( _queue.empty() ) return false; - + t = _queue.front(); _queue.pop(); - + return true; } - - T blockingPop(){ + + T blockingPop() { scoped_lock l( _lock ); while( _queue.empty() ) _condition.wait( l.boost() ); - + T t = _queue.front(); _queue.pop(); - return t; + return t; } - + + + /** + * blocks waiting for an object until maxSecondsToWait passes + * if got one, return true and set in t + * otherwise return false and t won't be changed + */ + bool blockingPop( T& t , int maxSecondsToWait ) { + + Timer timer; + + boost::xtime xt; + boost::xtime_get(&xt, boost::TIME_UTC); + xt.sec += maxSecondsToWait; + + scoped_lock l( _lock ); + while( _queue.empty() ) { + if ( ! _condition.timed_wait( l.boost() , xt ) ) + return false; + } + + t = _queue.front(); + _queue.pop(); + return true; + } + private: std::queue<T> _queue; - + mutable mongo::mutex _lock; boost::condition _condition; }; |