From a550e112c3307e568309b2bc0c6e026494543e9b Mon Sep 17 00:00:00 2001 From: Pauli Date: Tue, 3 Jul 2018 21:15:12 +0300 Subject: [PATCH] Allow temporary transfer of main logic thread ownership Dependency to fix df-ai to work with the new CoreSuspender --- library/Core.cpp | 20 ++++++++++++++++++++ library/include/Core.h | 22 ++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/library/Core.cpp b/library/Core.cpp index 20b2565ff..2bce4869b 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -108,6 +108,26 @@ struct MainThread { }; } +CoreSuspendReleaseMain::CoreSuspendReleaseMain() +{ + MainThread::suspend().unlock(); +} + +CoreSuspendReleaseMain::~CoreSuspendReleaseMain() +{ + MainThread::suspend().lock(); +} + +CoreSuspendClaimMain::CoreSuspendClaimMain() +{ + MainThread::suspend().lock(); +} + +CoreSuspendClaimMain::~CoreSuspendClaimMain() +{ + MainThread::suspend().unlock(); +} + struct Core::Private { std::thread iothread; diff --git a/library/include/Core.h b/library/include/Core.h index f05e30f8a..dbe73621d 100644 --- a/library/include/Core.h +++ b/library/include/Core.h @@ -300,6 +300,8 @@ namespace DFHack friend class ServerConnection; friend class CoreSuspender; friend class CoreSuspenderBase; + friend struct CoreSuspendClaimMain; + friend struct CoreSuspendReleaseMain; ServerMain *server; }; @@ -412,5 +414,25 @@ namespace DFHack } }; + /*! + * Temporary release main thread ownership to allow alternative thread + * implement DF logic thread loop + */ + struct DFHACK_EXPORT CoreSuspendReleaseMain { + CoreSuspendReleaseMain(); + ~CoreSuspendReleaseMain(); + }; + + /*! + * Temporary claim main thread ownership. This allows caller to call + * Core::Update from a different thread than original DF logic thread if + * logic thread has released main thread ownership with + * CoreSuspendReleaseMain + */ + struct DFHACK_EXPORT CoreSuspendClaimMain { + CoreSuspendClaimMain(); + ~CoreSuspendClaimMain(); + }; + using CoreSuspendClaimer = CoreSuspender; }