%% options copyright owner = Dirk Krause copyright year = 2018-xxxx SPDX-License-Identifier: BSD-3-Clause %% header /** @file Dk4WxProcessingController.h Processing controller to skip concurrent execution of code accessing the same variables. @code class AnyClass { protected: Dk4WxProcessingController procon; ... }; AnyClass::SomeMethod(void) { if (procon.CanEnterCriticalSection()) { ... Yes, we are allowed to execute code accessing variable ... ... ... Notify the controller that we are done ... procon.LeaveCriticalSection(); } else { ... No, we are not allowed to access the variables ... } } @endcode */ #ifndef DK4CONF_H_INCLUDED #include #endif #include #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include #endif #ifndef WX_THREAD_H_INCLUDED #include #define WX_THREAD_H_INCLUDED 1 #endif /** Protect code from concurrent execution, mainly for timer handlers. In contrast to a critical section which delays execution of code to avoid concurrent access to data this class skips the execution of concurrent code. */ class Dk4WxProcessingController { protected: /** Critical section to protect the "in use" flag. */ wxCriticalSection csProtect; /** Flag to mark section as currently in use. */ bool bInUse; public: /** Constructor */ Dk4WxProcessingController(void); /** Check whether the critical code section can be entered. @return True if the section can be entered, false otherwise. If the method returns true, the bInUse flag is set, you must call LeaveCriticalSection() to reset it. */ bool CanEnterCriticalSection(void); /** LeaveCriticalSection the critical section. */ void LeaveCriticalSection(void); }; /* vim: set ai sw=4 ts=4 : */ %% module #ifndef DK4CONF_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4conf.h" #else #include #endif #endif #ifndef DK4WXCRITICALSECTION_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "Dk4WxProcessingController.h" #else #include #endif #endif Dk4WxProcessingController::Dk4WxProcessingController(void) { bInUse = false; } bool Dk4WxProcessingController::CanEnterCriticalSection(void) { bool back = false; { wxCriticalSectionLocker lock(csProtect); if (!(bInUse)) { bInUse = true; back = true; } } return back; } void Dk4WxProcessingController::LeaveCriticalSection(void) { wxCriticalSectionLocker lock(csProtect); bInUse = false; } /* vim: set ai sw=4 ts=4 : */