System &sys = *nodes[index].system;
for(const System::Dependency &d: sys.get_dependencies())
if(Transactor *tract = d.get_transactor())
+ {
tract->prepare(d.get_transact_mode());
+ tract->unblock(d.get_transact_mode());
+ }
try
{
for(const System::Dependency &d: sys.get_dependencies())
if(Transactor *tract = d.get_transactor())
+ {
+ tract->block(d.get_transact_mode());
tract->commit(d.get_transact_mode());
+ }
}
} // namespace Msp::Game
virtual ~Transactor() = default;
virtual void prepare(Mode) = 0;
+#ifdef DEBUG
+ virtual void unblock(Mode) = 0;
+ virtual void block(Mode) = 0;
+#else
+ void unblock(Mode) { }
+ void block(Mode) { }
+#endif
virtual void commit(Mode) = 0;
};
BasicTransactor(Stage &s): Transactor(s) { }
void prepare(Mode) override;
+#ifdef DEBUG
+ void unblock(Mode) override;
+ void block(Mode) override;
+#endif
void commit(Mode) override;
};
template<typename T>
void BasicTransactor<T>::prepare(Mode mode)
{
+ if(mode&WRITE)
+ stage.iterate_objects<T>([](T &c){ c.prepare_tick(); });
+}
+
#ifdef DEBUG
+template<typename T>
+void BasicTransactor<T>::unblock(Mode mode)
+{
if(mode&READ)
AccessGuard::get_instance().unblock<AccessGuard::Read<typename T::Data>>();
if(mode&WRITE)
AccessGuard::get_instance().unblock<AccessGuard::Write<typename T::Data>>();
-#endif
-
- if(mode&WRITE)
- stage.iterate_objects<T>([](T &c){ c.prepare_tick(); });
}
template<typename T>
-void BasicTransactor<T>::commit(Mode mode)
+void BasicTransactor<T>::block(Mode mode)
{
- if(mode&WRITE)
- stage.iterate_objects<T>([](T &c){ c.commit_tick(); });
-
-#ifdef DEBUG
if(mode&READ)
AccessGuard::get_instance().block<AccessGuard::Read<typename T::Data>>();
if(mode&WRITE)
AccessGuard::get_instance().block<AccessGuard::Write<typename T::Data>>();
+}
#endif
+
+template<typename T>
+void BasicTransactor<T>::commit(Mode mode)
+{
+ if(mode&WRITE)
+ stage.iterate_objects<T>([](T &c){ c.commit_tick(); });
}
} // namespace Msp::Game