Precommit (#1)

* first commit

* cleanup
This commit is contained in:
tompzf
2025-11-04 13:28:06 +01:00
committed by GitHub
parent dba45dc636
commit 6ed4b1534e
898 changed files with 256340 additions and 0 deletions

View File

@@ -0,0 +1,90 @@
#include "dispatchservice.h"
#include "transaction.h"
#include "trigger.h"
#include "signal.h"
CTransaction::CTransaction(CDispatchService& rDispatchSvc) :
m_rDispatchSvc(rDispatchSvc), m_uiReadTransactionID(rDispatchSvc.GetNextTransactionID())
{}
void CTransaction::DestroyObject()
{
FinalizeWrite();
m_rDispatchSvc.FinishTransaction(this);
}
uint64_t CTransaction::GetReadTransactionID() const
{
// Set transaction to write if not done so.
if (m_eTransactionType != ETransactionType::read_transaction)
{
if (m_eTransactionType == ETransactionType::undefined)
{
m_eTransactionType = ETransactionType::read_transaction;
// Create a new direct transaction ID to prevent the current values from overwriting
m_rDispatchSvc.CreateDirectTransactionID();
}
else
return 0ull;
}
return m_uiReadTransactionID;
}
void CTransaction::DeferWrite(CSignal& rSignal, sdv::any_t& ranyVal)
{
// Set transaction to write if not done so.
if (m_eTransactionType != ETransactionType::write_transaction)
{
if (m_eTransactionType == ETransactionType::undefined)
m_eTransactionType = ETransactionType::write_transaction;
else
return;
}
// Add the value to the deferred signal map.
std::unique_lock<std::mutex> lock(m_mtxDeferredWriteSignalMap);
m_mapDeferredWriteSignalMap.insert_or_assign(&rSignal, ranyVal);
}
void CTransaction::FinalizeWrite()
{
// Set transaction to write if not done so.
if (m_eTransactionType != ETransactionType::write_transaction)
{
if (m_eTransactionType == ETransactionType::undefined)
m_eTransactionType = ETransactionType::write_transaction;
else
return;
}
// Get the next transaction ID
uint64_t uiWriteTransaction = m_rDispatchSvc.GetNextTransactionID();
// Write the signals with the transaction ID.
std::unique_lock<std::mutex> lock(m_mtxDeferredWriteSignalMap);
std::set<CTrigger*> setTriggers;
for (auto& rvtDeferredSignal : m_mapDeferredWriteSignalMap)
{
if (!rvtDeferredSignal.first) continue;
rvtDeferredSignal.first->WriteFromProvider(rvtDeferredSignal.second, uiWriteTransaction, setTriggers);
}
m_mapDeferredWriteSignalMap.clear();
lock.unlock();
// Execute the triggers
for (CTrigger* pTrigger : setTriggers)
pTrigger->Execute();
}
void CTransaction::SetIterator(std::list<CTransaction>::iterator itTransaction)
{
m_itTransaction = itTransaction;
}
std::list<CTransaction>::iterator CTransaction::GetIterator() const
{
return m_itTransaction;
}