1 #ifndef ARTDAQ_DAQRATE_REQUEST_RECEVIER_HH
2 #define ARTDAQ_DAQRATE_REQUEST_RECEVIER_HH
4 #include <boost/thread.hpp>
5 #include "artdaq-core/Data/Fragment.hh"
6 #include "fhiclcpp/fwd.h"
9 #include <condition_variable>
40 std::map<artdaq::Fragment::sequence_id_t, artdaq::Fragment::timestamp_t> GetRequests()
const
42 std::unique_lock<std::mutex> lk(request_mutex_);
43 std::map<artdaq::Fragment::sequence_id_t, Fragment::timestamp_t> out;
44 for (
auto& in : requests_) {
45 out[in.first] = in.second;
50 void RemoveRequest(artdaq::Fragment::sequence_id_t reqID);
52 bool isRunning() {
return running_; }
54 void ClearRequests() {
55 std::unique_lock<std::mutex> lk(request_mutex_);
59 size_t size() {
return requests_.size(); }
61 bool WaitForRequests(
int timeout_ms) {
62 std::unique_lock<std::mutex> lk(request_mutex_);
63 return request_cv_.wait_for(lk, std::chrono::milliseconds(timeout_ms), [
this]() {
return requests_.size() > 0; });
69 std::string request_addr_;
74 std::map<artdaq::Fragment::sequence_id_t, artdaq::Fragment::timestamp_t> requests_;
75 std::map<artdaq::Fragment::sequence_id_t, std::chrono::steady_clock::time_point> request_timing_;
76 std::atomic<bool> request_stop_requested_;
77 std::chrono::steady_clock::time_point request_stop_timeout_;
78 std::atomic<bool> request_received_;
79 size_t end_of_run_timeout_ms_;
80 std::atomic<bool> should_stop_;
81 mutable std::mutex request_mutex_;
82 mutable std::mutex state_mutex_;
83 std::condition_variable request_cv_;
84 boost::thread requestThread_;
86 std::atomic<artdaq::Fragment::sequence_id_t> highest_seen_request_;
91 #endif //ARTDAQ_DAQRATE_REQUEST_RECEVIER_HH
void startRequestReceiverThread()
Function that launches the data request receiver thread (receiveRequestsLoop())
void setupRequestListener()
Opens the socket used to listen for data requests.
void receiveRequestsLoop()
This function receives data request packets, adding new requests to the request list.
void stopRequestReceiverThread()
Stop the data request receiver thread (receiveRequestsLoop)