X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=udpinput.cpp;h=ecd099a529913250b99531f4427fa6c56ec6d91f;hp=445d4f551fff145b3ceac1e417b574d4292a1ade;hb=e713e8e65d60ea97c788418692b22ac328a610b0;hpb=a0fe013448d188b324c00383cfd91695d9d3d076 diff --git a/udpinput.cpp b/udpinput.cpp index 445d4f5..ecd099a 100644 --- a/udpinput.cpp +++ b/udpinput.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -11,7 +12,6 @@ #include "acceptor.h" #include "log.h" -#include "mutexlock.h" #include "serverpool.h" #include "state.pb.h" #include "stream.h" @@ -113,19 +113,18 @@ UDPInput::UDPInput(const string &url) construct_header(); - pthread_mutex_init(&stats_mutex, nullptr); stats.url = url; - stats.bytes_received = 0; - stats.data_bytes_received = 0; - stats.metadata_bytes_received = 0; stats.connect_time = time(nullptr); - stats.latency_sec = HUGE_VAL; } UDPInput::UDPInput(const InputProto &serialized) : url(serialized.url()), sock(serialized.sock()) { + // Set back the close-on-exec flag for the socket. + // (This can't leak into a child, since we haven't been started yet.) + fcntl(sock, F_SETFD, 1); + // Should be verified by the caller. string protocol; bool ok = parse_url(url, &protocol, &user, &host, &port, &path); @@ -133,7 +132,6 @@ UDPInput::UDPInput(const InputProto &serialized) construct_header(); - pthread_mutex_init(&stats_mutex, nullptr); stats.url = url; stats.bytes_received = serialized.bytes_received(); stats.data_bytes_received = serialized.data_bytes_received(); @@ -146,6 +144,10 @@ UDPInput::UDPInput(const InputProto &serialized) InputProto UDPInput::serialize() const { + // Unset the close-on-exec flag for the socket. + // (This can't leak into a child, since there's only one thread left.) + fcntl(sock, F_SETFD, 0); + InputProto serialized; serialized.set_url(url); serialized.set_sock(sock); @@ -217,26 +219,26 @@ void UDPInput::do_work() ret = recv(sock, packet_buf, sizeof(packet_buf), 0); } while (ret == -1 && errno == EINTR); - if (ret <= 0) { + if (ret < 0) { // Note that zero-byte packets are legal. log_perror("recv"); close_socket(); continue; } { - MutexLock lock(&stats_mutex); + lock_guard lock(stats_mutex); stats.bytes_received += ret; stats.data_bytes_received += ret; } for (size_t stream_index : stream_indices) { - servers->add_data(stream_index, packet_buf, ret, /*metacube_flags=*/0); + servers->add_data(stream_index, packet_buf, ret, /*metacube_flags=*/0, /*pts=*/RationalPTS()); } } } InputStats UDPInput::get_stats() const { - MutexLock lock(&stats_mutex); + lock_guard lock(stats_mutex); return stats; }