| The Gaudi Framework v32r1 (f65d50dc)

SerialTaskQueue.cpp
Go to the documentation of this file.
1 /*
2 * SerialTaskQueue.cpp
3 *
4 * @date 2012-10-21
5 * @author Marco Clemencic
6 */
7
8 #include "GaudiKernel/SerialTaskQueue.h"
9
10 namespace Gaudi {
11
12 SerialTaskQueue::SerialTaskQueue() : m_count( 0 ) {}
13
14 SerialTaskQueue::~SerialTaskQueue() { wait(); }
15
16 SerialTaskQueue::WorkItem::~WorkItem() {}
17
18 void SerialTaskQueue::add( WorkItem* item ) {
19 m_queue.push( new SerialWorkItem( item, this ) );
20 if ( ++m_count == 1 ) i_startNextItem();
21 }
22
23 void SerialTaskQueue::noteCompletion() {
24 if ( --m_count != 0 ) i_startNextItem();
25 }
26
27 void SerialTaskQueue::wait() const {
28 // wait until the queue is empty and all the tasks are completed
29 while ( ( !m_queue.empty() ) || m_count ) {}
30 }
31
32 void SerialTaskQueue::i_startNextItem() {
33 SerialWorkItem* item = 0;
34 m_queue.try_pop( item );
35 tbb::task::enqueue( *new ( tbb::task::allocate_root() ) SerialWorkItemRunner( item ) );
36 }
37
38 } /* namespace Gaudi */
Gaudi::SerialTaskQueue::WorkItem::~WorkItem
virtual ~WorkItem()
Definition: SerialTaskQueue.cpp:16
Gaudi::SerialTaskQueue::i_startNextItem
void i_startNextItem()
Definition: SerialTaskQueue.cpp:32
Gaudi::SerialTaskQueue::WorkItem
Base class for the task to be executed by the serial queue.
Definition: SerialTaskQueue.h:36
Gaudi::SerialTaskQueue::m_queue
tbb::concurrent_queue< SerialWorkItem * > m_queue
Queue of the tasks to be executed.
Definition: SerialTaskQueue.h:101
Gaudi::SerialTaskQueue::SerialWorkItem
Wrapper for the WorkItem class for internal concurrency bookkeeping.
Definition: SerialTaskQueue.h:63
Gaudi::SerialTaskQueue::SerialTaskQueue
SerialTaskQueue()
Default constructor.
Definition: SerialTaskQueue.cpp:12
Gaudi::SerialTaskQueue::wait
void wait() const
Block until all the currently enqueued tasks are completed.
Definition: SerialTaskQueue.cpp:27
Gaudi::SerialTaskQueue::~SerialTaskQueue
virtual ~SerialTaskQueue()
Block until all the enqueued tasks are completed.
Definition: SerialTaskQueue.cpp:14
Gaudi::SerialTaskQueue::add
void add(WorkItem *item)
Enqueue a WorkItem for execution.
Definition: SerialTaskQueue.cpp:18
Gaudi::SerialTaskQueue::SerialWorkItemRunner
Helper class to wrap a SerialWorkItem in a tbb::task.
Definition: SerialTaskQueue.h:80
Gaudi::SerialTaskQueue::noteCompletion
void noteCompletion()
Method used by the tasks to trigger the execution of the next task in the queue.
Definition: SerialTaskQueue.cpp:23
Gaudi
Header file for std:chrono::duration-based Counters.
Definition: __init__.py:1
SerialTaskQueue.h
Gaudi::SerialTaskQueue::m_count
std::atomic< int > m_count
Counter of the currently running tasks.
Definition: SerialTaskQueue.h:99