HintRouter: Use shared_ptr for Dcb-wrapper
The Dcb also accepts a null-value at creation, indicating an empty dcb.
This commit is contained in:
@ -15,47 +15,34 @@
|
|||||||
#include <maxscale/atomic.h>
|
#include <maxscale/atomic.h>
|
||||||
#include <maxscale/service.h>
|
#include <maxscale/service.h>
|
||||||
|
|
||||||
|
|
||||||
Dcb::Dcb(DCB* pDcb)
|
Dcb::Dcb(DCB* pDcb)
|
||||||
: m_pDcb(pDcb)
|
: m_sInner()
|
||||||
, m_pRefs(NULL)
|
|
||||||
{
|
{
|
||||||
|
// A null value for m_pDcb is allowed as a special non-existing dcb
|
||||||
|
if (pDcb)
|
||||||
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
m_pRefs = new int (1);
|
m_sInner = SDCB(pDcb, Dcb::deleter);
|
||||||
}
|
}
|
||||||
catch (const std::exception&)
|
catch (const std::exception&)
|
||||||
{
|
{
|
||||||
dcb_close(pDcb);
|
dcb_close(pDcb);
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Dcb::Dcb(const Dcb& rhs)
|
void Dcb::deleter(DCB* dcb)
|
||||||
: m_pDcb(rhs.m_pDcb)
|
|
||||||
, m_pRefs(rhs.m_pRefs)
|
|
||||||
{
|
{
|
||||||
++(*m_pRefs);
|
if (dcb)
|
||||||
}
|
|
||||||
|
|
||||||
Dcb& Dcb::operator = (Dcb rhs)
|
|
||||||
{
|
|
||||||
swap(rhs);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Dcb::dec()
|
|
||||||
{
|
|
||||||
ss_dassert(*m_pRefs > 0);
|
|
||||||
|
|
||||||
if (--(*m_pRefs) == 0)
|
|
||||||
{
|
{
|
||||||
HR_DEBUG("CLOSING dcb");
|
HR_DEBUG("CLOSING dcb");
|
||||||
// TODO: You should not need to manually adjust any
|
// TODO: You should not need to manually adjust any
|
||||||
// TODO: connections number, dcb_close should handle that.
|
// 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;
|
pSref = pSref->next;
|
||||||
}
|
}
|
||||||
@ -64,9 +51,6 @@ void Dcb::dec()
|
|||||||
{
|
{
|
||||||
atomic_add(&pSref->connections, -1);
|
atomic_add(&pSref->connections, -1);
|
||||||
}
|
}
|
||||||
|
dcb_close(dcb);
|
||||||
dcb_close(m_pDcb);
|
|
||||||
|
|
||||||
delete m_pRefs;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,53 +13,46 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "hintrouterdefs.hh"
|
#include "hintrouterdefs.hh"
|
||||||
#include <algorithm>
|
|
||||||
|
#include <tr1/memory>
|
||||||
|
|
||||||
#include <maxscale/dcb.h>
|
#include <maxscale/dcb.h>
|
||||||
|
|
||||||
class Dcb
|
class Dcb
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit Dcb(DCB* pDcb);
|
typedef std::tr1::shared_ptr<DCB> SDCB;
|
||||||
Dcb(const Dcb& rhs);
|
|
||||||
~Dcb()
|
|
||||||
{
|
|
||||||
dec();
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
struct server* server() const
|
||||||
{
|
{
|
||||||
return m_pDcb->server;
|
return (this->m_sInner.get()) ? m_sInner.get()->server : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
DCB* get() const
|
DCB* get() const
|
||||||
{
|
{
|
||||||
return m_pDcb;
|
return m_sInner.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool write(GWBUF* pPacket)
|
bool write(GWBUF* pPacket) const
|
||||||
{
|
{
|
||||||
ss_dassert(m_pDcb);
|
ss_dassert(m_sInner.get());
|
||||||
return m_pDcb->func.write(m_pDcb, pPacket) == 1;
|
return m_sInner.get()->func.write(m_sInner.get(), pPacket) == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void inc()
|
static void deleter(DCB* dcb);
|
||||||
{
|
SDCB m_sInner;
|
||||||
++(*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;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user