artdaq  v3_01_00
RequestReceiver.hh
1 #ifndef ARTDAQ_DAQRATE_REQUEST_RECEVIER_HH
2 #define ARTDAQ_DAQRATE_REQUEST_RECEVIER_HH
3 
4 #include <boost/thread.hpp>
5 #include "artdaq-core/Data/Fragment.hh"
6 #include "fhiclcpp/fwd.h"
7 
8 #include <mutex>
9 #include <condition_variable>
10 
11 namespace artdaq
12 {
14  {
15  public:
17  RequestReceiver(const fhicl::ParameterSet& ps);
18  virtual ~RequestReceiver();
19 
23  void setupRequestListener();
24 
29 
34 
38  void receiveRequestsLoop();
39 
40  std::map<artdaq::Fragment::sequence_id_t, artdaq::Fragment::timestamp_t> GetRequests() const
41  {
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;
46  }
47  return out;
48  }
49 
50  void RemoveRequest(artdaq::Fragment::sequence_id_t reqID);
51 
52  bool isRunning() { return running_; }
53 
54  void ClearRequests() {
55  std::unique_lock<std::mutex> lk(request_mutex_);
56  requests_.clear();
57  }
58 
59  size_t size() { return requests_.size(); }
60 
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; });
64  }
65  private:
66  // FHiCL-configurable variables. Note that the C++ variable names
67  // are the FHiCL variable names with a "_" appended
68  int request_port_;
69  std::string request_addr_;
70  bool running_;
71 
72  //Socket parameters
73  int request_socket_;
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_;
85 
86  std::atomic<artdaq::Fragment::sequence_id_t> highest_seen_request_;
87  };
88 }
89 
90 
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)