artdaq  v3_12_02
RequestBuffer.hh
1 #ifndef _artdaq_DAQrate_RequestBuffer_hh_
2 #define _artdaq_DAQrate_RequestBuffer_hh_
3 
4 #include "TRACE/tracemf.h" // Pre-empt TRACE/trace.h from Fragment.hh.
5 #include "artdaq-core/Data/Fragment.hh"
6 
7 #include <condition_variable>
8 #include <map>
9 #include <set>
10 
11 namespace artdaq {
16 {
17 public:
22  explicit RequestBuffer(Fragment::sequence_id_t request_increment = 1);
23 
27  virtual ~RequestBuffer();
28 
34  void push(artdaq::Fragment::sequence_id_t seq, artdaq::Fragment::timestamp_t ts);
35 
39  void reset();
40 
45  std::map<artdaq::Fragment::sequence_id_t, artdaq::Fragment::timestamp_t> GetRequests() const;
46 
53  std::pair<artdaq::Fragment::sequence_id_t, artdaq::Fragment::timestamp_t> GetNextRequest();
54 
59  void RemoveRequest(artdaq::Fragment::sequence_id_t reqID);
60 
64  void ClearRequests();
69  std::map<artdaq::Fragment::sequence_id_t, artdaq::Fragment::timestamp_t> GetAndClearRequests();
70 
75  size_t size();
81  bool WaitForRequests(int timeout_ms);
82 
88  std::chrono::steady_clock::time_point GetRequestTime(artdaq::Fragment::sequence_id_t reqID);
89 
94  bool isRunning() const { return receiver_running_; }
99  void setRunning(bool running) { receiver_running_ = running; }
100 
101 private:
102  std::map<artdaq::Fragment::sequence_id_t, artdaq::Fragment::timestamp_t> requests_;
103  std::map<artdaq::Fragment::sequence_id_t, std::chrono::steady_clock::time_point> request_timing_;
104  std::atomic<artdaq::Fragment::sequence_id_t> highest_seen_request_;
105  std::atomic<artdaq::Fragment::sequence_id_t> last_next_request_; // The last request returned by GetNextRequest
106  std::set<artdaq::Fragment::sequence_id_t> out_of_order_requests_;
107  artdaq::Fragment::sequence_id_t request_increment_;
108  mutable std::mutex request_mutex_;
109  std::condition_variable request_cv_;
110 
111  std::atomic<bool> receiver_running_;
112 };
113 } // namespace artdaq
114 
115 #endif // _artdaq_DAQrate_RequestBuffer_hh_
void setRunning(bool running)
Set whether the RequestBuffer is active.
void push(artdaq::Fragment::sequence_id_t seq, artdaq::Fragment::timestamp_t ts)
Add a Request to the buffer.
virtual ~RequestBuffer()
RequestBuffer Destructor.
void ClearRequests()
Clear all requests from the map
std::map< artdaq::Fragment::sequence_id_t, artdaq::Fragment::timestamp_t > GetAndClearRequests()
Get the current requests, then clear the map
void reset()
Reset RequestBuffer, discarding all requests and tracking information.
bool isRunning() const
Determine whether the RequestBuffer is active.
std::pair< artdaq::Fragment::sequence_id_t, artdaq::Fragment::timestamp_t > GetNextRequest()
Get the &quot;next&quot; request, i.e. the first unsatisfied request that has not already been returned by GetN...
std::map< artdaq::Fragment::sequence_id_t, artdaq::Fragment::timestamp_t > GetRequests() const
Get the current requests
Holds requests from RequestReceiver while they are being processed.
std::chrono::steady_clock::time_point GetRequestTime(artdaq::Fragment::sequence_id_t reqID)
Get the time a given request was received
bool WaitForRequests(int timeout_ms)
Wait for a new request message, up to the timeout given
RequestBuffer(Fragment::sequence_id_t request_increment=1)
RequestBuffer Constructor.
Definition: RequestBuffer.cc:6
void RemoveRequest(artdaq::Fragment::sequence_id_t reqID)
Remove the request with the given sequence ID from the request map
size_t size()
Get the number of requests currently stored in the RequestReceiver