GRSISort "v4.0.0.5"
An extension of the ROOT analysis Framework
Loading...
Searching...
No Matches
TTerminalLoop.h
Go to the documentation of this file.
1#ifndef TTERMINALLOOP_H
2#define TTERMINALLOOP_H
3
4/** \addtogroup Loops
5 * @{
6 */
7
8////////////////////////////////////////////////////////////////////////////////
9///
10/// \class TTerminalLoop
11///
12/// Template for loops to terminate queues.
13///
14////////////////////////////////////////////////////////////////////////////////
15
16#include "StoppableThread.h"
17#include "ThreadsafeQueue.h"
18
19template <typename T>
21public:
22 static TTerminalLoop* Get(std::string name = "")
23 {
24 if(name.length() == 0) {
25 name = "terminal_loop";
26 }
27
29 if(thread == nullptr) {
30 thread = new TTerminalLoop(name);
31 }
32
33 return dynamic_cast<TTerminalLoop*>(thread);
34 }
35
36 TTerminalLoop(const TTerminalLoop&) = delete;
37 TTerminalLoop(TTerminalLoop&&) noexcept = delete;
38 TTerminalLoop& operator=(const TTerminalLoop&) = delete;
39 TTerminalLoop& operator=(TTerminalLoop&&) noexcept = delete;
40 ~TTerminalLoop() = default;
41
42#ifndef __CINT__
43 std::shared_ptr<ThreadsafeQueue<std::shared_ptr<T>>>& InputQueue()
44 {
45 return fInputQueue;
46 }
47
48 void ClearQueue() override
49 {
50 while(fInputQueue->Size()) {
51 std::shared_ptr<T> event;
52 fInputQueue->Pop(event);
53 }
54 }
55#endif
56
57 size_t GetItemsPopped() override
58 {
59 return 0;
60 }
61 size_t GetItemsPushed() override { return 0; }
62 size_t GetItemsCurrent() override { return 0; }
63 size_t GetRate() override { return 0; }
64
65protected:
66#ifndef __CINT__
67 bool Iteration() override
68 {
69 std::shared_ptr<T> event;
70 fInputQueue->Pop(event);
71
72 if(event) {
73 return true;
74 }
75 if(fInputQueue->IsFinished()) {
76 return false;
77 }
78 std::this_thread::sleep_for(std::chrono::milliseconds(1000));
79 return true;
80 }
81#endif
82
83private:
84 explicit TTerminalLoop(std::string name)
85 : StoppableThread(std::move(name)), fInputQueue(std::make_shared<ThreadsafeQueue<std::shared_ptr<T>>>())
86 {
87 }
88
89#ifndef __CINT__
90 std::shared_ptr<ThreadsafeQueue<std::shared_ptr<T>>> fInputQueue;
91#endif
92};
93
94/*! @} */
95#endif /* _TTERMINALLOOP_H_ */
static StoppableThread * Get(const std::string &name)
void ClearQueue() override
static TTerminalLoop * Get(std::string name="")
size_t GetItemsPushed() override
std::shared_ptr< ThreadsafeQueue< std::shared_ptr< T > > > & InputQueue()
size_t GetItemsPopped() override
size_t GetRate() override
TTerminalLoop(const TTerminalLoop &)=delete
TTerminalLoop(TTerminalLoop &&) noexcept=delete
bool Iteration() override
size_t GetItemsCurrent() override
TTerminalLoop(std::string name)
std::shared_ptr< ThreadsafeQueue< std::shared_ptr< T > > > fInputQueue