]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
channel: Make the blocking parameters of the object queue explicit 13155/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 16 Aug 2023 14:42:26 +0000 (16:42 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 18 Aug 2023 11:08:29 +0000 (13:08 +0200)
pdns/channel.hh
pdns/delaypipe.cc
pdns/distributor.hh
pdns/dnsdist-tcp.cc
pdns/dnsdistdist/dnsdist-nghttp2.cc
pdns/dnsdistdist/doh.cc
pdns/snmp-agent.cc
pdns/test-channel.cc

index 6947d3b26d4b6c083a1dc20504e51d7611e6b48b..2d848fc9eee35db7234dc0c0d885a1eff21c0ec9 100644 (file)
@@ -43,6 +43,17 @@ namespace pdns
 {
 namespace channel
 {
+  enum class SenderBlockingMode
+  {
+    SenderNonBlocking,
+    SenderBlocking
+  };
+  enum class ReceiverBlockingMode
+  {
+    ReceiverNonBlocking,
+    ReceiverBlocking
+  };
+
   /**
    * The sender's end of a channel used to pass objects between threads.
    *
@@ -136,7 +147,7 @@ namespace channel
    * \throw runtime_error if the channel creation failed.
    */
   template <typename T, typename D = std::default_delete<T>>
-  std::pair<Sender<T, D>, Receiver<T, D>> createObjectQueue(bool sendNonBlocking = true, bool receiveNonBlocking = true, size_t pipeBufferSize = 0, bool throwOnEOF = true);
+  std::pair<Sender<T, D>, Receiver<T, D>> createObjectQueue(SenderBlockingMode senderBlockingMode = SenderBlockingMode::SenderNonBlocking, ReceiverBlockingMode receiverBlockingMode = ReceiverBlockingMode::ReceiverNonBlocking, size_t pipeBufferSize = 0, bool throwOnEOF = true);
 
   /**
    * The notifier's end of a channel used to communicate between threads.
@@ -307,7 +318,7 @@ namespace channel
   }
 
   template <typename T, typename D>
-  std::pair<Sender<T, D>, Receiver<T, D>> createObjectQueue(bool sendNonBlocking, bool receiveNonBlocking, size_t pipeBufferSize, bool throwOnEOF)
+  std::pair<Sender<T, D>, Receiver<T, D>> createObjectQueue(SenderBlockingMode senderBlockingMode, ReceiverBlockingMode receiverBlockingMode, size_t pipeBufferSize, bool throwOnEOF)
   {
     int fds[2] = {-1, -1};
     if (pipe(fds) < 0) {
@@ -316,13 +327,12 @@ namespace channel
 
     FDWrapper sender(fds[1]);
     FDWrapper receiver(fds[0]);
-
-    if (receiveNonBlocking && !setNonBlocking(receiver.getHandle())) {
+    if (receiverBlockingMode == ReceiverBlockingMode::ReceiverNonBlocking && !setNonBlocking(receiver.getHandle())) {
       int err = errno;
       throw std::runtime_error("Error making channel pipe non-blocking: " + stringerror(err));
     }
 
-    if (sendNonBlocking && !setNonBlocking(sender.getHandle())) {
+    if (senderBlockingMode == SenderBlockingMode::SenderNonBlocking && !setNonBlocking(sender.getHandle())) {
       int err = errno;
       throw std::runtime_error("Error making channel pipe non-blocking: " + stringerror(err));
     }
index 645bcf56109f4c8d545a2a693d01d87ca06762a9..ada096c1a27fa65ac1f918d0b7303c0de14c6960 100644 (file)
@@ -28,7 +28,7 @@
 template<class T>
 ObjectPipe<T>::ObjectPipe()
 {
-  auto [sender, receiver] = pdns::channel::createObjectQueue<T>(false, true, 0, false);
+  auto [sender, receiver] = pdns::channel::createObjectQueue<T>(pdns::channel::SenderBlockingMode::SenderBlocking, pdns::channel::ReceiverBlockingMode::ReceiverNonBlocking, 0, false);
   d_sender = std::move(sender);
   d_receiver = std::move(receiver);
 }
index d021cfa0f71faf19a9cdd364117757d7758fa39f..cdee87b67dc7b33a36cc3dd1a9c940b1e78535d8 100644 (file)
@@ -165,7 +165,7 @@ template<class Answer, class Question, class Backend>MultiThreadDistributor<Answ
   }
 
   for (int distributorIdx = 0; distributorIdx < numberOfThreads; distributorIdx++) {
-    auto [sender, receiver] = pdns::channel::createObjectQueue<QuestionData>(false, false);
+    auto [sender, receiver] = pdns::channel::createObjectQueue<QuestionData>(pdns::channel::SenderBlockingMode::SenderBlocking, pdns::channel::ReceiverBlockingMode::ReceiverBlocking);
     d_senders.push_back(std::move(sender));
     d_receivers.push_back(std::move(receiver));
   }
index 2a1d7b80eebbb06c4fbf5551cc78d341b20a2457..14af2564e32c08e2ecd58f20ba0e03b52d8c199c 100644 (file)
@@ -130,11 +130,11 @@ TCPClientCollection::TCPClientCollection(size_t maxThreads, std::vector<ClientSt
 void TCPClientCollection::addTCPClientThread(std::vector<ClientState*>& tcpAcceptStates)
 {
   try {
-    auto [queryChannelSender, queryChannelReceiver] = pdns::channel::createObjectQueue<ConnectionInfo>(true, true, g_tcpInternalPipeBufferSize);
+    auto [queryChannelSender, queryChannelReceiver] = pdns::channel::createObjectQueue<ConnectionInfo>(pdns::channel::SenderBlockingMode::SenderNonBlocking, pdns::channel::ReceiverBlockingMode::ReceiverNonBlocking, g_tcpInternalPipeBufferSize);
 
-    auto [crossProtocolQueryChannelSender, crossProtocolQueryChannelReceiver] = pdns::channel::createObjectQueue<CrossProtocolQuery>(true, true, g_tcpInternalPipeBufferSize);
+    auto [crossProtocolQueryChannelSender, crossProtocolQueryChannelReceiver] = pdns::channel::createObjectQueue<CrossProtocolQuery>(pdns::channel::SenderBlockingMode::SenderNonBlocking, pdns::channel::ReceiverBlockingMode::ReceiverNonBlocking, g_tcpInternalPipeBufferSize);
 
-    auto [crossProtocolResponseChannelSender, crossProtocolResponseChannelReceiver] = pdns::channel::createObjectQueue<TCPCrossProtocolResponse>(true, true, g_tcpInternalPipeBufferSize);
+    auto [crossProtocolResponseChannelSender, crossProtocolResponseChannelReceiver] = pdns::channel::createObjectQueue<TCPCrossProtocolResponse>(pdns::channel::SenderBlockingMode::SenderNonBlocking, pdns::channel::ReceiverBlockingMode::ReceiverNonBlocking, g_tcpInternalPipeBufferSize);
 
     vinfolog("Adding TCP Client thread");
 
index fdc3d7a294c25bd76ce5333c211fe0e18798f7a8..39e60009e05d78552351054412600c7b1adc684f 100644 (file)
@@ -1054,7 +1054,7 @@ void DoHClientCollection::addThread()
 {
 #ifdef HAVE_NGHTTP2
   try {
-    auto [sender, receiver] = pdns::channel::createObjectQueue<CrossProtocolQuery>(true, true, g_tcpInternalPipeBufferSize);
+    auto [sender, receiver] = pdns::channel::createObjectQueue<CrossProtocolQuery>(pdns::channel::SenderBlockingMode::SenderNonBlocking, pdns::channel::ReceiverBlockingMode::ReceiverNonBlocking, g_tcpInternalPipeBufferSize);
 
     vinfolog("Adding DoH Client thread");
     std::lock_guard<std::mutex> lock(d_mutex);
index 2a24dabebca58c4c07c62157fea1495185665452..dac28e8ca921b76804cbd6639f626262f9e3d27e 100644 (file)
@@ -175,14 +175,14 @@ struct DOHServerConfig
   {
 #ifndef USE_SINGLE_ACCEPTOR_THREAD
     {
-      auto [sender, receiver] = pdns::channel::createObjectQueue<DOHUnit, void(*)(DOHUnit*)>(true, false, internalPipeBufferSize);
+      auto [sender, receiver] = pdns::channel::createObjectQueue<DOHUnit, void(*)(DOHUnit*)>(pdns::channel::SenderBlockingMode::SenderNonBlocking, pdns::channel::ReceiverBlockingMode::ReceiverBlocking, internalPipeBufferSize);
       d_querySender = std::move(sender);
       d_queryReceiver = std::move(receiver);
     }
 #endif /* USE_SINGLE_ACCEPTOR_THREAD */
 
     {
-      auto [sender, receiver] = pdns::channel::createObjectQueue<DOHUnit, void(*)(DOHUnit*)>(true, true, internalPipeBufferSize);
+      auto [sender, receiver] = pdns::channel::createObjectQueue<DOHUnit, void(*)(DOHUnit*)>(pdns::channel::SenderBlockingMode::SenderNonBlocking, pdns::channel::ReceiverBlockingMode::ReceiverNonBlocking, internalPipeBufferSize);
       d_responseSender = std::move(sender);
       d_responseReceiver = std::move(receiver);
     }
index d13d7d0030401c7b5414e03a2196171ba0114a71..2c9121c279ac170a21dc6d8eb6b4c934d7537b65 100644 (file)
@@ -186,7 +186,7 @@ SNMPAgent::SNMPAgent([[maybe_unused]] const std::string& name, [[maybe_unused]]
 
   init_snmp(name.c_str());
 
-  auto [sender, receiver] = pdns::channel::createObjectQueue<netsnmp_variable_list, void(*)(netsnmp_variable_list*)>(true, true);
+  auto [sender, receiver] = pdns::channel::createObjectQueue<netsnmp_variable_list, void(*)(netsnmp_variable_list*)>();
   d_sender = std::move(sender);
   d_receiver = std::move(receiver);
 #endif /* HAVE_NET_SNMP */
index 9a7e4e037b58736052b11f71f89a003efad65a53..8bd042122e04c86fd1d1660d3126b82af4e527a3 100644 (file)
@@ -94,7 +94,7 @@ BOOST_AUTO_TEST_CASE(test_object_queue_throw_on_eof)
 
 BOOST_AUTO_TEST_CASE(test_object_queue_do_not_throw_on_eof)
 {
-  auto [sender, receiver] = pdns::channel::createObjectQueue<MyObject>(true, true, 0U, false);
+  auto [sender, receiver] = pdns::channel::createObjectQueue<MyObject>(pdns::channel::SenderBlockingMode::SenderNonBlocking, pdns::channel::ReceiverBlockingMode::ReceiverNonBlocking, 0U, false);
   sender.close();
   auto got = receiver.receive();
   BOOST_CHECK(got == std::nullopt);