DUNE-DAQ
DUNE Trigger and Data Acquisition software
Toggle main menu visibility
Loading...
Searching...
No Matches
dunedaq
sourcecode
oks
src
pipeline.cpp
Go to the documentation of this file.
1
// DUNE DAQ modification notice:
2
// This file has been modified from the original ATLAS oks source for the DUNE DAQ project.
3
// Fork baseline commit: oks-08-03-04 (2022-04-14).
4
// Renamed since fork: no.
5
7
//
8
// copy from IPC
9
//
11
12
#include "
oks/pipeline.hpp
"
13
#include <boost/bind/bind.hpp>
14
15
namespace
dunedaq
{
16
namespace
oks
{
17
18
bool
19
OksPipeline::Worker::setJob
(
OksJob
* job )
20
{
21
boost::mutex::scoped_lock lock(
m_mutex
);
22
if
( !
m_running
&&
m_idle
)
23
{
24
m_job
= job;
25
m_idle
=
false
;
26
m_condition
.notify_one();
27
return
true
;
28
}
29
return
false
;
30
}
31
32
void
33
OksPipeline::Worker::run
( )
34
{
35
{
36
boost::mutex::scoped_lock lock(
m_mutex
);
37
m_pipeline
.m_barrier.wait();
38
}
39
while
(
true
)
40
{
41
{
42
boost::mutex::scoped_lock lock(
m_mutex
);
43
m_running
=
true
;
44
}
45
while
( !
m_idle
) {
46
m_job
->run();
47
delete
m_job
;
48
m_idle
= !
m_pipeline
.getJob(
m_job
);
49
}
50
{
51
boost::mutex::scoped_lock lock(
m_mutex
);
52
m_running
=
false
;
53
if
(
m_shutdown
)
54
break
;
55
if
(
m_stop
) {
56
m_pipeline
.m_barrier.wait();
57
m_stop
=
false
;
58
}
59
if
(
m_idle
)
60
m_condition
.wait( lock );
61
}
62
}
63
}
64
65
void
66
OksPipeline::Worker::shutdown
( )
67
{
68
boost::mutex::scoped_lock lock(
m_mutex
);
69
m_shutdown
=
true
;
70
m_condition
.notify_one( );
71
}
72
73
void
74
OksPipeline::Worker::stop
( )
75
{
76
boost::mutex::scoped_lock lock(
m_mutex
);
77
m_stop
=
true
;
78
m_condition
.notify_one( );
79
}
80
81
OksPipeline::OksPipeline
(
size_t
size
)
82
:
m_barrier
(
size
+ 1 )
83
{
84
for
(
size_t
i = 0; i <
size
; ++i )
85
{
86
m_workers
.push_back(
WorkerPtr
(
new
Worker
( *
this
) ) );
87
m_pool
.create_thread( boost::bind( &
Worker::run
,
m_workers
.back().get() ) );
88
}
89
m_barrier
.wait();
90
}
91
92
OksPipeline::~OksPipeline
()
93
{
94
waitForCompletion
();
95
for
(
size_t
i = 0; i <
m_workers
.size(); ++i )
96
{
97
m_workers
[i] -> shutdown();
98
}
99
m_pool
.join_all();
100
}
101
102
void
103
OksPipeline::addJob
(
OksJob
* job )
104
{
105
for
(
size_t
i = 0; i <
m_workers
.size(); ++i )
106
{
107
if
(
m_workers
[i] -> setJob( job ) )
108
{
109
return
;
110
}
111
}
112
boost::mutex::scoped_lock lock(
m_mutex
);
113
m_jobs
.push( job );
114
}
115
116
void
117
OksPipeline::waitForCompletion
()
118
{
119
{
120
boost::mutex::scoped_lock lock(
m_mutex
);
121
while
( !
m_jobs
.empty() )
122
{
123
m_condition
.wait( lock );
124
}
125
}
126
for
(
size_t
i = 0; i <
m_workers
.size(); ++i )
127
{
128
m_workers
[i] -> stop();
129
}
130
m_barrier
.wait();
131
}
132
133
bool
134
OksPipeline::getJob
(
OksJob
* & job )
135
{
136
boost::mutex::scoped_lock lock(
m_mutex
);
137
if
( !
m_jobs
.empty() )
138
{
139
job =
m_jobs
.front();
140
m_jobs
.pop();
141
m_condition
.notify_one( );
142
return
true
;
143
}
144
return
false
;
145
}
146
147
}
// namespace oks
148
}
// namespace dunedaq
dunedaq::oks::OksJob
Definition
pipeline.hpp:25
dunedaq::oks::OksPipeline::m_condition
boost::condition m_condition
Definition
pipeline.hpp:84
dunedaq::oks::OksPipeline::waitForCompletion
void waitForCompletion()
Definition
pipeline.cpp:117
dunedaq::oks::OksPipeline::Worker
friend struct Worker
Definition
pipeline.hpp:78
dunedaq::oks::OksPipeline::m_jobs
std::queue< OksJob * > m_jobs
Definition
pipeline.hpp:88
dunedaq::oks::OksPipeline::m_workers
std::vector< WorkerPtr > m_workers
Definition
pipeline.hpp:87
dunedaq::oks::OksPipeline::m_mutex
boost::mutex m_mutex
Definition
pipeline.hpp:83
dunedaq::oks::OksPipeline::getJob
bool getJob(OksJob *&job)
Definition
pipeline.cpp:134
dunedaq::oks::OksPipeline::WorkerPtr
std::shared_ptr< Worker > WorkerPtr
Definition
pipeline.hpp:75
dunedaq::oks::OksPipeline::m_pool
boost::thread_group m_pool
Definition
pipeline.hpp:86
dunedaq::oks::OksPipeline::~OksPipeline
~OksPipeline()
Definition
pipeline.cpp:92
dunedaq::oks::OksPipeline::addJob
void addJob(OksJob *job)
Definition
pipeline.cpp:103
dunedaq::oks::OksPipeline::OksPipeline
OksPipeline(size_t size)
Definition
pipeline.cpp:81
dunedaq::oks::OksPipeline::m_barrier
boost::barrier m_barrier
Definition
pipeline.hpp:85
dunedaq::oks
Definition
OksConfiguration.hpp:24
dunedaq
Including Qt Headers.
Definition
module.cpp:16
dunedaq::size
FELIX Initialization std::string initerror FELIX queue timed std::string queuename Unexpected chunk size
Definition
FelixIssues.hpp:28
pipeline.hpp
dunedaq::oks::OksPipeline::Worker::m_stop
bool m_stop
Definition
pipeline.hpp:70
dunedaq::oks::OksPipeline::Worker::shutdown
void shutdown()
Definition
pipeline.cpp:66
dunedaq::oks::OksPipeline::Worker::stop
void stop()
Definition
pipeline.cpp:74
dunedaq::oks::OksPipeline::Worker::m_running
bool m_running
Definition
pipeline.hpp:71
dunedaq::oks::OksPipeline::Worker::m_mutex
boost::mutex m_mutex
Definition
pipeline.hpp:66
dunedaq::oks::OksPipeline::Worker::setJob
bool setJob(OksJob *job)
Definition
pipeline.cpp:19
dunedaq::oks::OksPipeline::Worker::m_condition
boost::condition m_condition
Definition
pipeline.hpp:67
dunedaq::oks::OksPipeline::Worker::m_idle
bool m_idle
Definition
pipeline.hpp:68
dunedaq::oks::OksPipeline::Worker::m_pipeline
OksPipeline & m_pipeline
Definition
pipeline.hpp:65
dunedaq::oks::OksPipeline::Worker::m_job
OksJob * m_job
Definition
pipeline.hpp:72
dunedaq::oks::OksPipeline::Worker::m_shutdown
bool m_shutdown
Definition
pipeline.hpp:69
dunedaq::oks::OksPipeline::Worker::run
void run()
Definition
pipeline.cpp:33
Generated on
for DUNE-DAQ by
1.17.0