[svn] commit: r3572 - in /branches/vorner-recursor-timeouts/src/lib/asiolink: internal/udpdns.h udpdns.cc

BIND 10 source code commits bind10-changes at lists.isc.org
Sat Nov 20 16:12:04 UTC 2010


Author: vorner
Date: Sat Nov 20 16:12:04 2010
New Revision: 3572

Log:
Better name and comments for asiolink::UDPQuery::Priv

Modified:
    branches/vorner-recursor-timeouts/src/lib/asiolink/internal/udpdns.h
    branches/vorner-recursor-timeouts/src/lib/asiolink/udpdns.cc

Modified: branches/vorner-recursor-timeouts/src/lib/asiolink/internal/udpdns.h
==============================================================================
--- branches/vorner-recursor-timeouts/src/lib/asiolink/internal/udpdns.h (original)
+++ branches/vorner-recursor-timeouts/src/lib/asiolink/internal/udpdns.h Sat Nov 20 16:12:04 2010
@@ -219,13 +219,16 @@
     enum { MAX_LENGTH = 4096 };
 
     /**
-     * Private data. They are not private because of stability of the
+     * \short Private data
+     *
+     * They are not private because of stability of the
      * interface (this is private class anyway), but because this class
-     * will be copyed often and we want to keep the same data between
-     * the coroutines.
+     * will be copyed often (it is used as a coroutine and passed as callback
+     * to many async_*() functions) and we want keep the same data. Some of
+     * the data is not copyable too.
      */
-    struct Priv;
-    boost::shared_ptr<Priv> priv;
+    struct PrivateData;
+    boost::shared_ptr<PrivateData> data_;
 };
 }
 

Modified: branches/vorner-recursor-timeouts/src/lib/asiolink/udpdns.cc
==============================================================================
--- branches/vorner-recursor-timeouts/src/lib/asiolink/udpdns.cc (original)
+++ branches/vorner-recursor-timeouts/src/lib/asiolink/udpdns.cc Sat Nov 20 16:12:04 2010
@@ -173,20 +173,33 @@
     io_.post(*this);
 }
 
-struct UDPQuery::Priv {
+// Private UDPQuery data (see internal/udpdns.h for reasons)
+struct UDPQuery::PrivateData {
+    // Socket we send query to and expect reply from there
     udp::socket socket;
+    // Where was the query sent
     udp::endpoint remote;
+    // What we ask the server
     Question question;
+    // We will store the answer here
     OutputBufferPtr buffer;
     OutputBufferPtr msgbuf;
+    // Temporary buffer for answer
     boost::shared_array<char> data;
+    // This will be called when the data arrive or timeouts
     Callback* callback;
+    // Did we already stop operating (data arrived, we timed out, someone
+    // called stop). This can be so when we are cleaning up/there are
+    // still pointers to us.
     bool stopped;
+    // Timer to measure timeouts.
     deadline_timer timer;
+    // How many milliseconds are we willing to wait for answer?
     int timeout;
 
-    Priv(io_service& service, const udp::socket::protocol_type& protocol,
-        const Question &q, OutputBufferPtr b, Callback *c) :
+    PrivateData(io_service& service,
+        const udp::socket::protocol_type& protocol, const Question &q,
+        OutputBufferPtr b, Callback *c) :
         socket(service, protocol),
         question(q),
         buffer(b),
@@ -203,19 +216,19 @@
 UDPQuery::UDPQuery(io_service& io_service,
                    const Question& q, const IOAddress& addr, uint16_t port,
                    OutputBufferPtr buffer, Callback *callback, int timeout) :
-    priv(new Priv(io_service,
+    data_(new PrivateData(io_service,
         addr.getFamily() == AF_INET ? udp::v4() : udp::v6(), q, buffer,
         callback))
 {
-    priv->remote = UDPEndpoint(addr, port).getASIOEndpoint();
-    priv->timeout = timeout;
+    data_->remote = UDPEndpoint(addr, port).getASIOEndpoint();
+    data_->timeout = timeout;
 }
 
 /// The function operator is implemented with the "stackless coroutine"
 /// pattern; see internal/coroutine.h for details.
 void
 UDPQuery::operator()(error_code ec, size_t length) {
-    if (ec || priv->stopped) {
+    if (ec || data_->stopped) {
         return;
     }
 
@@ -231,40 +244,40 @@
             msg.setOpcode(Opcode::QUERY());
             msg.setRcode(Rcode::NOERROR());
             msg.setHeaderFlag(MessageFlag::RD());
-            msg.addQuestion(priv->question);
-            MessageRenderer renderer(*priv->msgbuf);
+            msg.addQuestion(data_->question);
+            MessageRenderer renderer(*data_->msgbuf);
             msg.toWire(renderer);
         }
 
         // If we timeout, we stop, which will shutdown everything and
         // cancel all other attempts to run inside the coroutine
-        if (priv->timeout != -1) {
-            priv->timer.expires_from_now(boost::posix_time::milliseconds(
-                priv->timeout));
-            priv->timer.async_wait(boost::bind(&UDPQuery::stop, *this,
+        if (data_->timeout != -1) {
+            data_->timer.expires_from_now(boost::posix_time::milliseconds(
+                data_->timeout));
+            data_->timer.async_wait(boost::bind(&UDPQuery::stop, *this,
                 TIME_OUT));
         }
 
         // Begin an asynchronous send, and then yield.  When the
         // send completes, we will resume immediately after this point.
-        CORO_YIELD priv->socket.async_send_to(buffer(priv->msgbuf->getData(),
-            priv->msgbuf->getLength()), priv->remote, *this);
+        CORO_YIELD data_->socket.async_send_to(buffer(data_->msgbuf->getData(),
+            data_->msgbuf->getLength()), data_->remote, *this);
 
         /// Allocate space for the response.  (XXX: This should be
         /// optimized by maintaining a free list of pre-allocated blocks)
-        priv->data.reset(new char[MAX_LENGTH]);
+        data_->data.reset(new char[MAX_LENGTH]);
 
         /// Begin an asynchronous receive, and yield.  When the receive
         /// completes, we will resume immediately after this point.
-        CORO_YIELD priv->socket.async_receive_from(buffer(priv->data.get(),
-            MAX_LENGTH), priv->remote, *this);
+        CORO_YIELD data_->socket.async_receive_from(buffer(data_->data.get(),
+            MAX_LENGTH), data_->remote, *this);
 
         /// Copy the answer into the response buffer.  (XXX: If the
         /// OutputBuffer object were made to meet the requirements of
         /// a MutableBufferSequence, then it could be written to directly
         /// by async_recieve_from() and this additional copy step would
         /// be unnecessary.)
-        priv->buffer->writeData(priv->data.get(), length);
+        data_->buffer->writeData(data_->data.get(), length);
 
         /// We are done
         stop(SUCCESS);
@@ -273,15 +286,15 @@
 
 void
 UDPQuery::stop(Result result) {
-    if (!priv->stopped) {
-        priv->stopped = true;
-        priv->socket.cancel();
-        priv->socket.close();
-        priv->timer.cancel();
-        if (priv->callback) {
-            (*priv->callback)(result);
-        }
-    }
-}
-
-}
+    if (!data_->stopped) {
+        data_->stopped = true;
+        data_->socket.cancel();
+        data_->socket.close();
+        data_->timer.cancel();
+        if (data_->callback) {
+            (*data_->callback)(result);
+        }
+    }
+}
+
+}




More information about the bind10-changes mailing list