Skip to content

Commit

Permalink
regtx
Browse files Browse the repository at this point in the history
  • Loading branch information
nyaxt committed Feb 15, 2012
1 parent 590b5c6 commit 53ea1e5
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 4 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -6,3 +6,4 @@ graphdump/
__pycache__
core
_testtmp/
*.pyc
2 changes: 0 additions & 2 deletions ptnk/db.h
Expand Up @@ -8,8 +8,6 @@
namespace ptnk
{

class TPIO;
class TPIOTxSession;
class TPIO;
class TPIOTxSession;

Expand Down
1 change: 1 addition & 0 deletions ptnk/partitionedpageio.cpp
Expand Up @@ -20,6 +20,7 @@ namespace ptnk

PartitionedPageIO::PartitionedPageIO(const char* dbprefix, ptnk_opts_t opts, int mode)
: m_mode(mode), m_opts(opts),
m_needInit(false),
m_pgidLast(PGID_INVALID),
m_partidFirst(PTNK_PARTID_INVALID), m_partidLast(0),
m_helper(nullptr), m_isHelperInvoked(true)
Expand Down
37 changes: 36 additions & 1 deletion ptnk/tpio.cpp
Expand Up @@ -48,6 +48,8 @@ TPIOTxSession::TPIOTxSession(TPIO* tpio, shared_ptr<ActiveOvr> aovr, unique_ptr<
m_aovr(move(aovr)),
m_lovr(move(lovr))
{
tpio->registerTx(this);

m_lovr->attachExtra(unique_ptr<OvrExtra>(new OvrExtra));
m_oldlink = &reinterpret_cast<OvrExtra*>(m_lovr->getExtra())->oldlink;
}
Expand All @@ -66,7 +68,7 @@ TPIOTxSession::OvrExtra::~OvrExtra()

TPIOTxSession::~TPIOTxSession()
{
/* NOP */
m_tpio->unregisterTx(this);
}

pair<Page, page_id_t>
Expand Down Expand Up @@ -216,6 +218,11 @@ TPIO::TPIO(shared_ptr<PageIO> backend, ptnk_opts_t opts)
m_bDuringRebase(false),
m_bDuringRefresh(false)
{
for(size_t i = 0; i < NTXPOOL; ++ i)
{
m_txpool[i] = nullptr;
}

if(m_backend->needInit())
{
m_aovr = unique_ptr<ActiveOvr>(new ActiveOvr);
Expand Down Expand Up @@ -261,6 +268,34 @@ TPIO::newTransaction()
return unique_ptr<TPIOTxSession>(new TPIOTxSession(this, move(aovr), move(lovr)));
}

void
TPIO::registerTx(TPIOTxSession* tx)
{
#ifdef PTNK_REGTX
for(size_t i = 0; i < NTXPOOL; ++ i)
{
if(!m_txpool[i] && PTNK_CAS(&m_txpool[i], 0, tx))
{
tx->m_regtxidx = i;
return;
}
}

PTNK_THROW_RUNTIME_ERR("out of session pool");
#endif
}

void
TPIO::unregisterTx(TPIOTxSession* tx)
{
#ifdef PTNK_REGTX
size_t i = tx->m_regtxidx;

PTNK_ASSERT(m_txpool[i] == tx);
m_txpool[i] = nullptr;
#endif
}

void
TPIO::syncDelayed(const Vpage_id_t& pagesModified)
{
Expand Down
9 changes: 8 additions & 1 deletion ptnk/tpio.h
Expand Up @@ -102,7 +102,7 @@ class TPIOTxSession : public PageIO

void addOvr(page_id_t pgidOrig, page_id_t pgidOvr)
{
m_lovr->addOvr(pgidOrig, pgidOvr);
m_lovr->addOvr(pgidOrig, pgidOvr);
}

void loadStreak(BufferCRef bufStreak);
Expand All @@ -121,6 +121,7 @@ class TPIOTxSession : public PageIO
PagesOldLink* m_oldlink;
Vpage_id_t m_pagesModified;
TPIOStat m_stat;
size_t m_regtxidx;
};
inline
std::ostream& operator<<(std::ostream& s, const TPIOTxSession& o)
Expand Down Expand Up @@ -193,6 +194,12 @@ class TPIO

std::mutex m_mtxRebase;
std::condition_variable m_condRebase;

static const size_t NTXPOOL = 256;
TPIOTxSession* m_txpool[NTXPOOL];
public:
void registerTx(TPIOTxSession* tx);
void unregisterTx(TPIOTxSession* tx);
};
inline
std::ostream& operator<<(std::ostream& s, const TPIO& o)
Expand Down

0 comments on commit 53ea1e5

Please sign in to comment.