summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-09-13 19:49:17 -0700
committerSamuel Just <sam.just@inktank.com>2013-09-23 22:54:56 -0700
commit0e53c5e52e03fff348b39cce632fe9fd80855ec1 (patch)
tree8a679822f98d0366c4db2f582fe0134647a4e0cc
parenta685e53c467ab4dc34c21f9c66c1646b6032df50 (diff)
downloadceph-0e53c5e52e03fff348b39cce632fe9fd80855ec1.tar.gz
WorkQueue: add a workqueue which simply runs queued GenContexts
Signed-off-by: Samuel Just <sam.just@inktank.com>
-rw-r--r--src/common/WorkQueue.h43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/common/WorkQueue.h b/src/common/WorkQueue.h
index b2742accdce..e589b3c1463 100644
--- a/src/common/WorkQueue.h
+++ b/src/common/WorkQueue.h
@@ -390,6 +390,49 @@ public:
void drain(WorkQueue_* wq = 0);
};
+class GenContextWQ :
+ public ThreadPool::WorkQueueVal<GenContext<ThreadPool::TPHandle&>*> {
+ Mutex qlock;
+ list<GenContext<ThreadPool::TPHandle&>*> _queue;
+public:
+ GenContextWQ(const string &name, time_t ti, ThreadPool *tp)
+ : ThreadPool::WorkQueueVal<
+ GenContext<ThreadPool::TPHandle&>*>(name, ti, ti*10, tp),
+ qlock(name.c_str()) {}
+
+ void _enqueue(GenContext<ThreadPool::TPHandle&> *c) {
+ Mutex::Locker l(qlock);
+ _queue.push_back(c);
+ };
+ void _enqueue_front(GenContext<ThreadPool::TPHandle&> *c) {
+ Mutex::Locker l(qlock);
+ _queue.push_front(c);
+ }
+ bool _empty() {
+ Mutex::Locker l(qlock);
+ return _queue.empty();
+ }
+ GenContext<ThreadPool::TPHandle&> *_dequeue() {
+ Mutex::Locker l(qlock);
+ assert(!_queue.empty());
+ GenContext<ThreadPool::TPHandle&> *c = _queue.front();
+ _queue.pop_front();
+ return c;
+ }
+ void _process(GenContext<ThreadPool::TPHandle&> *c, ThreadPool::TPHandle &tp) {
+ c->complete(tp);
+ }
+};
+class QueueInWQ : public Context {
+ GenContextWQ *wq;
+ GenContext<ThreadPool::TPHandle&> *c;
+public:
+ QueueInWQ(GenContextWQ *wq, GenContext<ThreadPool::TPHandle &> *c)
+ : wq(wq), c(c) {}
+ void finish(int) {
+ wq->queue(c);
+ }
+};
#endif