7 #include <condition_variable>
19 #include <sys/socket.h>
20 #include <netinet/in.h>
21 #include <arpa/inet.h>
22 #include <linux/udp.h>
24 #include <sys/types.h>
28 #include <sys/sysinfo.h>
31 #include <sys/select.h>
36 #include "Mu2e-STMDAQ/utils/async_logger.hh"
38 #include "Mu2e-STMDAQ/utils/signal_handler.hh"
40 #include "Mu2e-STMDAQ/config/stm_data.hh"
42 #include "Mu2e-STMDAQ/processing/operations_base.hh"
44 #include "Mu2e-STMDAQ/debug/udp_debug.hh"
53 const std::shared_ptr<AsyncLogger> logger;
56 const std::shared_ptr<STMdata>& stm;
59 const std::shared_ptr<SignalHandler>& signal;
80 struct timeval read_timeout;
81 struct timespec timeout;
87 struct mmsghdr* messages;
92 const size_t max_packet_num;
95 bool has_received_data =
false;
98 bool waiting_for_data =
false;
101 size_t total_packets_received = 0;
104 std::chrono::duration<double> wait_time;
105 std::chrono::time_point<std::chrono::high_resolution_clock> start_wait =
106 std::chrono::high_resolution_clock::now();
107 std::chrono::time_point<std::chrono::high_resolution_clock> end_wait = start_wait;
109 const size_t idle_timeout_ms;
110 std::chrono::steady_clock::time_point last_recv_time;
111 bool idle_timeout_logged =
false;
114 std::atomic<double> wait_secs{0.0};
115 void add_wait(std::chrono::duration<double> delta){
116 double old_val = wait_secs.load(std::memory_order_relaxed);
119 new_val = old_val + delta.count();
120 }
while (!wait_secs.compare_exchange_weak(
122 std::memory_order_release,
123 std::memory_order_relaxed));
129 UDP(
const std::shared_ptr<AsyncLogger>& logger_,
130 const std::shared_ptr<STMdata>& stm_,
131 const std::shared_ptr<SignalHandler>& signal_,
132 const bool is_client_);
143 if (logger) logger->log(
"UDP server received a total of " + std::to_string(total_packets_received) +
" packets.",1);
144 if (logger) logger->log(
"Total UDP server dead time = " + std::to_string(wait_time.count()) +
" seconds.",1);
145 std::cout <<
"UDP destructor called.\n";
152 void configure_server();
155 void setup_buffers();
158 void configure_client();
161 void receive_data(std::shared_ptr<DataStruct>& buffer);
164 void send_packet(
const std::vector<int16_t>& data_vec);
167 std::chrono::duration<double>* get_wait_time(){
171 std::chrono::duration<double> get_wait() {
172 return std::chrono::duration<double>(wait_secs.load(std::memory_order_acquire));