summaryrefslogtreecommitdiff
path: root/util/queue.h
diff options
context:
space:
mode:
Diffstat (limited to 'util/queue.h')
-rw-r--r--util/queue.h54
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;
};