artdaq  v3_00_03
RequestSender.hh
1 #ifndef artdaq_DAQrate_RequestSender_hh
2 #define artdaq_DAQrate_RequestSender_hh
3 
4 #include "artdaq/DAQdata/Globals.hh" // Before trace.h gets included in ConcurrentQueue (from GlobalQueue)
5 #include "artdaq-core/Data/RawEvent.hh"
6 #include "artdaq-utilities/Plugins/MetricManager.hh"
7 #include "artdaq/DAQrate/detail/RequestMessage.hh"
8 #include "fhiclcpp/ParameterSet.h"
9 
10 #include <map>
11 #include <memory>
12 #include <chrono>
13 #include <future>
14 #include <stdint.h>
15 #include <arpa/inet.h>
16 #include <netinet/in.h>
17 #include <sys/types.h>
18 #include <sys/socket.h>
19 
20 namespace artdaq
21 {
22 
27  {
28  public:
32  RequestSender() = delete;
33 
37  RequestSender(RequestSender const&) = delete;
38 
43  RequestSender& operator=(RequestSender const&) = delete;
44 
63  RequestSender(const fhicl::ParameterSet& pset);
67  virtual ~RequestSender();
68 
69 
75 
80  detail::RequestMessageMode GetRequestMode() const { return request_mode_; }
81 
86  void SendRequest(bool endOfRunOnly = false);
87 
93  void AddRequest(Fragment::sequence_id_t seqID, Fragment::timestamp_t timestamp);
94 
99  void RemoveRequest(Fragment::sequence_id_t seqID);
100 
105  void SendRoutingToken(int nSlots);
106  private:
107 
108  // Request stuff
109  bool send_requests_;
110  mutable std::mutex request_mutex_;
111  mutable std::mutex request_send_mutex_;
112  std::map<Fragment::sequence_id_t, Fragment::timestamp_t> active_requests_;
113  int request_port_;
114  size_t request_delay_;
115  size_t request_shutdown_timeout_us_;
116  int request_socket_;
117  struct sockaddr_in request_addr_;
118  std::string multicast_out_addr_;
119  detail::RequestMessageMode request_mode_;
120 
121  bool send_routing_tokens_;
122  int token_port_;
123  int token_socket_;
124  struct sockaddr_in token_addr_;
125  std::string token_address_;
126  std::atomic<bool> request_sending_;
127 
128  private:
129  void setup_requests_(std::string trigger_addr);
130 
131  void do_send_request_();
132 
133  void setup_tokens_();
134 
135  void send_routing_token_(int nSlots);
136  };
137 }
138 #endif /* artdaq_DAQrate_RequestSender_hh */
void RemoveRequest(Fragment::sequence_id_t seqID)
Remove a request from the request list.
detail::RequestMessageMode GetRequestMode() const
Get the mode for RequestMessages.
The RequestSender contains methods used to send data requests and Routing tokens. ...
virtual ~RequestSender()
RequestSender Destructor.
void SendRequest(bool endOfRunOnly=false)
Send a request message containing all current requests.
void SendRoutingToken(int nSlots)
Send a RoutingToken message indicating that slots are available.
RequestSender()=delete
Default Constructor is deleted.
void SetRequestMode(detail::RequestMessageMode mode)
Set the mode for RequestMessages. Used to indicate when RequestSender should enter &quot;EndOfRun&quot; mode...
RequestMessageMode
Mode used to indicate current run conditions to the request receiver.
RequestSender & operator=(RequestSender const &)=delete
Copy Assignment operator is deleted.
void AddRequest(Fragment::sequence_id_t seqID, Fragment::timestamp_t timestamp)
Add a request to the request list.