MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / findStates

Method findStates

src/jrd/tpc.cpp:537–605  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

535}
536
537TraNumber TipCache::findStates(TraNumber minNumber, TraNumber maxNumber, ULONG mask, int& state)
538{
539 // Can only be called on initialized TipCache
540 fb_assert(m_tpcHeader);
541 GlobalTpcHeader* header = m_tpcHeader->getHeader();
542
543 TransactionStatusBlock* statusBlock = nullptr;
544 ULONG transOffset = 0;
545
546 Sync sync(&m_sync_status, FB_FUNCTION);
547 for (TraNumber tran = minNumber; ; tran++, transOffset++)
548 {
549 if (transOffset == m_transactionsPerBlock)
550 {
551 sync.unlock();
552 statusBlock = nullptr;
553 }
554
555 while (!statusBlock)
556 {
557 const TraNumber oldest = header->oldest_transaction.load(std::memory_order_relaxed);
558
559 if (tran < oldest)
560 tran = oldest;
561
562 const TpcBlockNumber blockNumber = tran / m_transactionsPerBlock;
563 transOffset = tran % m_transactionsPerBlock;
564 statusBlock = getTransactionStatusBlock(header, blockNumber, sync);
565
566 if (sync.getState() == SYNC_EXCLUSIVE)
567 sync.downgrade(SYNC_SHARED);
568 }
569
570 if (tran >= maxNumber)
571 break;
572
573 // Barrier is not needed here. Slightly out-dated information shall be ok here.
574 // Such transaction shall already be considered active by our caller.
575 // TODO: check if this assumption is indeed correct.
576
577 CommitNumber cn = (statusBlock->data + transOffset)->load(std::memory_order_relaxed);
578 switch (cn)
579 {
580 case CN_ACTIVE:
581 state = tra_active;
582 break;
583
584 case CN_LIMBO:
585 state = tra_limbo;
586 break;
587
588 case CN_DEAD:
589 state = tra_dead;
590 break;
591
592 case CN_MAX_NUMBER:
593 fb_assert(false); // fall thru
594

Callers 1

TPC_find_statesFunction · 0.80

Calls 5

getHeaderMethod · 0.45
unlockMethod · 0.45
loadMethod · 0.45
getStateMethod · 0.45
downgradeMethod · 0.45

Tested by

no test coverage detected