From d51adafafd6d043c570ff9769e21cbdc56db4b90 Mon Sep 17 00:00:00 2001 From: Gene Cooperman Date: Sun, 14 Apr 2024 18:23:18 -0400 Subject: [PATCH 1/2] Remove MCDeferred: MCStack *programState * This used to be: MCDeferred programState; * MCDeferred is not used anywhere else. (A comment there was: "This clever workaround ..." But as others say: "Beware of clever code.") --- include/mcmini/MCDeferred.h | 46 --------------------------------- include/mcmini/mcmini_private.h | 4 +-- src/mcmini_private.cpp | 8 +++--- 3 files changed, 6 insertions(+), 52 deletions(-) delete mode 100644 include/mcmini/MCDeferred.h diff --git a/include/mcmini/MCDeferred.h b/include/mcmini/MCDeferred.h deleted file mode 100644 index 07998b1c..00000000 --- a/include/mcmini/MCDeferred.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef MC_MCDEFERRED_H -#define MC_MCDEFERRED_H - -#include - -// Solves static initialization fiasco in dynamic libraries -// C++ seems to invoke the constructor of a globally-defined -// object AFTER exiting a dynamic library's constructor. This is -// a problem as we only expect a global object to be constructed once -// (once in the constructor). This clever workaround helps resolve -// this issue by wrapping the underlying object in a union -template -struct MCDeferred { - MCDeferred() {} - ~MCDeferred() - { - if (value) { value->~T(); } - } - template - void - Construct(TArgs &&...args) - { - value = new T(std::forward(args)...); - } - - union { - T *value; - }; - -public: - - T * - get() - { - return value; - } - - /* Conveniently access the underlying value */ - T * - operator->() - { - return value; - } -}; - -#endif // MC_MCDEFERRED_H diff --git a/include/mcmini/mcmini_private.h b/include/mcmini/mcmini_private.h index 197eb30a..14190015 100644 --- a/include/mcmini/mcmini_private.h +++ b/include/mcmini/mcmini_private.h @@ -1,8 +1,6 @@ #ifndef INCLUDE_MCMINI_MCMINI_PRIVATE_HPP #define INCLUDE_MCMINI_MCMINI_PRIVATE_HPP -#include "mcmini/config.h" -#include "mcmini/MCDeferred.h" #include "mcmini/MCShared.h" #include "mcmini/MCSharedTransition.h" #include "mcmini/MCStack.h" @@ -200,7 +198,7 @@ void mc_initialize_shared_memory_globals(); * point in time. As a trace process evolves and executes more * transitions, the state is updated to reflect this fact. */ -extern MCDeferred programState; +extern MCStack *programState; /** * @brief Initialize the global program state object `programState` diff --git a/src/mcmini_private.cpp b/src/mcmini_private.cpp index 20dfabaf..b7c9af7f 100644 --- a/src/mcmini_private.cpp +++ b/src/mcmini_private.cpp @@ -106,7 +106,7 @@ const size_t shmAllocationSize = (sizeof(*shmTransitionTypeInfo) + MAX_SHARED_MEMORY_ALLOCATION); /* Program state */ -MCDeferred programState; +MCStack *programState; void alarm_handler(int sig) @@ -161,8 +161,10 @@ mcmini_main() void mc_create_global_state_object() { - auto config = get_config_for_execution_environment(); - programState.Construct(config); + MCStackConfiguration config = get_config_for_execution_environment(); + // FIXME: MCStack is supposed to be a singleton class. + // So, change programState to type MCStack, and make it singleton + programState = new MCStack(config); programState->registerVisibleOperationType(typeid(MCThreadStart), &MCReadThreadStart); programState->registerVisibleOperationType(typeid(MCThreadCreate), From e27694691f3dad8c3737bb4581b1c275130de11a Mon Sep 17 00:00:00 2001 From: Gene Cooperman Date: Tue, 16 Apr 2024 21:12:32 -0400 Subject: [PATCH 2/2] Remove '#include "MCOptional.h"' from MCMutex.h --- include/mcmini/objects/MCMutex.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/mcmini/objects/MCMutex.h b/include/mcmini/objects/MCMutex.h index bb5610ca..f6027ef1 100644 --- a/include/mcmini/objects/MCMutex.h +++ b/include/mcmini/objects/MCMutex.h @@ -1,7 +1,6 @@ #ifndef INCLUDE_MCMINI_OBJECTS_MCMUTEX_HPP #define INCLUDE_MCMINI_OBJECTS_MCMUTEX_HPP -#include "mcmini/misc/MCOptional.h" #include "mcmini/objects/MCVisibleObject.h" struct MCMutexShadow {