]> granicus.if.org Git - pdns/commitdiff
rec: Allocate the DNSQuestion `dq` object on the stack
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 12 Dec 2016 09:04:13 +0000 (10:04 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 12 Dec 2016 09:04:13 +0000 (10:04 +0100)
We don't need to allocate a `shared_ptr` for each query.

pdns/lua-recursor4.cc
pdns/lua-recursor4.hh
pdns/pdns_recursor.cc

index e04073d703936f69a7b43dc86594a6f63fe05cba..650ac3708973c2d44df8c987dda1b281a7cc40c0 100644 (file)
@@ -36,27 +36,27 @@ RecursorLua4::RecursorLua4(const std::string &fname)
   throw std::runtime_error("Attempt to load a Lua script in a PowerDNS binary without Lua support");
 }
 
-bool RecursorLua4::nxdomain(std::shared_ptr<DNSQuestion> dq, int& res)
+bool RecursorLua4::nxdomain(DNSQuestion& dq, int& res)
 {
   return false;
 }
 
-bool RecursorLua4::nodata(std::shared_ptr<DNSQuestion> dq, int& res)
+bool RecursorLua4::nodata(DNSQuestion& dq, int& res)
 {
   return false;
 }
 
-bool RecursorLua4::postresolve(std::shared_ptr<DNSQuestion> dq, int& res)
+bool RecursorLua4::postresolve(DNSQuestion& dq, int& res)
 {
   return false;
 }
 
-bool RecursorLua4::prerpz(std::shared_ptr<DNSQuestion> dq, int& ret)
+bool RecursorLua4::prerpz(DNSQuestion& dq, int& ret)
 {
   return false;
 }
 
-bool RecursorLua4::preresolve(std::shared_ptr<DNSQuestion> dq, int& res)
+bool RecursorLua4::preresolve(DNSQuestion& dq, int& res)
 {
   return false;
 }
@@ -586,27 +586,27 @@ RecursorLua4::RecursorLua4(const std::string& fname)
   d_gettag = d_lw->readVariable<boost::optional<gettag_t>>("gettag").get_value_or(0);
 }
 
-bool RecursorLua4::prerpz(std::shared_ptr<DNSQuestion> dq, int& ret)
+bool RecursorLua4::prerpz(DNSQuestion& dq, int& ret)
 {
   return genhook(d_prerpz, dq, ret);
 }
 
-bool RecursorLua4::preresolve(std::shared_ptr<DNSQuestion> dq, int& ret)
+bool RecursorLua4::preresolve(DNSQuestion& dq, int& ret)
 {
   return genhook(d_preresolve, dq, ret);
 }
 
-bool RecursorLua4::nxdomain(std::shared_ptr<DNSQuestion> dq, int& ret)
+bool RecursorLua4::nxdomain(DNSQuestion& dq, int& ret)
 {
   return genhook(d_nxdomain, dq, ret);
 }
 
-bool RecursorLua4::nodata(std::shared_ptr<DNSQuestion> dq, int& ret)
+bool RecursorLua4::nodata(DNSQuestion& dq, int& ret)
 {
   return genhook(d_nodata, dq, ret);
 }
 
-bool RecursorLua4::postresolve(std::shared_ptr<DNSQuestion> dq, int& ret)
+bool RecursorLua4::postresolve(DNSQuestion& dq, int& ret)
 {
   return genhook(d_postresolve, dq, ret);
 }
@@ -615,8 +615,8 @@ bool RecursorLua4::preoutquery(const ComboAddress& ns, const ComboAddress& reque
 {
   bool variableAnswer = false;
   bool wantsRPZ = false;
-  auto dq = std::make_shared<RecursorLua4::DNSQuestion>(requestor, ns, query, qtype.getCode(), isTcp, variableAnswer, wantsRPZ);
-  dq->currentRecords = &res;
+  auto dq = RecursorLua4::DNSQuestion(requestor, ns, query, qtype.getCode(), isTcp, variableAnswer, wantsRPZ);
+  dq.currentRecords = &res;
 
   return genhook(d_preoutquery, dq, ret);
 }
@@ -646,44 +646,44 @@ int RecursorLua4::gettag(const ComboAddress& remote, const Netmask& ednssubnet,
   return 0;
 }
 
-bool RecursorLua4::genhook(luacall_t& func, std::shared_ptr<DNSQuestion> dq, int& ret)
+bool RecursorLua4::genhook(luacall_t& func, DNSQuestion& dq, int& ret)
 {
   if(!func)
     return false;
 
-  if (dq->currentRecords) {
-    dq->records = *dq->currentRecords;
+  if (dq.currentRecords) {
+    dq.records = *dq.currentRecords;
   } else {
-    dq->records.clear();
+    dq.records.clear();
   }
 
-  dq->followupFunction.clear();
-  dq->followupPrefix.clear();
-  dq->followupName.clear();
-  dq->udpQuery.clear();
-  dq->udpAnswer.clear();
-  dq->udpCallback.clear();
+  dq.followupFunction.clear();
+  dq.followupPrefix.clear();
+  dq.followupName.clear();
+  dq.udpQuery.clear();
+  dq.udpAnswer.clear();
+  dq.udpCallback.clear();
 
-  dq->rcode = ret;
+  dq.rcode = ret;
   bool handled=func(dq);
 
   if(handled) {
 loop:;
-    ret=dq->rcode;
+    ret=dq.rcode;
     
-    if(!dq->followupFunction.empty()) {
-      if(dq->followupFunction=="followCNAMERecords") {
-        ret = followCNAMERecords(dq->records, QType(dq->qtype));
+    if(!dq.followupFunction.empty()) {
+      if(dq.followupFunction=="followCNAMERecords") {
+        ret = followCNAMERecords(dq.records, QType(dq.qtype));
       }
-      else if(dq->followupFunction=="getFakeAAAARecords") {
-        ret=getFakeAAAARecords(dq->followupName, dq->followupPrefix, dq->records);
+      else if(dq.followupFunction=="getFakeAAAARecords") {
+        ret=getFakeAAAARecords(dq.followupName, dq.followupPrefix, dq.records);
       }
-      else if(dq->followupFunction=="getFakePTRRecords") {
-        ret=getFakePTRRecords(dq->followupName, dq->followupPrefix, dq->records);
+      else if(dq.followupFunction=="getFakePTRRecords") {
+        ret=getFakePTRRecords(dq.followupName, dq.followupPrefix, dq.records);
       }
-      else if(dq->followupFunction=="udpQueryResponse") {
-        dq->udpAnswer = GenUDPQueryResponse(dq->udpQueryDest, dq->udpQuery);
-        auto func = d_lw->readVariable<boost::optional<luacall_t>>(dq->udpCallback).get_value_or(0);
+      else if(dq.followupFunction=="udpQueryResponse") {
+        dq.udpAnswer = GenUDPQueryResponse(dq.udpQueryDest, dq.udpQuery);
+        auto func = d_lw->readVariable<boost::optional<luacall_t>>(dq.udpCallback).get_value_or(0);
         if(!func) {
           theL()<<Logger::Error<<"Attempted callback for Lua UDP Query/Response which could not be found"<<endl;
           return false;
@@ -695,8 +695,8 @@ loop:;
         goto loop;
       }
     }
-    if (dq->currentRecords) {
-      *dq->currentRecords = dq->records;
+    if (dq.currentRecords) {
+      *dq.currentRecords = dq.records;
     }
   }
 
index 230f07a85d4ad7ef490c4f291e9c55ab66d918cd..fe9236027fafd38ebec7da5ea0e545761f752105 100644 (file)
@@ -98,11 +98,11 @@ public:
 
   int gettag(const ComboAddress& remote, const Netmask& ednssubnet, const ComboAddress& local, const DNSName& qname, uint16_t qtype, std::vector<std::string>* policyTags);
 
-  bool prerpz(std::shared_ptr<DNSQuestion> dq, int& ret);
-  bool preresolve(std::shared_ptr<DNSQuestion> dq, int& ret);
-  bool nxdomain(std::shared_ptr<DNSQuestion> dq, int& ret);
-  bool nodata(std::shared_ptr<DNSQuestion> dq, int& ret);
-  bool postresolve(std::shared_ptr<DNSQuestion> dq, int& ret);
+  bool prerpz(DNSQuestion& dq, int& ret);
+  bool preresolve(DNSQuestion& dq, int& ret);
+  bool nxdomain(DNSQuestion& dq, int& ret);
+  bool nodata(DNSQuestion& dq, int& ret);
+  bool postresolve(DNSQuestion& dq, int& ret);
 
   bool preoutquery(const ComboAddress& ns, const ComboAddress& requestor, const DNSName& query, const QType& qtype, bool isTcp, vector<DNSRecord>& res, int& ret);
   bool ipfilter(const ComboAddress& remote, const ComboAddress& local, const struct dnsheader&);
@@ -120,9 +120,9 @@ public:
   gettag_t d_gettag; // public so you can query if we have this hooked
 
 private:
-  typedef std::function<bool(std::shared_ptr<DNSQuestion>)> luacall_t;
+  typedef std::function<bool(DNSQuestion&)> luacall_t;
   luacall_t d_prerpz, d_preresolve, d_nxdomain, d_nodata, d_postresolve, d_preoutquery, d_postoutquery;
-  bool genhook(luacall_t& func, std::shared_ptr<DNSQuestion> dq, int& ret);
+  bool genhook(luacall_t& func, DNSQuestion& dq, int& ret);
   typedef std::function<bool(ComboAddress,ComboAddress, struct dnsheader)> ipfilter_t;
   ipfilter_t d_ipfilter;
 };
index 8c87337cbdca4a51cb6da9cf4e3f22d9d00e7117..08ee4d101dc50343116f559f69eca2badcee2079 100644 (file)
@@ -743,18 +743,15 @@ void startDoResolve(void *p)
     int res;
     DNSFilterEngine::Policy appliedPolicy;
     DNSRecord spoofed;
-    std::shared_ptr<RecursorLua4::DNSQuestion> dq = nullptr;
-    if (t_pdl->get() && (*t_pdl)->needDQ()) {
-      dq = std::make_shared<RecursorLua4::DNSQuestion>(dc->d_remote, dc->d_local, dc->d_mdp.d_qname, dc->d_mdp.d_qtype, dc->d_tcp, variableAnswer, wantsRPZ);
-      dq->ednsFlags = &edo.d_Z;
-      dq->ednsOptions = &dc->d_ednsOpts;
-      dq->tag = dc->d_tag;
-      dq->discardedPolicies = &sr.d_discardedPolicies;
-      dq->policyTags = &dc->d_policyTags;
-      dq->appliedPolicy = &appliedPolicy;
-      dq->currentRecords = &ret;
-      dq->dh = &dc->d_mdp.d_header;
-    }
+    RecursorLua4::DNSQuestion dq(dc->d_remote, dc->d_local, dc->d_mdp.d_qname, dc->d_mdp.d_qtype, dc->d_tcp, variableAnswer, wantsRPZ);
+    dq.ednsFlags = &edo.d_Z;
+    dq.ednsOptions = &dc->d_ednsOpts;
+    dq.tag = dc->d_tag;
+    dq.discardedPolicies = &sr.d_discardedPolicies;
+    dq.policyTags = &dc->d_policyTags;
+    dq.appliedPolicy = &appliedPolicy;
+    dq.currentRecords = &ret;
+    dq.dh = &dc->d_mdp.d_header;
 
     if(dc->d_mdp.d_qtype==QType::ANY && !dc->d_tcp && g_anyToTcp) {
       pw.getHeader()->tc = 1;