From: Michal 'vorner' Vaner Date: Wed, 22 Feb 2012 15:42:13 +0000 (+0100) Subject: [1599] Reuse some objects X-Git-Tag: trac2351_base~226^2~116^2~163^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6ec73d5de3e72a8d6adbb7e3bc353b68584b344f;p=thirdparty%2Fkea.git [1599] Reuse some objects --- diff --git a/src/lib/asiodns/sync_udp_server.cc b/src/lib/asiodns/sync_udp_server.cc index 00d43fe3a4..b60315f142 100644 --- a/src/lib/asiodns/sync_udp_server.cc +++ b/src/lib/asiodns/sync_udp_server.cc @@ -20,9 +20,6 @@ #include "sync_udp_server.h" #include "logger.h" -#include -#include - #include #include #include @@ -46,6 +43,9 @@ SyncUDPServer::SyncUDPServer(asio::io_service& io_service, const uint16_t port, asiolink::SimpleCallback* checkin, DNSLookup* lookup, DNSAnswer* answer) : + output_buffer_(new isc::util::OutputBuffer(0)), + query_(new isc::dns::Message(isc::dns::Message::PARSE)), + answer_(new isc::dns::Message(isc::dns::Message::RENDER)), io_(io_service), checkin_callback_(checkin), lookup_callback_(lookup), answer_callback_(answer), stopped_(false) { @@ -64,6 +64,9 @@ SyncUDPServer::SyncUDPServer(asio::io_service& io_service, SyncUDPServer::SyncUDPServer(asio::io_service& io_service, const int fd, const int af, asiolink::SimpleCallback* checkin, DNSLookup* lookup, DNSAnswer* answer) : + output_buffer_(new isc::util::OutputBuffer(0)), + query_(new isc::dns::Message(isc::dns::Message::PARSE)), + answer_(new isc::dns::Message(isc::dns::Message::RENDER)), io_(io_service), checkin_callback_(checkin), lookup_callback_(lookup), answer_callback_(answer), stopped_(false) { @@ -134,19 +137,17 @@ SyncUDPServer::handleRead(const asio::error_code& ec, const size_t length) { return; } - // TODO: Can any of these be put to the object and reused? - isc::util::OutputBufferPtr output(new isc::util::OutputBuffer(0)); - isc::dns::MessagePtr - query(new isc::dns::Message(isc::dns::Message::PARSE)); - isc::dns::MessagePtr - answer(new isc::dns::Message(isc::dns::Message::RENDER)); + // Make sure the buffers are fresh + output_buffer_->clear(); + query_->clear(isc::dns::Message::PARSE); + answer_->clear(isc::dns::Message::RENDER); // Mark that we don't have an answer yet. done_ = false; resume_called_ = false; // Call the actual lookup - (*lookup_callback_)(message, query, answer, output, this); + (*lookup_callback_)(message, query_, answer_, output_buffer_, this); if (!resume_called_) { isc_throw(isc::Unexpected, @@ -160,13 +161,14 @@ SyncUDPServer::handleRead(const asio::error_code& ec, const size_t length) { if (done_) { // Good, there's an answer. // Call the answer callback to render it. - (*answer_callback_)(message, query, answer, output); + (*answer_callback_)(message, query_, answer_, output_buffer_); if (stopped_) { return; } - socket_->send_to(asio::buffer(output->getData(), output->getLength()), + socket_->send_to(asio::buffer(output_buffer_->getData(), + output_buffer_->getLength()), sender_); } diff --git a/src/lib/asiodns/sync_udp_server.h b/src/lib/asiodns/sync_udp_server.h index 84a5c2c034..5c1b72e258 100644 --- a/src/lib/asiodns/sync_udp_server.h +++ b/src/lib/asiodns/sync_udp_server.h @@ -23,7 +23,9 @@ #include "dns_lookup.h" #include "dns_server.h" +#include #include +#include #include #include @@ -109,6 +111,8 @@ public: private: static const size_t MAX_LENGTH = 4096; uint8_t data_[MAX_LENGTH]; + isc::util::OutputBufferPtr output_buffer_; + isc::dns::MessagePtr query_, answer_; std::auto_ptr socket_; asio::io_service& io_; asio::ip::udp::endpoint sender_;