Skip to content

Commit 6ceb420

Browse files
committed
constexpr + noexcept in tpc
+ Marked leaf classes final + const
1 parent 073cd6d commit 6ceb420

File tree

2 files changed

+62
-62
lines changed

2 files changed

+62
-62
lines changed

src/jrd/tpc.cpp

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ bool TipCache::GlobalTpcInitializer::initialize(SharedMemoryBase* sm, bool initF
6262
}
6363

6464
thread_db* tdbb = JRD_get_thread_data();
65-
Database* dbb = tdbb->getDatabase();
65+
const Database* dbb = tdbb->getDatabase();
6666

6767
// Initialize the shared data header
6868
initHeader(header);
@@ -198,18 +198,18 @@ void TipCache::finalizeTpc(thread_db* tdbb)
198198
CommitNumber TipCache::cacheState(TraNumber number)
199199
{
200200
fb_assert(m_tpcHeader);
201-
GlobalTpcHeader* header = m_tpcHeader->getHeader();
201+
const GlobalTpcHeader* header = m_tpcHeader->getHeader();
202202

203-
TraNumber oldest = header->oldest_transaction.load(std::memory_order_relaxed);
203+
const TraNumber oldest = header->oldest_transaction.load(std::memory_order_relaxed);
204204

205205
if (number < oldest)
206206
return CN_PREHISTORIC;
207207

208-
TpcBlockNumber blockNumber = number / m_transactionsPerBlock;
209-
ULONG offset = number % m_transactionsPerBlock;
208+
const TpcBlockNumber blockNumber = number / m_transactionsPerBlock;
209+
const ULONG offset = number % m_transactionsPerBlock;
210210

211211
Sync sync(&m_sync_status, FB_FUNCTION);
212-
TransactionStatusBlock* block = getTransactionStatusBlock(header, blockNumber, sync);
212+
const TransactionStatusBlock* block = getTransactionStatusBlock(header, blockNumber, sync);
213213

214214
// This should not really happen ever
215215
fb_assert(block);
@@ -281,12 +281,12 @@ void TipCache::initializeTpc(thread_db *tdbb)
281281
LCK_convert(tdbb, m_lock, LCK_SR, LCK_WAIT); // never fails
282282
}
283283

284-
void TipCache::initTransactionsPerBlock(ULONG blockSize)
284+
void TipCache::initTransactionsPerBlock(ULONG blockSize) noexcept
285285
{
286286
if (m_transactionsPerBlock)
287287
return;
288288

289-
const ULONG dataOffset = static_cast<ULONG>(offsetof(TransactionStatusBlock, data[0]));
289+
constexpr ULONG dataOffset = static_cast<ULONG>(offsetof(TransactionStatusBlock, data[0]));
290290
m_transactionsPerBlock = (blockSize - dataOffset) / sizeof(CommitNumber);
291291
}
292292

@@ -300,7 +300,7 @@ void TipCache::loadInventoryPages(thread_db* tdbb, GlobalTpcHeader* header)
300300
const TraNumber hdr_oldest = dbb->dbb_oldest_transaction;
301301
#else
302302
WIN window(HEADER_PAGE_NUMBER);
303-
const auto header_page = (Ods::header_page*) CCH_FETCH(tdbb, &window, LCK_read, pag_header);
303+
const auto* header_page = (Ods::header_page*) CCH_FETCH(tdbb, &window, LCK_read, pag_header);
304304
const TraNumber hdr_next_transaction = header_page->hdr_next_transaction;
305305
const TraNumber hdr_oldest_transaction = header_page->hdr_oldest_transaction;
306306
const AttNumber hdr_attachment_id = header_page->hdr_attachment_id;
@@ -319,7 +319,7 @@ void TipCache::loadInventoryPages(thread_db* tdbb, GlobalTpcHeader* header)
319319

320320
// Round down the oldest to a multiple of four, which puts the
321321
// transaction in temporary buffer on a byte boundary
322-
TraNumber base = hdr_oldest_transaction & ~TRA_MASK;
322+
const TraNumber base = hdr_oldest_transaction & ~TRA_MASK;
323323

324324
const FB_SIZE_T buffer_length = (hdr_next_transaction + 1 - base + TRA_MASK) / 4;
325325
Array<UCHAR> transactions(buffer_length);
@@ -337,8 +337,8 @@ void TipCache::loadInventoryPages(thread_db* tdbb, GlobalTpcHeader* header)
337337

338338
for (TraNumber t = hdr_oldest_transaction; ; )
339339
{
340-
int state = TRA_state(buffer, base, t);
341-
CommitNumber cn = init_state_mapping[state];
340+
const int state = TRA_state(buffer, base, t);
341+
const CommitNumber cn = init_state_mapping[state];
342342

343343
// Barrier is not needed as our thread is the only one here.
344344
// At the same time, simple write to a volatile variable is not good
@@ -357,7 +357,7 @@ void TipCache::loadInventoryPages(thread_db* tdbb, GlobalTpcHeader* header)
357357
}
358358
}
359359

360-
void TipCache::mapInventoryPages(GlobalTpcHeader* header)
360+
void TipCache::mapInventoryPages(const GlobalTpcHeader* header)
361361
{
362362
TpcBlockNumber blockNumber = header->oldest_transaction / m_transactionsPerBlock;
363363
const TpcBlockNumber lastNumber = header->latest_transaction_id / m_transactionsPerBlock;
@@ -443,13 +443,13 @@ void TipCache::StatusBlockData::clear(thread_db* tdbb)
443443
oldest = cache->m_tpcHeader->getHeader()->oldest_transaction.load(std::memory_order_relaxed);
444444
else
445445
{
446-
Database* dbb = tdbb->getDatabase();
446+
const Database* dbb = tdbb->getDatabase();
447447
if (dbb->dbb_flags & DBB_shared)
448448
oldest = dbb->dbb_oldest_transaction;
449449
else
450450
{
451451
WIN window(HEADER_PAGE_NUMBER);
452-
const auto header_page = (Ods::header_page*) CCH_FETCH(tdbb, &window, LCK_read, pag_header);
452+
const auto* header_page = (Ods::header_page*) CCH_FETCH(tdbb, &window, LCK_read, pag_header);
453453
oldest = header_page->hdr_oldest_transaction;
454454
CCH_RELEASE(tdbb, &window);
455455
}
@@ -500,7 +500,7 @@ TipCache::TransactionStatusBlock* TipCache::createTransactionStatusBlock(ULONG b
500500
return blockData->memory->getHeader();
501501
}
502502

503-
TipCache::TransactionStatusBlock* TipCache::getTransactionStatusBlock(GlobalTpcHeader* header, TpcBlockNumber blockNumber, Sync& sync)
503+
TipCache::TransactionStatusBlock* TipCache::getTransactionStatusBlock(const GlobalTpcHeader* header, TpcBlockNumber blockNumber, Sync& sync)
504504
{
505505
fb_assert(sync.getState() == SYNC_NONE);
506506

@@ -524,7 +524,7 @@ TipCache::TransactionStatusBlock* TipCache::getTransactionStatusBlock(GlobalTpcH
524524
else
525525
{
526526
// Check if block might be too old to be created.
527-
TraNumber oldest = header->oldest_transaction.load(std::memory_order_relaxed);
527+
const TraNumber oldest = header->oldest_transaction.load(std::memory_order_relaxed);
528528
if (blockNumber >= oldest / m_transactionsPerBlock)
529529
block = createTransactionStatusBlock(header->tpc_block_size, blockNumber);
530530
else
@@ -538,7 +538,7 @@ TraNumber TipCache::findStates(TraNumber minNumber, TraNumber maxNumber, ULONG m
538538
{
539539
// Can only be called on initialized TipCache
540540
fb_assert(m_tpcHeader);
541-
GlobalTpcHeader* header = m_tpcHeader->getHeader();
541+
const GlobalTpcHeader* header = m_tpcHeader->getHeader();
542542

543543
TransactionStatusBlock* statusBlock = nullptr;
544544
ULONG transOffset = 0;
@@ -574,7 +574,7 @@ TraNumber TipCache::findStates(TraNumber minNumber, TraNumber maxNumber, ULONG m
574574
// Such transaction shall already be considered active by our caller.
575575
// TODO: check if this assumption is indeed correct.
576576

577-
CommitNumber cn = (statusBlock->data + transOffset)->load(std::memory_order_relaxed);
577+
const CommitNumber cn = (statusBlock->data + transOffset)->load(std::memory_order_relaxed);
578578
switch (cn)
579579
{
580580
case CN_ACTIVE:
@@ -590,7 +590,8 @@ TraNumber TipCache::findStates(TraNumber minNumber, TraNumber maxNumber, ULONG m
590590
break;
591591

592592
case CN_MAX_NUMBER:
593-
fb_assert(false); // fall thru
593+
fb_assert(false);
594+
[[fallthrough]];
594595

595596
default:
596597
state = tra_committed;
@@ -610,7 +611,7 @@ CommitNumber TipCache::setState(TraNumber number, int state)
610611
fb_assert(m_tpcHeader);
611612
GlobalTpcHeader* header = m_tpcHeader->getHeader();
612613

613-
TpcBlockNumber blockNumber = number / m_transactionsPerBlock;
614+
const TpcBlockNumber blockNumber = number / m_transactionsPerBlock;
614615
ULONG offset = number % m_transactionsPerBlock;
615616

616617
Sync sync(&m_sync_status, FB_FUNCTION);
@@ -621,7 +622,7 @@ CommitNumber TipCache::setState(TraNumber number, int state)
621622
ERR_bugcheck_msg("TPC: Attempt to change state of old transaction");
622623

623624
std::atomic<CommitNumber>* statePtr = block->data + offset;
624-
CommitNumber oldStateCn = statePtr->load(std::memory_order_relaxed);
625+
const CommitNumber oldStateCn = statePtr->load(std::memory_order_relaxed);
625626
switch (state)
626627
{
627628
case tra_committed:
@@ -702,7 +703,7 @@ CommitNumber TipCache::snapshotState(thread_db* tdbb, TraNumber number)
702703
return CN_ACTIVE;
703704

704705
// Go to disk, and obtain state of our transaction from TIP
705-
int state = TRA_fetch_state(tdbb, number);
706+
const int state = TRA_fetch_state(tdbb, number);
706707

707708
// We already know for sure that this transaction cannot be active, so mark it dead now
708709
// to avoid more work in the future
@@ -724,8 +725,8 @@ void TipCache::updateOldestTransaction(thread_db *tdbb, TraNumber oldest, TraNum
724725
fb_assert(m_tpcHeader);
725726
GlobalTpcHeader* header = m_tpcHeader->getHeader();
726727

727-
TraNumber oldestNew = MIN(oldest, oldestSnapshot);
728-
TraNumber oldestNow = header->oldest_transaction.load(std::memory_order_relaxed);
728+
const TraNumber oldestNew = MIN(oldest, oldestSnapshot);
729+
const TraNumber oldestNow = header->oldest_transaction.load(std::memory_order_relaxed);
729730
if (oldestNew > oldestNow)
730731
{
731732
header->oldest_transaction.store(oldestNew, std::memory_order_relaxed);
@@ -747,7 +748,7 @@ int TipCache::tpc_block_blocking_ast(void* arg)
747748
return 0;
748749

749750
TipCache* cache = data->cache;
750-
TraNumber oldest =
751+
const TraNumber oldest =
751752
cache->m_tpcHeader->getHeader()->oldest_transaction.load(std::memory_order_relaxed);
752753

753754
// Is data block really old?
@@ -775,7 +776,7 @@ void TipCache::releaseSharedMemory(thread_db* tdbb, TraNumber oldest_old, TraNum
775776
{
776777
Database* dbb = tdbb->getDatabase();
777778

778-
TpcBlockNumber lastInterestingBlockNumber = oldest_new / m_transactionsPerBlock;
779+
const TpcBlockNumber lastInterestingBlockNumber = oldest_new / m_transactionsPerBlock;
779780

780781
// If we didn't cross block boundary - there is nothing to do.
781782
// Note that due to the fuzziness of our caller's memory access to variables
@@ -787,13 +788,12 @@ void TipCache::releaseSharedMemory(thread_db* tdbb, TraNumber oldest_old, TraNum
787788
// Populate array of blocks that might be unmapped and deleted.
788789
// We scan for blocks to clean up in descending order, but delete them in
789790
// ascending order to ensure for robust operation.
790-
PathName fileName;
791791
HalfStaticArray<TpcBlockNumber, 16> blocksToCleanup;
792792

793793
for (TpcBlockNumber cleanupCounter = lastInterestingBlockNumber - SAFETY_GAP_BLOCKS;
794794
cleanupCounter; cleanupCounter--)
795795
{
796-
TpcBlockNumber blockNumber = cleanupCounter - 1;
796+
const TpcBlockNumber blockNumber = cleanupCounter - 1;
797797
PathName fileName = StatusBlockData::makeSharedMemoryFileName(dbb, blockNumber, true);
798798

799799
struct stat st;
@@ -810,7 +810,7 @@ void TipCache::releaseSharedMemory(thread_db* tdbb, TraNumber oldest_old, TraNum
810810
SyncLockGuard sync(&m_sync_status, SYNC_EXCLUSIVE, FB_FUNCTION);
811811
while (blocksToCleanup.hasData())
812812
{
813-
TpcBlockNumber blockNumber = blocksToCleanup.pop();
813+
const TpcBlockNumber blockNumber = blocksToCleanup.pop();
814814

815815
if (m_blocks_memory.locate(blockNumber))
816816
{
@@ -845,7 +845,7 @@ SnapshotHandle TipCache::allocateSnapshotSlot()
845845
// Scan previously used slots first
846846
SnapshotHandle slotNumber;
847847

848-
ULONG slots_used = snapshots->slots_used.load(std::memory_order_relaxed);
848+
const ULONG slots_used = snapshots->slots_used.load(std::memory_order_relaxed);
849849
for (slotNumber = snapshots->min_free_slot; slotNumber < slots_used; slotNumber++)
850850
{
851851
if (!snapshots->slots[slotNumber].attachment_id.load(std::memory_order_relaxed))
@@ -890,7 +890,7 @@ void TipCache::remapSnapshots(bool sync)
890890
// Can only be called on initialized TipCache
891891
fb_assert(m_tpcHeader);
892892

893-
SnapshotList* snapshots = m_snapshots->getHeader();
893+
const SnapshotList* snapshots = m_snapshots->getHeader();
894894

895895
if (snapshots->slots_allocated.load(std::memory_order_acquire) !=
896896
(m_snapshots->sh_mem_length_mapped - offsetof(SnapshotList, slots[0])) / sizeof(SnapshotData))
@@ -916,7 +916,7 @@ SnapshotHandle TipCache::beginSnapshot(thread_db* tdbb, AttNumber attachmentId,
916916
{
917917
// Can only be called on initialized TipCache
918918
fb_assert(m_tpcHeader);
919-
GlobalTpcHeader* header = m_tpcHeader->getHeader();
919+
const GlobalTpcHeader* header = m_tpcHeader->getHeader();
920920

921921
fb_assert(attachmentId);
922922

@@ -930,7 +930,7 @@ SnapshotHandle TipCache::beginSnapshot(thread_db* tdbb, AttNumber attachmentId,
930930

931931
if (commitNumber != 0)
932932
{
933-
ULONG slotsUsed = snapshots->slots_used.load(std::memory_order_relaxed);
933+
const ULONG slotsUsed = snapshots->slots_used.load(std::memory_order_relaxed);
934934
bool found = false;
935935

936936
for (SnapshotHandle slotNumber = 0; slotNumber < slotsUsed; ++slotNumber)
@@ -1010,8 +1010,8 @@ void TipCache::endSnapshot(thread_db* tdbb, SnapshotHandle handle, AttNumber att
10101010
// deallocation.
10111011

10121012
// Perform some sanity checks on a handle
1013-
SnapshotList* snapshots = m_snapshots->getHeader();
1014-
SnapshotData* slot = snapshots->slots + handle;
1013+
const SnapshotList* snapshots = m_snapshots->getHeader();
1014+
const SnapshotData* slot = snapshots->slots + handle;
10151015

10161016
if (handle >= snapshots->slots_used.load(std::memory_order_relaxed))
10171017
ERR_bugcheck_msg("Incorrect snapshot deallocation - too few slots");
@@ -1030,7 +1030,7 @@ void TipCache::updateActiveSnapshots(thread_db* tdbb, ActiveSnapshots* activeSna
10301030
{
10311031
// Can only be called on initialized TipCache
10321032
fb_assert(m_tpcHeader);
1033-
GlobalTpcHeader* header = m_tpcHeader->getHeader();
1033+
const GlobalTpcHeader* header = m_tpcHeader->getHeader();
10341034

10351035
fb_assert(activeSnapshots);
10361036

@@ -1048,7 +1048,7 @@ void TipCache::updateActiveSnapshots(thread_db* tdbb, ActiveSnapshots* activeSna
10481048
// If new slots are allocated past this value - we don't care as we preserved
10491049
// lastCommit and new snapshots will have numbers >= lastCommit and we don't
10501050
// GC them anyways
1051-
ULONG slots_used_org = snapshots->slots_used.load(std::memory_order_acquire);
1051+
const ULONG slots_used_org = snapshots->slots_used.load(std::memory_order_acquire);
10521052

10531053
// Remap snapshot list if it has been grown by someone else
10541054
remapSnapshots(true);
@@ -1063,8 +1063,8 @@ void TipCache::updateActiveSnapshots(thread_db* tdbb, ActiveSnapshots* activeSna
10631063
activeSnapshots->m_snapshots.clear();
10641064
for (ULONG slotNumber = 0; slotNumber < slots_used_org; slotNumber++)
10651065
{
1066-
SnapshotData* slot = snapshots->slots + slotNumber;
1067-
AttNumber slot_attachment_id = slot->attachment_id.load(std::memory_order_acquire);
1066+
const SnapshotData* slot = snapshots->slots + slotNumber;
1067+
const AttNumber slot_attachment_id = slot->attachment_id.load(std::memory_order_acquire);
10681068
if (slot_attachment_id)
10691069
{
10701070
bool isAttachmentDead;
@@ -1085,7 +1085,7 @@ void TipCache::updateActiveSnapshots(thread_db* tdbb, ActiveSnapshots* activeSna
10851085
guard.lock();
10861086

10871087
// Check if slot was reused while we waited for the mutex
1088-
AttNumber slot_attachment_id2 = slot->attachment_id.load(std::memory_order_acquire);
1088+
const AttNumber slot_attachment_id2 = slot->attachment_id.load(std::memory_order_acquire);
10891089
if (slot_attachment_id != slot_attachment_id2)
10901090
{
10911091
slotNumber--;
@@ -1097,7 +1097,7 @@ void TipCache::updateActiveSnapshots(thread_db* tdbb, ActiveSnapshots* activeSna
10971097
}
10981098
else
10991099
{
1100-
CommitNumber slot_snapshot = slot->snapshot.load(std::memory_order_acquire);
1100+
const CommitNumber slot_snapshot = slot->snapshot.load(std::memory_order_acquire);
11011101
if (slot_snapshot)
11021102
activeSnapshots->m_snapshots.set(slot_snapshot);
11031103
}
@@ -1118,7 +1118,7 @@ void TipCache::updateActiveSnapshots(thread_db* tdbb, ActiveSnapshots* activeSna
11181118

11191119
activeSnapshots->m_lastCommit = header->latest_commit_number.load(std::memory_order_acquire);
11201120
ULONG slots_used_org = snapshots->slots_used.load(std::memory_order_acquire);
1121-
ULONG release_count = header->snapshot_release_count.load(std::memory_order_relaxed);
1121+
const ULONG release_count = header->snapshot_release_count.load(std::memory_order_relaxed);
11221122

11231123
// If no snapshots were released since we were last called - do nothing
11241124
// Do not care about race issues here, because worst-case consequences are benign
@@ -1144,7 +1144,7 @@ void TipCache::updateActiveSnapshots(thread_db* tdbb, ActiveSnapshots* activeSna
11441144
{
11451145
if (slot->attachment_id.load(std::memory_order_acquire))
11461146
{
1147-
CommitNumber slot_snapshot = slot->snapshot.load(std::memory_order_acquire);
1147+
const CommitNumber slot_snapshot = slot->snapshot.load(std::memory_order_acquire);
11481148
if (slot_snapshot)
11491149
activeSnapshots->m_snapshots.set(slot_snapshot);
11501150
}
@@ -1206,7 +1206,7 @@ AttNumber TipCache::getLatestAttachmentId() const
12061206
{
12071207
// Can only be called on initialized TipCache
12081208
fb_assert(m_tpcHeader);
1209-
GlobalTpcHeader* header = m_tpcHeader->getHeader();
1209+
const GlobalTpcHeader* header = m_tpcHeader->getHeader();
12101210

12111211
return header->latest_attachment_id;
12121212
}
@@ -1215,7 +1215,7 @@ StmtNumber TipCache::getLatestStatementId() const
12151215
{
12161216
// Can only be called on initialized TipCache
12171217
fb_assert(m_tpcHeader);
1218-
GlobalTpcHeader* header = m_tpcHeader->getHeader();
1218+
const GlobalTpcHeader* header = m_tpcHeader->getHeader();
12191219

12201220
return header->latest_statement_id;
12211221
}
@@ -1229,7 +1229,7 @@ int TPC_snapshot_state(thread_db* tdbb, TraNumber number)
12291229
if (!cache)
12301230
return TRA_fetch_state(tdbb, number);
12311231

1232-
CommitNumber stateCn = cache->snapshotState(tdbb, number);
1232+
const CommitNumber stateCn = cache->snapshotState(tdbb, number);
12331233
switch (stateCn)
12341234
{
12351235
case CN_ACTIVE:

0 commit comments

Comments
 (0)