From: Samuel Just Date: Sat, 14 Sep 2013 02:49:17 +0000 (-0700) Subject: WorkQueue: add a workqueue which simply runs queued GenContexts X-Git-Tag: v0.71~68^2~36 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5f44a949efdfa2367cb3f591b1838ba41c72dbe2;p=ceph.git WorkQueue: add a workqueue which simply runs queued GenContexts Signed-off-by: Samuel Just --- diff --git a/src/common/WorkQueue.h b/src/common/WorkQueue.h index b2742accdce0..794b577a71da 100644 --- a/src/common/WorkQueue.h +++ b/src/common/WorkQueue.h @@ -390,6 +390,43 @@ public: void drain(WorkQueue_* wq = 0); }; +class GenContextWQ : + public ThreadPool::WorkQueueVal*> { + list*> _queue; +public: + GenContextWQ(const string &name, time_t ti, ThreadPool *tp) + : ThreadPool::WorkQueueVal< + GenContext*>(name, ti, ti*10, tp) {} + + void _enqueue(GenContext *c) { + _queue.push_back(c); + }; + void _enqueue_front(GenContext *c) { + _queue.push_front(c); + } + bool _empty() { + return _queue.empty(); + } + GenContext *_dequeue() { + assert(!_queue.empty()); + GenContext *c = _queue.front(); + _queue.pop_front(); + return c; + } + void _process(GenContext *c, ThreadPool::TPHandle &tp) { + c->complete(tp); + } +}; +class C_QueueInWQ : public Context { + GenContextWQ *wq; + GenContext *c; +public: + C_QueueInWQ(GenContextWQ *wq, GenContext *c) + : wq(wq), c(c) {} + void finish(int) { + wq->queue(c); + } +}; #endif