From ddcd1f960c4029042311f9be5b2bd1f76e16f0ad Mon Sep 17 00:00:00 2001 From: Esa Korhonen Date: Mon, 27 Mar 2017 10:00:47 +0300 Subject: [PATCH] HintRouter: Use shared_ptr for Dcb-wrapper The Dcb also accepts a null-value at creation, indicating an empty dcb. --- server/modules/routing/hintrouter/dcb.cc | 50 ++++++++--------------- server/modules/routing/hintrouter/dcb.hh | 51 ++++++++++-------------- 2 files changed, 39 insertions(+), 62 deletions(-) diff --git a/server/modules/routing/hintrouter/dcb.cc b/server/modules/routing/hintrouter/dcb.cc index 04b44c1c1..76b0b22b2 100644 --- a/server/modules/routing/hintrouter/dcb.cc +++ b/server/modules/routing/hintrouter/dcb.cc @@ -15,47 +15,34 @@ #include #include - Dcb::Dcb(DCB* pDcb) - : m_pDcb(pDcb) - , m_pRefs(NULL) + : m_sInner() { - try + // A null value for m_pDcb is allowed as a special non-existing dcb + if (pDcb) { - m_pRefs = new int (1); - } - catch (const std::exception&) - { - dcb_close(pDcb); - throw; + try + { + m_sInner = SDCB(pDcb, Dcb::deleter); + } + catch (const std::exception&) + { + dcb_close(pDcb); + throw; + } } } -Dcb::Dcb(const Dcb& rhs) - : m_pDcb(rhs.m_pDcb) - , m_pRefs(rhs.m_pRefs) +void Dcb::deleter(DCB* dcb) { - ++(*m_pRefs); -} - -Dcb& Dcb::operator = (Dcb rhs) -{ - swap(rhs); - return *this; -} - -void Dcb::dec() -{ - ss_dassert(*m_pRefs > 0); - - if (--(*m_pRefs) == 0) + if (dcb) { HR_DEBUG("CLOSING dcb"); // TODO: You should not need to manually adjust any // TODO: connections number, dcb_close should handle that. - SERVER_REF* pSref = m_pDcb->service->dbref; + SERVER_REF* pSref = dcb->service->dbref; - while (pSref && (pSref->server != m_pDcb->server)) + while (pSref && (pSref->server != dcb->server)) { pSref = pSref->next; } @@ -64,9 +51,6 @@ void Dcb::dec() { atomic_add(&pSref->connections, -1); } - - dcb_close(m_pDcb); - - delete m_pRefs; + dcb_close(dcb); } } diff --git a/server/modules/routing/hintrouter/dcb.hh b/server/modules/routing/hintrouter/dcb.hh index 038a8b0f4..fbb462449 100644 --- a/server/modules/routing/hintrouter/dcb.hh +++ b/server/modules/routing/hintrouter/dcb.hh @@ -13,53 +13,46 @@ */ #include "hintrouterdefs.hh" -#include + +#include + #include class Dcb { public: - explicit Dcb(DCB* pDcb); - Dcb(const Dcb& rhs); - ~Dcb() - { - dec(); - } + typedef std::tr1::shared_ptr SDCB; - Dcb& operator = (Dcb rhs); + explicit Dcb(DCB* pDcb); + + Dcb(const Dcb& rhs) + : m_sInner(rhs.m_sInner) + {}; + + Dcb& operator = (Dcb rhs) + { + m_sInner.swap(rhs.m_sInner); + return *this; + } struct server* server() const { - return m_pDcb->server; + return (this->m_sInner.get()) ? m_sInner.get()->server : NULL; } DCB* get() const { - return m_pDcb; + return m_sInner.get(); } - bool write(GWBUF* pPacket) + bool write(GWBUF* pPacket) const { - ss_dassert(m_pDcb); - return m_pDcb->func.write(m_pDcb, pPacket) == 1; + ss_dassert(m_sInner.get()); + return m_sInner.get()->func.write(m_sInner.get(), pPacket) == 1; } private: - void inc() - { - ++(*m_pRefs); - } - - void dec(); - - void swap(Dcb& rhs) - { - std::swap(m_pDcb, rhs.m_pDcb); - std::swap(m_pRefs, rhs.m_pRefs); - } - -private: - DCB* m_pDcb; - int* m_pRefs; + static void deleter(DCB* dcb); + SDCB m_sInner; };