From c4e60d9f9ad3ffcd06678889d925ae62fe2340c9 Mon Sep 17 00:00:00 2001 From: jmpenn Date: Thu, 28 Mar 2024 15:15:19 -0500 Subject: [PATCH 01/52] Proposed fix for deadlock on shutdown (#1673) * Proposed fix for deadlock on shutdown * Terminate C style comment. * Added needed libs for applicable tests and updated the logic for when allowing/disallowing connections. * Need to load additional trick libs for applicable tests for Linux. --------- Co-authored-by: Hong Chen --- include/trick/VariableServer.hh | 2 + include/trick/VariableServerListenThread.hh | 8 ++- trick_source/sim_services/Clock/test/Makefile | 4 +- .../CommandLineArguments/test/Makefile | 2 +- .../Executive/Executive_shutdown.cpp | 5 ++ .../sim_services/Executive/test/Makefile | 2 +- .../sim_services/Integrator/test/Makefile | 2 +- .../sim_services/MemoryManager/test/Makefile | 2 +- .../ScheduledJobQueue/test/Makefile | 2 +- trick_source/sim_services/Timer/test/Makefile | 2 +- .../VariableServer/VariableServer.cpp | 4 ++ .../VariableServerListenThread.cpp | 52 ++++++++++++++----- 12 files changed, 65 insertions(+), 22 deletions(-) diff --git a/include/trick/VariableServer.hh b/include/trick/VariableServer.hh index 3f84d685..1705ece8 100644 --- a/include/trick/VariableServer.hh +++ b/include/trick/VariableServer.hh @@ -66,6 +66,8 @@ namespace Trick { */ int freeze_init() ; + void shutdownConnections(); + /** @brief Shutdown the variable server @return always 0 diff --git a/include/trick/VariableServerListenThread.hh b/include/trick/VariableServerListenThread.hh index 3f4f6d26..a3da9bce 100644 --- a/include/trick/VariableServerListenThread.hh +++ b/include/trick/VariableServerListenThread.hh @@ -58,6 +58,8 @@ namespace Trick { virtual void dump( std::ostream & oss = std::cout ) ; + void shutdownConnections(); + protected: void initializeMulticast(); @@ -82,9 +84,13 @@ namespace Trick { /* Multicast broadcaster */ MulticastGroup * _multicast; /**< trick_io(**) trick_units(--) */ + bool allowConnections; /**< trick_io(**) trick_units(--) */ + unsigned int pendingConnections; /**< trick_io(**) trick_units(--) */ + pthread_mutex_t connectionMutex; /**< trick_io(**) trick_units(--) */ + pthread_cond_t noPendingConnections_cv; /**< trick_io(**) trick_units(--) */ + } ; } #endif - diff --git a/trick_source/sim_services/Clock/test/Makefile b/trick_source/sim_services/Clock/test/Makefile index fe58b277..674b6f86 100644 --- a/trick_source/sim_services/Clock/test/Makefile +++ b/trick_source/sim_services/Clock/test/Makefile @@ -9,7 +9,7 @@ include $(dir $(lastword $(MAKEFILE_LIST)))../../../../share/trick/makefiles/Mak # Flags passed to the preprocessor. TRICK_CPPFLAGS += -I$(GTEST_HOME)/include -I$(TRICK_HOME)/include -g -Wall -Wextra ${TRICK_SYSTEM_CXXFLAGS} ${TRICK_TEST_FLAGS} - +TRICK_LIBS = -L${TRICK_LIB_DIR} -ltrick -ltrick_units -ltrick_mm -ltrick_pyip -ltrick_connection_handlers -ltrick_comm LIBS = -L${GTEST_HOME}/lib64 -L${GTEST_HOME}/lib -lgtest -lgtest_main @@ -41,7 +41,7 @@ GetTimeOfDayClock_test.o : GetTimeOfDayClock_test.cpp $(TRICK_CXX) $(TRICK_CPPFLAGS) -c $< GetTimeOfDayClock_test : ${GETTIMEOFDAY_CLOCK_OBJECTS} - $(TRICK_CXX) $(TRICK_SYSTEM_LDFLAGS) $(TRICK_CPPFLAGS) -o $@ $^ ${LIBS} + $(TRICK_CXX) $(TRICK_SYSTEM_LDFLAGS) $(TRICK_CPPFLAGS) -o $@ $^ $(TRICK_LIBS) ${LIBS} exec_get_rt_nap_stub.o : exec_get_rt_nap_stub.cpp $(TRICK_CXX) $(TRICK_CPPFLAGS) -c $< diff --git a/trick_source/sim_services/CommandLineArguments/test/Makefile b/trick_source/sim_services/CommandLineArguments/test/Makefile index acdf1ccb..fc802211 100644 --- a/trick_source/sim_services/CommandLineArguments/test/Makefile +++ b/trick_source/sim_services/CommandLineArguments/test/Makefile @@ -17,7 +17,7 @@ TRICK_CXXFLAGS += -I$(GTEST_HOME)/include -I$(TRICK_HOME)/include -g -Wall -Wext MM_OBJECTS = $(TRICK_HOME)/trick_source/sim_services/MemoryManager/object_${TRICK_HOST_CPU}/extract_bitfield.o \ $(TRICK_HOME)/trick_source/sim_services/MemoryManager/object_${TRICK_HOST_CPU}/extract_unsigned_bitfield.o -TRICK_LIBS = -L${TRICK_LIB_DIR} -ltrick_mm -ltrick_units -ltrick -ltrick_mm -ltrick_units -ltrick +TRICK_LIBS = -L${TRICK_LIB_DIR} -ltrick_mm -ltrick_units -ltrick -ltrick_mm -ltrick_units -ltrick -ltrick_pyip -ltrick_connection_handlers -ltrick_comm -ltrick_mm -ltrick_units -ltrick TRICK_EXEC_LINK_LIBS += -L${GTEST_HOME}/lib64 -L${GTEST_HOME}/lib -lgtest -lgtest_main -lpthread diff --git a/trick_source/sim_services/Executive/Executive_shutdown.cpp b/trick_source/sim_services/Executive/Executive_shutdown.cpp index 1ba3ff42..94fcdbf6 100644 --- a/trick_source/sim_services/Executive/Executive_shutdown.cpp +++ b/trick_source/sim_services/Executive/Executive_shutdown.cpp @@ -19,6 +19,8 @@ #include "trick/message_type.h" #include "trick/release.h" #include "trick/SysThread.hh" +#include "trick/VariableServer.hh" +extern Trick::VariableServer * the_vs ; /** @design @@ -62,6 +64,9 @@ int Trick::Executive::shutdown() { } } + /* Stop new connections to the Variable Server. */ + the_vs->shutdownConnections(); + try { /* Call the shutdown jobs. */ diff --git a/trick_source/sim_services/Executive/test/Makefile b/trick_source/sim_services/Executive/test/Makefile index 0e07f746..64a48295 100644 --- a/trick_source/sim_services/Executive/test/Makefile +++ b/trick_source/sim_services/Executive/test/Makefile @@ -12,7 +12,7 @@ COVERAGE_FLAGS += -fprofile-arcs -ftest-coverage -O0 # Flags passed to the preprocessor. TRICK_CPPFLAGS += -I$(GTEST_HOME)/include -I$(TRICK_HOME)/include -g -Wall -Wextra ${TRICK_SYSTEM_CXXFLAGS} ${TRICK_TEST_FLAGS} -TRICK_LIBS = -L ${TRICK_LIB_DIR} -ltrick_mm -ltrick_units -ltrick +TRICK_LIBS = -L ${TRICK_LIB_DIR} -ltrick_mm -ltrick_units -ltrick -ltrick_pyip -ltrick_connection_handlers -ltrick_comm TRICK_EXEC_LINK_LIBS += -L${GTEST_HOME}/lib64 -L${GTEST_HOME}/lib -lgtest -lgtest_main TRICK_SYSTEM_LDFLAGS += ${COVERAGE_FLAGS} diff --git a/trick_source/sim_services/Integrator/test/Makefile b/trick_source/sim_services/Integrator/test/Makefile index 1c599bd6..c3f1c2ae 100644 --- a/trick_source/sim_services/Integrator/test/Makefile +++ b/trick_source/sim_services/Integrator/test/Makefile @@ -10,7 +10,7 @@ include $(dir $(lastword $(MAKEFILE_LIST)))../../../../share/trick/makefiles/Mak # Flags passed to the preprocessor. TRICK_CPPFLAGS += -I$(GTEST_HOME)/include -I$(TRICK_HOME)/include -I${TRICK_HOME}/trick_source -I${TRICK_HOME}/include/trick/compat -g -Wall -Wextra -DUSE_ER7_UTILS_INTEGRATORS=1 -DTEST ${TRICK_SYSTEM_CXXFLAGS} ${TRICK_TEST_FLAGS} -TRICK_LIBS = -L${TRICK_LIB_DIR} -ltrick -ltrick_mm -ltrick_units -ltrick -ltrick_mm +TRICK_LIBS = -L${TRICK_LIB_DIR} -ltrick -ltrick_mm -ltrick_units -ltrick_mm -ltrick_pyip -ltrick_connection_handlers -ltrick_comm -ltrick_mm -ltrick_units -ltrick TRICK_EXEC_LINK_LIBS += -L${GTEST_HOME}/lib64 -L${GTEST_HOME}/lib -lgtest -lgtest_main # All tests produced by this Makefile. Remember to add new tests you diff --git a/trick_source/sim_services/MemoryManager/test/Makefile b/trick_source/sim_services/MemoryManager/test/Makefile index 77b50bf8..2ad54a15 100644 --- a/trick_source/sim_services/MemoryManager/test/Makefile +++ b/trick_source/sim_services/MemoryManager/test/Makefile @@ -14,7 +14,7 @@ TRICK_SYSTEM_LDFLAGS += ${COVERAGE_FLAGS} # Flags passed to the preprocessor. TRICK_CPPFLAGS += -I$(GTEST_HOME)/include -I$(TRICK_HOME)/include -g -Wall -Wextra -Wno-sign-compare ${COVERAGE_FLAGS} ${TRICK_SYSTEM_CXXFLAGS} ${TRICK_TEST_FLAGS} -TRICK_LIBS = -L${TRICK_LIB_DIR} -ltrick_mm -ltrick_units -ltrick -ltrick_mm -ltrick_units -ltrick +TRICK_LIBS = -L${TRICK_LIB_DIR} -ltrick_mm -ltrick_units -ltrick -ltrick_mm -ltrick_units -ltrick -ltrick_connection_handlers -ltrick_pyip -ltrick -ltrick_comm TRICK_EXEC_LINK_LIBS += -L${GTEST_HOME}/lib64 -L${GTEST_HOME}/lib -lgtest -lgtest_main -lpthread # ================================================================================== diff --git a/trick_source/sim_services/ScheduledJobQueue/test/Makefile b/trick_source/sim_services/ScheduledJobQueue/test/Makefile index 274a9097..642f039d 100644 --- a/trick_source/sim_services/ScheduledJobQueue/test/Makefile +++ b/trick_source/sim_services/ScheduledJobQueue/test/Makefile @@ -9,7 +9,7 @@ include $(dir $(lastword $(MAKEFILE_LIST)))../../../../share/trick/makefiles/Mak # Flags passed to the preprocessor. TRICK_CPPFLAGS += -I$(GTEST_HOME)/include -I$(TRICK_HOME)/include -g -Wall -Wextra ${TRICK_SYSTEM_CXXFLAGS} ${TRICK_TEST_FLAGS} -TRICK_LIBS = -L${TRICK_LIB_DIR} -ltrick_mm -ltrick_units -ltrick -ltrick_mm -ltrick_units -ltrick +TRICK_LIBS = -L${TRICK_LIB_DIR} -ltrick_mm -ltrick_units -ltrick -ltrick_mm -ltrick_units -ltrick -ltrick_pyip -ltrick_connection_handlers -ltrick_comm -ltrick TRICK_EXEC_LINK_LIBS += -L${GTEST_HOME}/lib64 -L${GTEST_HOME}/lib -lgtest -lgtest_main # All tests produced by this Makefile. Remember to add new tests you diff --git a/trick_source/sim_services/Timer/test/Makefile b/trick_source/sim_services/Timer/test/Makefile index c6912124..54fd3527 100644 --- a/trick_source/sim_services/Timer/test/Makefile +++ b/trick_source/sim_services/Timer/test/Makefile @@ -9,7 +9,7 @@ include $(dir $(lastword $(MAKEFILE_LIST)))../../../../share/trick/makefiles/Mak # Flags passed to the preprocessor. TRICK_CPPFLAGS += -I$(GTEST_HOME)/include -I$(TRICK_HOME)/include -g -Wall -Wextra ${TRICK_SYSTEM_CXXFLAGS} ${TRICK_TEST_FLAGS} -TRICK_LIBS = -L${TRICK_LIB_DIR} -ltrick -ltrick_units -ltrick_mm +TRICK_LIBS = -L${TRICK_LIB_DIR} -ltrick -ltrick_units -ltrick_mm -ltrick_pyip -ltrick_connection_handlers -ltrick_comm TRICK_EXEC_LINK_LIBS += -L${GTEST_HOME}/lib64 -L${GTEST_HOME}/lib -lgtest -lgtest_main -lpthread # All tests produced by this Makefile. Remember to add new tests you diff --git a/trick_source/sim_services/VariableServer/VariableServer.cpp b/trick_source/sim_services/VariableServer/VariableServer.cpp index 3db21fb7..5507703e 100644 --- a/trick_source/sim_services/VariableServer/VariableServer.cpp +++ b/trick_source/sim_services/VariableServer/VariableServer.cpp @@ -19,6 +19,10 @@ Trick::VariableServer::~VariableServer() { the_vs = NULL; } +void Trick::VariableServer::shutdownConnections() { + listen_thread.shutdownConnections(); +} + std::ostream& Trick::operator<< (std::ostream& s, Trick::VariableServer& vs) { std::map < pthread_t , VariableServerSessionThread * >::iterator it ; diff --git a/trick_source/sim_services/VariableServer/VariableServerListenThread.cpp b/trick_source/sim_services/VariableServer/VariableServerListenThread.cpp index 0261fdde..643df11a 100644 --- a/trick_source/sim_services/VariableServer/VariableServerListenThread.cpp +++ b/trick_source/sim_services/VariableServer/VariableServerListenThread.cpp @@ -34,6 +34,11 @@ Trick::VariableServerListenThread::VariableServerListenThread(TCPClientListener _listener = new TCPClientListener; } + allowConnections = true; + pendingConnections = 0; + pthread_mutex_init( &connectionMutex, NULL); + pthread_cond_init( &noPendingConnections_cv, NULL); + cancellable = false; } @@ -142,7 +147,7 @@ void * Trick::VariableServerListenThread::thread_body() { } else { user_name = strdup(passp->pw_name) ; } - + _listener->setBlockMode(true); if ( _broadcast ) { @@ -160,18 +165,29 @@ void * Trick::VariableServerListenThread::thread_body() { if (_listener->checkForNewConnections()) { // Create a new thread to service this connection - VariableServerSessionThread * vst = new Trick::VariableServerSessionThread() ; - vst->set_connection(_listener->setUpNewConnection()); - vst->copy_cpus(get_cpus()) ; - vst->create_thread() ; - ConnectionStatus status = vst->wait_for_accept() ; + if ( allowConnections) { + pthread_mutex_lock(&connectionMutex); + pendingConnections ++; - if (status == CONNECTION_FAIL) { - // If the connection failed, the thread will exit. - // Make sure it joins fully before deleting the vst object - vst->join_thread(); - delete vst; + VariableServerSessionThread * vst = new Trick::VariableServerSessionThread() ; + vst->set_connection(_listener->setUpNewConnection()); + vst->copy_cpus(get_cpus()) ; + vst->create_thread() ; + ConnectionStatus status = vst->wait_for_accept() ; + + if (status == CONNECTION_FAIL) { + // If the connection failed, the thread will exit. + // Make sure it joins fully before deleting the vst object + vst->join_thread(); + delete vst; + } + pendingConnections --; + if ( pendingConnections == 0 ) { + pthread_cond_signal( &noPendingConnections_cv ); + } + pthread_mutex_unlock(&connectionMutex); } + } else if ( _broadcast ) { // Otherwise, broadcast on the multicast channel if enabled char buf1[1024]; @@ -192,6 +208,17 @@ void * Trick::VariableServerListenThread::thread_body() { return NULL ; } +void Trick::VariableServerListenThread::shutdownConnections() { + pthread_mutex_lock(&connectionMutex); + allowConnections = false; + // if ANY connections are pending, then wait here until we’re notified that NO connections are pending. + if (pendingConnections > 0) { + allowConnections = true; + pthread_cond_wait( &noPendingConnections_cv, &connectionMutex); + } + pthread_mutex_unlock( &connectionMutex ); +} + #include int Trick::VariableServerListenThread::restart() { @@ -210,7 +237,7 @@ int Trick::VariableServerListenThread::restart() { _listener->disconnect(); ret = _listener->initialize(_requested_source_address, _requested_port); - + if (ret != 0) { message_publish(MSG_ERROR, "ERROR: Could not establish listen port %d for Variable Server. Aborting.\n", _requested_port); return (-1); @@ -250,4 +277,3 @@ void Trick::VariableServerListenThread::dump( std::ostream & oss ) { oss << " broadcast = " << _broadcast << std::endl ; Trick::ThreadBase::dump(oss) ; } - From c6e44c6e041725a725f8201587ad56a889123390 Mon Sep 17 00:00:00 2001 From: ddj116 Date: Mon, 1 Apr 2024 09:43:12 -0500 Subject: [PATCH 02/52] Revert changes to trickops test yml file from Sept 2023 to fix trickops unit tests (#1681) * TrickOps: Revert changes to trickops test yml file from Sept 2023 * trick_sims.yml was "accidentally changed" to remove unstable sims in Sept 2023, breaking the TrickOps unit tests. This reverts that change. * Adjust new hashlib md5 comparison approach to work on systems where 'usedforsecurity' isn't supported * Move TrickOps Unit tests back into pull requests * Adjust TrickOps actions artifacts to use v3.0.0 Per suggestion on workaround as described here: https://github.com/actions/upload-artifact/issues/478 --------- Co-authored-by: Dan Jordan --- .github/workflows/trickops.yml | 9 +++------ share/trick/trickops/TrickWorkflow.py | 7 +++++-- share/trick/trickops/tests/trick_sims.yml | 16 ++++++++-------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/trickops.yml b/.github/workflows/trickops.yml index 241f2705..cadfc5c4 100644 --- a/.github/workflows/trickops.yml +++ b/.github/workflows/trickops.yml @@ -1,9 +1,6 @@ name: TrickOps # This workflow is triggered on pushes to the repository. -on: - schedule: - - cron: '0 0 * * 0' - workflow_dispatch: +on: [pull_request] defaults: run: @@ -34,7 +31,7 @@ jobs: source ../.venv/bin/activate export PATH="/tmp/koviz-master/bin:${PATH}" ./run_tests.py - - uses: actions/upload-artifact@master + - uses: actions/upload-artifact@v3.0.0 if: ${{ always() }} with: name: doctests @@ -66,7 +63,7 @@ jobs: source ../.venv/bin/activate export PATH="/tmp/koviz-master/bin:${PATH}" ./run_tests.py - - uses: actions/upload-artifact@master + - uses: actions/upload-artifact@v3.0.0 if: ${{ always() }} with: name: doctests diff --git a/share/trick/trickops/TrickWorkflow.py b/share/trick/trickops/TrickWorkflow.py index 7966d9fb..dba3307e 100644 --- a/share/trick/trickops/TrickWorkflow.py +++ b/share/trick/trickops/TrickWorkflow.py @@ -1284,8 +1284,11 @@ class TrickWorkflow(WorkflowCommon): self.status = Job.Status.FAILED if self.missing: return self.status - if (hashlib.md5(open(self.test_data,'rb').read(), usedforsecurity=False).hexdigest() != - hashlib.md5(open(self.baseline_data,'rb').read(), usedforsecurity=False).hexdigest()): + td = hashlib.new('md5', usedforsecurity=False) + bd = hashlib.new('md5', usedforsecurity=False) + td.update(open(self.test_data,'rb').read()) + bd.update(open(self.baseline_data,'rb').read()) + if (td.hexdigest() != bd.hexdigest()): self.status = Job.Status.FAILED else: self.status = Job.Status.SUCCESS diff --git a/share/trick/trickops/tests/trick_sims.yml b/share/trick/trickops/tests/trick_sims.yml index adfbdce5..f87f5ed2 100644 --- a/share/trick/trickops/tests/trick_sims.yml +++ b/share/trick/trickops/tests/trick_sims.yml @@ -146,12 +146,12 @@ SIM_test_templates: - unit_test runs: RUN_test/unit_test.py: -# SIM_test_varserv: -# path: test/SIM_test_varserv -# labels: -# - unit_test -# runs: -# RUN_test/unit_test.py: +SIM_test_varserv: + path: test/SIM_test_varserv + labels: + - unit_test + runs: + RUN_test/unit_test.py: SIM_threads: path: test/SIM_threads labels: @@ -189,8 +189,8 @@ SIM_ball_L2: runs: SIM_ball_L3: path: trick_sims/Ball/SIM_ball_L3 -# SIM_amoeba: -# path: trick_sims/Cannon/SIM_amoeba +SIM_amoeba: + path: trick_sims/Cannon/SIM_amoeba SIM_cannon_aero: path: trick_sims/Cannon/SIM_cannon_aero SIM_cannon_analytic: From f475627ef7f17b62326739f8839c6b176dae6574 Mon Sep 17 00:00:00 2001 From: jmpenn Date: Mon, 1 Apr 2024 11:57:28 -0500 Subject: [PATCH 03/52] Fix SIM_lander input file. (#1686) --- trick_sims/SIM_lander/RUN_test/input.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/trick_sims/SIM_lander/RUN_test/input.py b/trick_sims/SIM_lander/RUN_test/input.py index d78545e1..fc59162d 100644 --- a/trick_sims/SIM_lander/RUN_test/input.py +++ b/trick_sims/SIM_lander/RUN_test/input.py @@ -4,8 +4,6 @@ dyn.lander.pos[0] = 0 dyn.lander.pos[1] = 1.8 dyn.lander.vel[0] = 0.0 dyn.lander.vel[1] = 0.0 -dyn.lander.angleDot = 0.0 -dyn.lander.angle = 0.0 trick.TMM_set_debug_level(1) #========================================== From d40bc12570983611f1e4b5ca9aa96ec3f3b3ef7a Mon Sep 17 00:00:00 2001 From: Hong Chen Date: Tue, 2 Apr 2024 13:37:00 -0500 Subject: [PATCH 04/52] Incorporate llvm 18 changes. (#1685) * Incorporate llvm 18 changes. * Fixed to set input file properly for clang3.4 or ealier. * Fixed missing brackets and added the rule back for the condition to call clang init preprocessor which was taken out incorrectly by the last commit. --- CMakeTestFiles/TestICGLinkedLibs.cpp | 5 +++++ .../codegen/Interface_Code_Gen/main.cpp | 17 ++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/CMakeTestFiles/TestICGLinkedLibs.cpp b/CMakeTestFiles/TestICGLinkedLibs.cpp index bb243bcf..33ce6891 100644 --- a/CMakeTestFiles/TestICGLinkedLibs.cpp +++ b/CMakeTestFiles/TestICGLinkedLibs.cpp @@ -1,4 +1,9 @@ +// `llvm/Support/Host.h` is deprecated in favour of `llvm/TargetParser/Host.h` since clang 17 +#if LIBCLANG_MAJOR > 16 +#include "llvm/TargetParser/Host.h" +#else #include "llvm/Support/Host.h" +#endif #include "llvm/Support/CommandLine.h" #include "llvm/Support/raw_ostream.h" diff --git a/trick_source/codegen/Interface_Code_Gen/main.cpp b/trick_source/codegen/Interface_Code_Gen/main.cpp index 0671fbf1..b2c4df79 100644 --- a/trick_source/codegen/Interface_Code_Gen/main.cpp +++ b/trick_source/codegen/Interface_Code_Gen/main.cpp @@ -6,7 +6,12 @@ #include #include +// `llvm/Support/Host.h` is deprecated in favour of `llvm/TargetParser/Host.h` since clang 17 +#if LIBCLANG_MAJOR > 16 +#include "llvm/TargetParser/Host.h" +#else #include "llvm/Support/Host.h" +#endif #include "llvm/Support/CommandLine.h" #include "llvm/Support/raw_ostream.h" @@ -239,8 +244,10 @@ int main(int argc, char * argv[]) { #endif clang::Preprocessor& pp = ci.getPreprocessor(); -#if (LIBCLANG_MAJOR >= 10) +#if (LIBCLANG_MAJOR >= 10) && (LIBCLANG_MAJOR < 18) clang::InitializePreprocessor(pp, ppo, ci.getPCHContainerReader(), ci.getFrontendOpts()); +#elif (LIBCLANG_MAJOR >= 18) + clang::InitializePreprocessor(pp, ppo, ci.getPCHContainerReader(), ci.getFrontendOpts(), ci.getCodeGenOpts()); #endif // Add all of the include directories to the preprocessor @@ -301,14 +308,18 @@ int main(int argc, char * argv[]) { exit(-1); } // Open up the input file and parse it -#if (LIBCLANG_MAJOR >= 10) +#if (LIBCLANG_MAJOR >= 10 && LIBCLANG_MAJOR < 18) const clang::FileEntry* fileEntry = ci.getFileManager().getFile(inputFilePath).get(); +#elif (LIBCLANG_MAJOR >= 18) + clang::FileEntryRef fileEntryRef = llvm::cantFail(ci.getFileManager().getFileRef(inputFilePath)); #else const clang::FileEntry* fileEntry = ci.getFileManager().getFile(inputFilePath); #endif free(inputFilePath); -#if (LIBCLANG_MAJOR > 3) || ((LIBCLANG_MAJOR == 3) && (LIBCLANG_MINOR >= 5)) +#if ((LIBCLANG_MAJOR > 3 && LIBCLANG_MAJOR < 18)) || ((LIBCLANG_MAJOR == 3) && (LIBCLANG_MINOR >= 5)) ci.getSourceManager().setMainFileID(ci.getSourceManager().createFileID(fileEntry, clang::SourceLocation(), clang::SrcMgr::C_User)); +#elif (LIBCLANG_MAJOR >= 18) + ci.getSourceManager().setMainFileID(ci.getSourceManager().createFileID(fileEntryRef, clang::SourceLocation(), clang::SrcMgr::C_User)); #else ci.getSourceManager().createMainFileID(fileEntry); #endif From 04822023de1faed8d861693c6aca1b43462d8f8d Mon Sep 17 00:00:00 2001 From: jmpenn Date: Thu, 4 Apr 2024 10:33:18 -0500 Subject: [PATCH 05/52] In MemoryManager change delete_var(const char*) to delete_var(std::string) (#1687) --- include/trick/MemoryManager.hh | 4 ++-- .../sim_services/MemoryManager/MemoryManager_delete_var.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/trick/MemoryManager.hh b/include/trick/MemoryManager.hh index 6f98c8ad..8227f568 100644 --- a/include/trick/MemoryManager.hh +++ b/include/trick/MemoryManager.hh @@ -309,7 +309,7 @@ namespace Trick { @param var_name - the address of the variable. @return 0 = SUCCESS, 1 = FAILURE */ - int delete_var(const char* var_name); + int delete_var(std::string var_name); /** Forget about the external variable at the given address. DOES NOT attempt to deallocate the @@ -325,7 +325,7 @@ namespace Trick { @param var_name - the address of the external variable. @return 0 = SUCCESS, 1 = FAILURE */ - int delete_extern_var(const char* var_name); + int delete_extern_var(std::string var_name); /** Checkpoint all allocations known to the MemoryManager to the given stream. diff --git a/trick_source/sim_services/MemoryManager/MemoryManager_delete_var.cpp b/trick_source/sim_services/MemoryManager/MemoryManager_delete_var.cpp index cd5a17f8..4bde1c45 100644 --- a/trick_source/sim_services/MemoryManager/MemoryManager_delete_var.cpp +++ b/trick_source/sim_services/MemoryManager/MemoryManager_delete_var.cpp @@ -110,7 +110,7 @@ int Trick::MemoryManager::delete_var(void* address ) { } // MEMBER FUNCTION -int Trick::MemoryManager::delete_var( const char* name) { +int Trick::MemoryManager::delete_var( std::string name) { VARIABLE_MAP::iterator pos; ALLOC_INFO *alloc_info; @@ -140,7 +140,7 @@ int Trick::MemoryManager::delete_extern_var( void* address) { } // MEMBER FUNCTION -int Trick::MemoryManager::delete_extern_var( const char* name) { +int Trick::MemoryManager::delete_extern_var( std::string name) { // delete_var will remove the external variable from the allocation map return delete_var(name) ; } From e515144252e417d3aa95cfa92607095d5ea4f4f4 Mon Sep 17 00:00:00 2001 From: Pherring04 <158035107+Pherring04@users.noreply.github.com> Date: Thu, 18 Apr 2024 11:24:02 -0500 Subject: [PATCH 06/52] Water Clock Sim v3 (#1668) * Added Water Clock Sim * Updated graphics and documentation * Added images for README * Typos in README --------- Co-authored-by: Pherring04 --- .../Modified_data/my_waterclock.dr | 37 + trick_sims/SIM_waterclock/README.md | 62 ++ trick_sims/SIM_waterclock/RUN_test/input.py | 44 + trick_sims/SIM_waterclock/S_define | 36 + trick_sims/SIM_waterclock/S_overrides.mk | 2 + .../SIM_waterclock/WaterClockRunning.png | Bin 0 -> 13638 bytes trick_sims/SIM_waterclock/WaterClockStart.png | Bin 0 -> 13024 bytes .../SIM_waterclock/models/graphics/Makefile | 6 + .../SIM_waterclock/models/graphics/pom.xml | 121 +++ .../waterClockDisplay/WaterClockDisplay.java | 779 ++++++++++++++++++ .../models/waterclock/include/waterclock.h | 76 ++ .../waterclock/include/waterclock_numeric.h | 21 + .../models/waterclock/src/waterclock_init.c | 59 ++ .../waterclock/src/waterclock_numeric.c | 124 +++ .../waterclock/src/waterclock_shutdown.c | 13 + trick_sims/SIM_waterclock/waterclock.tv | 96 +++ trick_sims/SIM_waterclock/waterclock_debug.tv | 141 ++++ 17 files changed, 1617 insertions(+) create mode 100644 trick_sims/SIM_waterclock/Modified_data/my_waterclock.dr create mode 100644 trick_sims/SIM_waterclock/README.md create mode 100644 trick_sims/SIM_waterclock/RUN_test/input.py create mode 100644 trick_sims/SIM_waterclock/S_define create mode 100644 trick_sims/SIM_waterclock/S_overrides.mk create mode 100644 trick_sims/SIM_waterclock/WaterClockRunning.png create mode 100644 trick_sims/SIM_waterclock/WaterClockStart.png create mode 100644 trick_sims/SIM_waterclock/models/graphics/Makefile create mode 100644 trick_sims/SIM_waterclock/models/graphics/pom.xml create mode 100644 trick_sims/SIM_waterclock/models/graphics/src/main/java/trick/waterClockDisplay/WaterClockDisplay.java create mode 100644 trick_sims/SIM_waterclock/models/waterclock/include/waterclock.h create mode 100644 trick_sims/SIM_waterclock/models/waterclock/include/waterclock_numeric.h create mode 100644 trick_sims/SIM_waterclock/models/waterclock/src/waterclock_init.c create mode 100644 trick_sims/SIM_waterclock/models/waterclock/src/waterclock_numeric.c create mode 100644 trick_sims/SIM_waterclock/models/waterclock/src/waterclock_shutdown.c create mode 100644 trick_sims/SIM_waterclock/waterclock.tv create mode 100644 trick_sims/SIM_waterclock/waterclock_debug.tv diff --git a/trick_sims/SIM_waterclock/Modified_data/my_waterclock.dr b/trick_sims/SIM_waterclock/Modified_data/my_waterclock.dr new file mode 100644 index 00000000..b55e06ca --- /dev/null +++ b/trick_sims/SIM_waterclock/Modified_data/my_waterclock.dr @@ -0,0 +1,37 @@ +global DR_GROUP_ID +global drg +try: + if DR_GROUP_ID >= 0: + DR_GROUP_ID += 1 +except NameError: + DR_GROUP_ID = 0 + drg = [] + +drg.append(trick.DRAscii("WaterClock")) +drg[DR_GROUP_ID].set_freq(trick.DR_Always) +drg[DR_GROUP_ID].set_cycle(0.01) +drg[DR_GROUP_ID].set_single_prec_only(False) +drg[DR_GROUP_ID].add_variable("dyn.waterclock.time") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.input_flow") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.intake_clock_spout_flowrate") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.intake_overflow_flowrate") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.intake_bucket_net_flow") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.intake_bucket_depth") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.intake_bucket_diam") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.intake_overflow_height") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.intake_overflow_diameter") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.intake_clock_spout_height") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.intake_clock_spout_diameter") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.timer_bucket_depth") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.timer_bucket_diam") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.intake_bucket_vol") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.intake_water_level") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.timer_bucket_vol") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.timer_water_level") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.tick_gap") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.total_ticks") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.current_tick") +drg[DR_GROUP_ID].add_variable("dyn.waterclock.gravity") +drg[DR_GROUP_ID].set_max_file_size(1 * 1073741824) # multiply converts GiB to B --Dr. Dre +trick.add_data_record_group(drg[DR_GROUP_ID], trick.DR_Buffer) +drg[DR_GROUP_ID].enable() diff --git a/trick_sims/SIM_waterclock/README.md b/trick_sims/SIM_waterclock/README.md new file mode 100644 index 00000000..6093628d --- /dev/null +++ b/trick_sims/SIM_waterclock/README.md @@ -0,0 +1,62 @@ +# SIM_WaterClock + +--- + +SIM_WaterClock simulates a simple water clock. A water clock is a clock that measures time utilizing the flow of water. There exists different designs for water clocks, but this one uses a basic two bucket design. + +The first bucket is called the intake bucket. The intake bucket receives water from an external source of variable flow rate. In the real world this might be piped in from a stream for example. In this sim, the water source (input_flow) is a variable range from 0 to 10 liters/s that can be arbitrarily adjusted via the GUI. The intake bucket contains two spouts, a clock spout and an overflow spout. Both spouts are cylinders defined by their width and height on the intake bucket. The clock spout pours water into the second bucket (timer bucket), while the overflow spout empties water into the void. + +In an ideal water clock, by balancing the dimensions of the intake bucket, the clock spout, overflow spout, and the input flow rate, the flow rate of the clock spout (and therefore the input flow rate of the timer bucket) will be constant. Given a constant flow rate into the timer bucket, we can correlate water level with time passed. + +Assumptions: +* For the purpose of determining if a pipe is submerged, the pipe will be treated as a single point at its center. +* When the timing bucket is filled, a magical siphon will drain it instaneously. This prevents the need to simulate the recalibration of the clock. +* Buckets and spouts are perfectly cylindrical. + +### A Brief History +The water clock (or clepsydra to the ancient Greek) is a device used to measure time through the displacement of water. It is not known precisely when the earliest water clocks were developed, but they have been discovered to exist in various parts of the world as early as the 16th century BC. These early designs were relatively simple compared to later designs, consiting of a bowl with markings to indicate time passing as the bowl either filled or drained. + +Water clocks remained a prominent timekeeping device until the 17th century when better methods of timekeeping were developed. Over those many centruies, different cultures innovated on the design of the early water clocks. Of particular note were the contributions of the Greek inventor Ctesibius in the 3rd century BC. Ctesibius innovated on the water clock by making it largely automatic. Prior to Ctesibius, water clocks needed to be consistently refilled/emptied by hand. Furthermore, if a water clock had indicators marking the position of the sun, they would need to be manually adjusted for different seasons. Ctesibius automated both these processes. + +Ctesibius automated the draining process with a siphon akin to a Pythagorean cup. This siphon would empty over a water wheel, which powered a series of gears that would turn a cylinder. The cylinder had a row of irregular rings drawn around it, meant to correlate with the position of the sun throughout the seasons. Each day, as the water clock would fill it would accurately indicate the position of the sun, drain itself at the end of the day, and adjust the cylinder to be accurate for the next day. + +### Building the Simulation +After building trick, in the SIM\_waterclock directory run the command **trick-CP** to build the sim. When it's complete, you should see: + +``` +Trick Build Process Complete +``` +To build the graphics client **cd** into models/graphics/ and run **mvn package**. This isn't necessary for the sim to run, but will provide a visual display of the water clock. + +### Running the Simulation +In the SIM_waterclock directory: + +``` +% S_main_*.exe RUN_test/input.py +``` +The Sim Control Panel, and a GUI called "Water Clock" should appear. + +![Water Clock graphics client at the start of a run.](WaterClockStart.png) + +Click the Start on the Trick Sim Control Panel. The Water Clock should begin to fill up. + +![Water Clock graphics client mid-run.](WaterClockRunning.png) + +The only control on the GUI client is a slider which changes the flow rate of water into the water clock. It can be set anywhere from no flow up to 10 liters per second (10,000 cm^3^/s). + +By default, the water clock will count out 60 "ticks" at a little over 1 second a tick. See if you can clibrate the water clock to count out a proper minute (1 second a tick). + +### Configurable Parameters +The following parameters are meant to be configured by the user. They consist of the dimensions of the buckets, the dimensions and placement of the intake bucket spouts, and the number of time ticks. + +Variable | Type | Units +----------------------------------------------------------------------|----------------|------- +dyn.waterclock.intake_bucket_depth | double | m +dyn.waterclock.intake_bucket_diam | double | m +dyn.waterclock.intake_overflow_height | double | m +dyn.waterclock.intake_overflow_diameter | double | m +dyn.waterclock.intake_clock_spout_height | double | m +dyn.waterclock.intake_clock_spout_diameter | double | m +dyn.waterclock.timer_bucket_depth | double | m +dyn.waterclock.timer_bucket_diam | double | m +dyn.waterclock.total_ticks | int | -- diff --git a/trick_sims/SIM_waterclock/RUN_test/input.py b/trick_sims/SIM_waterclock/RUN_test/input.py new file mode 100644 index 00000000..0648aca5 --- /dev/null +++ b/trick_sims/SIM_waterclock/RUN_test/input.py @@ -0,0 +1,44 @@ +exec(open("Modified_data/my_waterclock.dr").read()) + +trick.frame_log_on() +trick.real_time_enable() +trick.exec_set_software_frame(0.1) +trick.itimer_enable() +trick.exec_set_enable_freeze(True) +trick.exec_set_freeze_command(True) +trick.sim_control_panel_set_enabled(True) + +dyn.waterclock.input_flow = 1000.0 + +dyn.waterclock.intake_bucket_depth = 70.0 +dyn.waterclock.intake_bucket_diam = 40.0 + +dyn.waterclock.intake_overflow_height = 60.0 +dyn.waterclock.intake_overflow_diameter = 25.0 + +dyn.waterclock.intake_clock_spout_height = 15.0 +dyn.waterclock.intake_clock_spout_diameter = 20.0 + +dyn.waterclock.timer_bucket_depth = 100.0 +dyn.waterclock.timer_bucket_diam = 45.0 + +dyn.waterclock.total_ticks = 60 + +trick.message_unsubscribe(trick_message.mcout) + +# ========================================== +# Start the Satellite Graphics Client +# ========================================== +varServerPort = trick.var_server_get_port(); +WaterClockDisplay_path = "models/graphics/build/WaterClockDisplay.jar" + +if (os.path.isfile(WaterClockDisplay_path)) : + WaterClockDisplay_cmd = "java -jar " \ + + WaterClockDisplay_path \ + + " " + str(varServerPort) + " &" ; + print(WaterClockDisplay_cmd) + os.system( WaterClockDisplay_cmd); +else : + print('==================================================================================') + print('Display needs to be built. Please \"cd\" into ../models/graphics and type \"mvn package\".') + print('==================================================================================') diff --git a/trick_sims/SIM_waterclock/S_define b/trick_sims/SIM_waterclock/S_define new file mode 100644 index 00000000..c6f593fd --- /dev/null +++ b/trick_sims/SIM_waterclock/S_define @@ -0,0 +1,36 @@ +/************************TRICK HEADER************************* +PURPOSE: + (S_define file for SIM_waterclock_numeric) +LIBRARY DEPENDENCIES: + ( + (waterclock/src/waterclock_init.c) + (waterclock/src/waterclock_numeric.c) + (waterclock/src/waterclock_shutdown.c) + ) +*************************************************************/ + +#include "sim_objects/default_trick_sys.sm" +##include "waterclock/include/waterclock_numeric.h" + +class WaterClockSimObject : public Trick::SimObject { + + public: + WATERCLOCK waterclock; + + WaterClockSimObject() { + ("default_data") waterclock_default_data( &waterclock ) ; + ("initialization") waterclock_init( &waterclock ) ; + ("derivative") waterclock_deriv( &waterclock ) ; + ("integration") trick_ret= waterclock_integ( & waterclock ) ; + ("shutdown") waterclock_shutdown( &waterclock ) ; + ("dynamic_event") waterclock_tick_change( &waterclock ) ; + ("dynamic_event") waterclock_overflow_timer( &waterclock ) ; + } +} ; + +WaterClockSimObject dyn ; + +IntegLoop dyn_integloop (0.01) dyn ; +void create_connections() { + dyn_integloop.getIntegrator(Runge_Kutta_4, 4); +} diff --git a/trick_sims/SIM_waterclock/S_overrides.mk b/trick_sims/SIM_waterclock/S_overrides.mk new file mode 100644 index 00000000..e1f6cccd --- /dev/null +++ b/trick_sims/SIM_waterclock/S_overrides.mk @@ -0,0 +1,2 @@ +TRICK_CFLAGS += -Imodels +TRICK_CXXFLAGS += -Imodels diff --git a/trick_sims/SIM_waterclock/WaterClockRunning.png b/trick_sims/SIM_waterclock/WaterClockRunning.png new file mode 100644 index 0000000000000000000000000000000000000000..b73ace9f1a9afe829fcfef6916a9b43e4151614b GIT binary patch literal 13638 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 literal 0 HcmV?d00001 diff --git a/trick_sims/SIM_waterclock/WaterClockStart.png b/trick_sims/SIM_waterclock/WaterClockStart.png new file mode 100644 index 0000000000000000000000000000000000000000..43f924b51ae108b47c3d0fa8532236816f1c6986 GIT binary patch literal 13024 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 bWV)}mKQ2CeyAciO1kzI1Q!Be`{rrCcH`TNs literal 0 HcmV?d00001 diff --git a/trick_sims/SIM_waterclock/models/graphics/Makefile b/trick_sims/SIM_waterclock/models/graphics/Makefile new file mode 100644 index 00000000..d3e0cbc0 --- /dev/null +++ b/trick_sims/SIM_waterclock/models/graphics/Makefile @@ -0,0 +1,6 @@ + +all: + mvn package + +clean: + rm -rf build diff --git a/trick_sims/SIM_waterclock/models/graphics/pom.xml b/trick_sims/SIM_waterclock/models/graphics/pom.xml new file mode 100644 index 00000000..2651af39 --- /dev/null +++ b/trick_sims/SIM_waterclock/models/graphics/pom.xml @@ -0,0 +1,121 @@ + + + + 4.0.0 + + trick-java + trick-java + 23.0.0-beta + + trick-java + + https://github.com/nasa/trick + + + UTF-8 + 1.8 + 1.8 + + + + + junit + junit + 4.13.1 + test + + + + + + WaterClockDisplay + + build + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.1.1 + + ${java.home}/bin/javadoc + ../../share/doc/trick/java + + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + + maven-resources-plugin + 3.0.2 + + + + maven-compiler-plugin + 3.8.0 + + + -g + -Xlint:unchecked + -Xlint:deprecation + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.0 + + + + true + lib/ + WaterClockDisplay + + + + + + + maven-surefire-plugin + 2.22.1 + + + + maven-install-plugin + 2.5.2 + + + + maven-deploy-plugin + 2.8.2 + + + + + maven-site-plugin + 3.7.1 + + + + + + + + diff --git a/trick_sims/SIM_waterclock/models/graphics/src/main/java/trick/waterClockDisplay/WaterClockDisplay.java b/trick_sims/SIM_waterclock/models/graphics/src/main/java/trick/waterClockDisplay/WaterClockDisplay.java new file mode 100644 index 00000000..c3cbcace --- /dev/null +++ b/trick_sims/SIM_waterclock/models/graphics/src/main/java/trick/waterClockDisplay/WaterClockDisplay.java @@ -0,0 +1,779 @@ +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Graphics; +import java.awt.RenderingHints; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.Socket; +import java.util.*; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JSlider; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.sound.sampled.*; +import java.net.URL; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.geom.AffineTransform; +import java.awt.geom.Area; +import java.awt.geom.Rectangle2D; +import java.awt.Font; + +import javax.swing.text.NumberFormatter; +import java.text.NumberFormat; +import javax.swing.JFormattedTextField; +import java.awt.Dimension; + +import javax.swing.BorderFactory; +import javax.swing.border.EtchedBorder; +import java.awt.Component; + +class ScenePoly { + public Color color; + public int n; + public double[] x; + public double[] y; +} + +class RangeView extends JPanel { + + private int scale; + private Color bucket_color; + private Color spout_color; + private Color water_color; + private Color float_color; + private Color clock_color; + private Color clock_display_color; + private Color tick_color; + private Color gear_color; + + // Origin of world coordinates in jpanel coordinates. + private int worldOriginX; + private int worldOriginY; + + private double spout_rate; + private double overflow_rate; + private double intake_depth; + private double timer_depth; + private double intake_lvl; + private double timer_lvl; + private double intake_vol; + private double timer_vol; + private double spout_height; + private double overflow_height; + private double input_flow; + private int current_tick; + + private double clock_float_height; + + // Controls + private double input_flow_select; + public boolean new_input_flow; + + /** + * Class constructor. + */ + public RangeView( int mapScale) { + + setScale(mapScale); + + spout_rate = 0.0; + overflow_rate = 0.0; + intake_depth = 0.0; + timer_depth = 0.0; + intake_lvl = 0.0; + timer_lvl = 0.0; + intake_vol = 0.0; + timer_vol = 0.0; + spout_height = 0.0; + overflow_height = 0.0; + input_flow = 0.0; + input_flow_select = 0.0; + current_tick = 0; + + new_input_flow = false; + + bucket_color = new Color(150,75,0); + spout_color = new Color(128,128,128); + water_color = new Color(0,0,128); + float_color = new Color(0,0,0); + clock_color = new Color(204,204,0); + clock_display_color = new Color(192,192,192); + tick_color = new Color(0,0,0); + gear_color = new Color(128,128,128); + + workPolyX = new int[150]; + workPolyY = new int[150]; + + tooth = new ScenePoly(); + tooth.color = float_color; + + tooth.x = new double[] { 0, -0.15, -0.25 , -0.15 , 0 }; + tooth.y = new double[] { 0, 0 , 0.075 , 0.15 , 0.15 }; + + tooth.n = 5; + + clock_float_height = 8; + } + + private ScenePoly gear; + private ScenePoly tooth; + + private int[] workPolyX, workPolyY; + + public void fillSceneRect(Graphics2D g2d, Color color, double x, double y, double w, double h) { + g2d.setPaint(color); + g2d.fillRect( (int)(worldOriginX+scale*(x)), (int)(worldOriginY-scale*(y)), (int)(scale*w), (int)(scale*h)); + } + + public void fillScenePoly(Graphics2D g, ScenePoly p, double angle_r , double x, double y) { + for (int ii = 0; ii < p.n; ii++) { + workPolyX[ii] = (int)(worldOriginX + scale * + ( Math.cos(angle_r) * p.x[ii] - Math.sin(angle_r) * p.y[ii] + x)); + workPolyY[ii] = (int)(worldOriginY - scale * + ( Math.sin(angle_r) * p.x[ii] + Math.cos(angle_r) * p.y[ii] + y)); + } + g.setPaint(p.color); + g.fillPolygon(workPolyX, workPolyY, p.n); + } + + public void fillSceneOval(Graphics2D g2d, Color color, double x, double y, double w, double h) { + g2d.setPaint(color); + g2d.fillOval( (int)(worldOriginX+scale*(x-w/2)), (int)(worldOriginY-scale*(y+h/2)), (int)(scale*w), (int)(scale*h)); + } + + public void setSpoutRate(double x) { + spout_rate = x; + } + + public void setOverflowRate(double x) { + overflow_rate = x; + } + + public void setIntakeDepth(double x) { + intake_depth = x; + } + + public void setTimerDepth(double x) { + timer_depth = x; + } + + public void setIntakeWarerLevel(double x) { + intake_lvl = x; + } + + public void setTimerWarerLevel(double x) { + timer_lvl = x; + } + + public void setIntakeWaterVol(double x) { + intake_vol = x; + } + + public void setTimerWaterLevel(double x) { + timer_vol = x; + } + + public void setSpoutHeight(double x) { + spout_height = x; + } + + public void setOverflowHeight(double x) { + overflow_height = x; + } + + public void setInputFlow(double x) { + input_flow = x; + } + + public void setInputFlowSelect(double x) { + input_flow_select = x; + } + + public double getInputFlowSelect() { + return input_flow_select; + } + + public void setCurrentTick(int x) { + current_tick = x; + } + + public void setScale (int mapScale) { + if (mapScale < 2) { + scale = 2; + } else if (mapScale > 128) { + scale = 128; + } else { + scale = mapScale; + } + repaint(); + } + + private void doDrawing(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + + RenderingHints rh = new RenderingHints( + RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + + rh.put(RenderingHints.KEY_RENDERING, + RenderingHints.VALUE_RENDER_QUALITY); + + int width = getWidth(); + int height = getHeight(); + + worldOriginX = (width/2) - (int)(scale * 0); + worldOriginY = (height/2) + (int)(scale * 0); + + + // Draw intake Bucket + double bucket_length = 2.0; + double bucket_width = 0.15; + double intake_bucket_origin_x = 4; + double intake_bucket_origin_y = 1.7; + double intake_bucket_left_wall_x = intake_bucket_origin_x - bucket_length - bucket_width; + double intake_bucket_bottom_x = intake_bucket_origin_x - bucket_length - bucket_width; + double intake_bucket_bottom_y = intake_bucket_origin_y - bucket_length; + double spout_width = 0.175; + double spout_length = 1.0; + double spout_pipe_x = intake_bucket_left_wall_x - spout_length + bucket_width; + double spout_pipe_y = intake_bucket_origin_y - bucket_length + spout_width + ((spout_height / intake_depth) * bucket_length) - spout_width/2; + double overflow_pipe_x = intake_bucket_origin_x; + double overflow_pipe_y = intake_bucket_origin_y - bucket_length + spout_width + ((overflow_height / intake_depth) * bucket_length) - spout_width/2; + fillSceneRect( g2d, + bucket_color, + intake_bucket_origin_x, + intake_bucket_origin_y, + bucket_width, + bucket_length); + fillSceneRect( g2d, + bucket_color, + intake_bucket_bottom_x, + intake_bucket_bottom_y, + bucket_length + (2 * bucket_width), + bucket_width); + fillSceneRect( g2d, + bucket_color, + intake_bucket_left_wall_x, + intake_bucket_origin_y, + bucket_width, + bucket_length); + fillSceneRect( g2d, + spout_color, + overflow_pipe_x, + overflow_pipe_y, + spout_length, + spout_width); + fillSceneRect( g2d, + spout_color, + spout_pipe_x, + spout_pipe_y, + spout_length, + spout_width); + + //Draw timer bucket + double timer_bucket_origin_x = 1.3; + double timer_bucket_origin_y = -0.5; + double timer_bucket_left_wall_x = timer_bucket_origin_x - bucket_length - bucket_width; + double timer_bucket_bottom_x = timer_bucket_origin_x - bucket_length - bucket_width; + double timer_bucket_bottom_y = timer_bucket_origin_y - bucket_length; + fillSceneRect( g2d, + bucket_color, + timer_bucket_origin_x, + timer_bucket_origin_y, + bucket_width, + bucket_length); + fillSceneRect( g2d, + bucket_color, + timer_bucket_bottom_x, + timer_bucket_bottom_y, + bucket_length + (2 * bucket_width), + bucket_width); + fillSceneRect( g2d, + bucket_color, + timer_bucket_left_wall_x, + timer_bucket_origin_y, + bucket_width, + bucket_length); + + + //Draw water flow + double flow_width = 0.15; + double spout_flow_height = intake_bucket_origin_y - timer_bucket_origin_y + (bucket_length - (intake_bucket_origin_y - spout_pipe_y)) - spout_width/2; + double overflow_height = 20; + if (spout_rate != 0.0) { + fillSceneRect( g2d, + water_color, + intake_bucket_left_wall_x - spout_length + bucket_width - flow_width + 0.015, + spout_pipe_y - spout_width/2, + flow_width, + spout_flow_height); + } + + if (overflow_rate != 0.0) { + fillSceneRect( g2d, + water_color, + intake_bucket_origin_x + spout_length, + overflow_pipe_y - spout_width/2, + flow_width, + overflow_height); + } + + + //Draw water level + double intake_capacity = intake_lvl / intake_depth; + double intake_offset = ((1 - intake_capacity) * bucket_length) ; + double timer_capacity = timer_lvl / timer_depth; + double timer_offset = ((1 - timer_capacity) * bucket_length) ; + fillSceneRect( g2d, + water_color, + intake_bucket_origin_x - bucket_length - 0.01, + intake_bucket_origin_y - intake_offset, + bucket_length + 0.03, + intake_capacity * bucket_length); + //fill in pixel gaps due to rounding error + if(intake_lvl > 0.0) { + fillSceneRect( g2d, + water_color, + intake_bucket_origin_x - bucket_length - 0.01, + intake_bucket_origin_y - bucket_length + 0.05, + bucket_length + 0.03, + 0.05); + } + + + fillSceneRect( g2d, + water_color, + timer_bucket_origin_x - bucket_length - 0.01, + timer_bucket_origin_y - timer_offset, + bucket_length + 0.03, + timer_capacity * bucket_length); + //fill in pixel gaps due to rounding error + if(timer_lvl > 0.0) { + fillSceneRect( g2d, + water_color, + timer_bucket_origin_x - bucket_length - 0.01, + timer_bucket_origin_y - bucket_length + 0.05, + bucket_length + 0.03, + 0.075); + } + + //Draw external source pipe + fillSceneRect( g2d, + spout_color, + intake_bucket_origin_x - bucket_length/4, + intake_bucket_origin_y + 0.8, + 7, + spout_width); + + if(input_flow > 0) { + fillSceneRect( g2d, + water_color, + intake_bucket_origin_x - bucket_length/4 - flow_width + 0.03, + intake_bucket_origin_y + 0.8 - spout_width/2, + flow_width, + 0.815 + bucket_length - spout_width/2); + } + + //Draw float + double float_base_height = 0.25; + fillSceneRect( g2d, + float_color, + timer_bucket_origin_x - bucket_length + bucket_length/4, + timer_bucket_origin_y - timer_offset + float_base_height, + bucket_length/2, + 0.25); + + double float_arm_origin_x = timer_bucket_origin_x - bucket_length + bucket_length * 0.45; + double float_arm_origin_y = timer_bucket_origin_y - timer_offset + clock_float_height + float_base_height; + fillSceneRect( g2d, + float_color, + float_arm_origin_x, + float_arm_origin_y, + bucket_length*0.1, + clock_float_height); + + double tooth_ratio = 2.25 * tooth.y[3]; + for(double ii = bucket_length/2.0; ii < (clock_float_height) ; ii += tooth_ratio) { + fillScenePoly(g2d, tooth, 0.0, float_arm_origin_x, ii + float_arm_origin_y - clock_float_height); + } + + //Draw Gear + double clock_origin_x = float_arm_origin_x - 1.85; + double clock_origin_y = 2.0; + double clock_diam = 2.5; + double gear_x = clock_origin_x + 0.85; + double gear_y = clock_origin_y; + double gear_width = 1.5; + double gear_noise = 0.3; //initial gear rotational offset + gear = new ScenePoly(); + gear.x = new double[] { 0, 0, 0, 0, 0}; + gear.y = new double[] { 0, 0, 0, 0, 0}; + gear.n = 5; + for(int ii = 0; ii < gear.n; ++ii) { + gear.x[ii] = tooth.x[ii]-(gear_width*0.5); + gear.y[ii] = tooth.y[ii]; + } + gear.n = 5; + double gear_circ = (Math.PI * (gear_width - (2*tooth.x[2]))); + int gear_count = (int)(gear_circ / tooth_ratio); + double gear_offset = ((timer_capacity * bucket_length) / gear_circ) * 2 * Math.PI; + gear_offset *= 3; //I don't know why, but this magic number makes the gear animation sync with the rack + gear.color = gear_color; + for(int ii = 0; ii < gear_count; ++ii) { + fillScenePoly(g2d, gear, (ii + gear_noise + gear_offset) * (360/gear_count) * (Math.PI/180), gear_x, gear_y); + } + fillSceneOval ( g2d, + gear_color, + gear_x, + gear_y, + gear_width*1.05, + gear_width*1.05); + + //Draw Clock + fillSceneOval ( g2d, + clock_color, + clock_origin_x, + clock_origin_y, + clock_diam, + clock_diam); + + double clock_display_length = 1.0; + double clock_display_origin_x = clock_origin_x - clock_display_length/2.0; + double clock_display_origin_y = clock_origin_y; + fillSceneRect( g2d, + clock_display_color, + clock_display_origin_x, + clock_display_origin_y, + clock_display_length, + clock_display_length); + + g2d.setFont(new Font("", Font.PLAIN, 24)); + g2d.setPaint(tick_color); + g2d.drawString ( String.format("%02d",current_tick), (int)(worldOriginX+scale*(clock_display_origin_x + clock_display_length*0.25)), (int)(worldOriginY-scale*(clock_display_origin_y - clock_display_length*0.6))); + + // Draw Information + g2d.setPaint(Color.BLACK); + g2d.setFont(new Font("", Font.PLAIN, 12)); + int string_height = 220; + g2d.drawString ( String.format("Input Flow Rate: [%.4f] cm^3/s",input_flow), 20,string_height+=20); + g2d.drawString ( String.format("Intake Water Level: [%.4f] cm",intake_lvl), 20,string_height+=20); + g2d.drawString ( String.format("Intake Water Volume: [%.4f] cm^3",intake_vol), 20,string_height+=20); + g2d.drawString ( String.format("Intake Overflow Rate: [%.4f] cm^3/s",overflow_rate), 20,string_height+=20); + g2d.drawString ( String.format("Intake Spout Rate: [%.4f] cm^3/s",spout_rate), 20,string_height+=20); + g2d.drawString ( String.format("Timer Water Level: [%.4f] cm",timer_lvl), 20,string_height+=20); + g2d.drawString ( String.format("Timer Water Volume: [%.4f] cm^3",timer_vol), 20,string_height+=20); + g2d.drawString ( String.format("Current Time Tick: [%d]",current_tick), 20,string_height+=20); + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + doDrawing(g); + } +} + +class TrickSimMode { + public static final int INIT = 0; + public static final int FREEZE = 1; + public static final int RUN = 5; +} + +class InputFlowCtrlPanel extends JPanel implements ChangeListener { + + static final int FLOW_MIN = 0; + static final int FLOW_MAX = 10000; + static final int FLOW_INIT = 1000; + + private RangeView rangeView; + private JSlider inputFlowSlider; + + public InputFlowCtrlPanel (RangeView view) { + rangeView = view; + setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); + + JLabel sliderLabel = new JLabel("", JLabel.CENTER); + sliderLabel.setAlignmentX(CENTER_ALIGNMENT); + + inputFlowSlider = new JSlider(JSlider.HORIZONTAL, FLOW_MIN, FLOW_MAX, FLOW_INIT); + inputFlowSlider.addChangeListener(this); + inputFlowSlider.setToolTipText("Input Flow Rate (cm^3/s)."); + inputFlowSlider.setMajorTickSpacing(1000); + inputFlowSlider.setMinorTickSpacing(100); + inputFlowSlider.setPaintTicks(true); + inputFlowSlider.setPaintLabels(true); + + add(sliderLabel); + add(inputFlowSlider); + } + + @Override + public void stateChanged(ChangeEvent e) { + JSlider source = (JSlider)e.getSource(); + if (!source.getValueIsAdjusting()) { + rangeView.setInputFlowSelect( source.getValue()); + rangeView.new_input_flow = true; + } + } + + public void setValue(int value) { + if (value > FLOW_MAX) value = FLOW_MAX; + if (value < FLOW_MIN) value = FLOW_MIN; + inputFlowSlider.setValue(value); + } +} + +class ControlPanel extends JPanel implements ActionListener { + + private RangeView rangeView; + private InputFlowCtrlPanel inputFlowCtrlPanel; + + public ControlPanel(RangeView view) { + + rangeView = view; + setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); + + JPanel labeledInputFlowCtrlPanel = new JPanel(); + labeledInputFlowCtrlPanel.setLayout(new BoxLayout(labeledInputFlowCtrlPanel, BoxLayout.Y_AXIS)); + JLabel inputFlowCtrlLabel = new JLabel("Input Flow Rate (cm^3/s)"); + inputFlowCtrlLabel.setAlignmentX(Component.CENTER_ALIGNMENT); + labeledInputFlowCtrlPanel.add(inputFlowCtrlLabel); + inputFlowCtrlPanel = new InputFlowCtrlPanel(rangeView); + labeledInputFlowCtrlPanel.add( inputFlowCtrlPanel ); + add(labeledInputFlowCtrlPanel); + + } + + public void actionPerformed(ActionEvent e) { + String s = e.getActionCommand(); + switch (s) { + default: + System.out.println("Unknown Action Command:" + s); + break; + } + } +} // class ControlPanel + +public class WaterClockDisplay extends JFrame { + + private RangeView rangeView; + private BufferedReader in; + private DataOutputStream out; + private JPanel panelGroup0; + private JPanel panelGroup1; + private ControlPanel controlPanel; + + public WaterClockDisplay(RangeView arena) { + setTitle("Water Clock"); + + rangeView = arena; + + panelGroup1 = new JPanel(); + panelGroup1.setLayout(new BoxLayout(panelGroup1, BoxLayout.X_AXIS)); + panelGroup1.add(rangeView); + + controlPanel = new ControlPanel(rangeView); + + panelGroup0 = new JPanel(); + panelGroup0.setLayout(new BoxLayout(panelGroup0, BoxLayout.Y_AXIS)); + panelGroup0.add(panelGroup1); + panelGroup0.add(controlPanel); + + add(panelGroup0); + + rangeView.setScale(64); + + setSize(800, 500); + setLocationRelativeTo(null); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setFocusable(true); + + } + + public void connectToServer(String host, int port ) throws IOException { + Socket socket = new Socket(host, port); + in = new BufferedReader( new InputStreamReader( socket.getInputStream())); + out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream())); + } + + public void drawRangeView() { + rangeView.repaint(); + } + + private static void printHelpText() { + System.out.println( + "----------------------------------------------------------------------\n" + + "usage: java jar WaterClockDisplay.jar \n" + + "----------------------------------------------------------------------\n" + ); + } + + public enum ModelState { INACTIVE, READY, ACTIVE } + + public static void main(String[] args) throws IOException, InterruptedException { + + String host = "localHost"; + int port = 0; + boolean boom = false; + + int ii = 0; + while (ii < args.length) { + switch (args[ii]) { + case "-help" : + case "--help" : { + printHelpText(); + System.exit(0); + } break; + default : { + port = (Integer.parseInt(args[ii])); + } break; + } + ++ii; + } + + boolean go = true; + double dt = 0.100; // Time between updates (seconds). + double spout_rate = 0.0; + double overflow_rate = 0.0; + double intake_depth = 0.0; + double timer_depth = 0.0; + double intake_lvl = 0.0; + double timer_lvl = 0.0; + double intake_vol = 0.0; + double timer_vol = 0.0; + double spout_height = 0.0; + double overflow_height = 0.0; + double input_flow = 0.0; + double flow_select = 0.0; + int tick = 0; + + // Outbound command variables + int simMode = 0; + boolean standalone = false; + + int mapScale = 32 ; // pixels per meter. + + RangeView rangeView = new RangeView( mapScale); + WaterClockDisplay waterClockDisplay = new WaterClockDisplay( rangeView); + waterClockDisplay.setVisible(true); + waterClockDisplay.drawRangeView(); + + if (go) { + if (port == 0) { + System.out.println("No variable server port specified."); + printHelpText(); + System.exit(0); + } + + // Connect to the Trick simulation's variable server + System.out.println("Connecting to: " + host + ":" + port); + waterClockDisplay.connectToServer(host, port); + + waterClockDisplay.out.writeBytes("trick.var_set_client_tag(\"WaterClockDisplay\") \n"); + waterClockDisplay.out.flush(); + + // Have the Variable Server send us the simulation mode ONCE. + waterClockDisplay.out.writeBytes( "trick.var_add(\"trick_sys.sched.mode\")\n" + + "trick.var_send() \n" + + "trick.var_clear() \n"); + waterClockDisplay.out.flush(); + + // Read the response and extract the simulation mode. + try { + String line; + String field[]; + line = waterClockDisplay.in.readLine(); + field = line.split("\t"); + simMode = Integer.parseInt( field[1]); + } catch (IOException | NullPointerException e ) { + go = false; + } + + // Configure the Variable Server to cyclically send us the following varibales. + // Tell the variable server: + // 1) We want the values of the following variables: + waterClockDisplay.out.writeBytes( "trick.var_pause() \n" + + "trick.var_add(\"dyn.waterclock.intake_clock_spout_flowrate\")\n" + + "trick.var_add(\"dyn.waterclock.intake_overflow_flowrate\")\n" + + "trick.var_add(\"dyn.waterclock.intake_bucket_depth\")\n" + + "trick.var_add(\"dyn.waterclock.timer_bucket_depth\")\n" + + "trick.var_add(\"dyn.waterclock.intake_water_level\")\n" + + "trick.var_add(\"dyn.waterclock.timer_water_level\")\n" + + "trick.var_add(\"dyn.waterclock.intake_bucket_vol\")\n" + + "trick.var_add(\"dyn.waterclock.timer_bucket_vol\")\n" + + "trick.var_add(\"dyn.waterclock.intake_clock_spout_height\")\n" + + "trick.var_add(\"dyn.waterclock.intake_overflow_height\")\n" + + "trick.var_add(\"dyn.waterclock.input_flow\")\n" + + "trick.var_add(\"dyn.waterclock.current_tick\")\n" + + "trick.var_add(\"trick_sys.sched.mode\")\n" + + // 2) We want the responses in ASCII: + "trick.var_ascii() \n" + + // 3) We want values to be updated at the specified rate: + String.format("trick.var_cycle(%.3f)\n", dt) + + // 4) Start sending values as specified. + "trick.var_unpause() \n" ); + waterClockDisplay.out.flush(); + } // if go + + while (go) { + + // Recieve and parse periodic data response from the variable server. + try { + String line; + String field[]; + line = waterClockDisplay.in.readLine(); + field = line.split("\t"); + spout_rate = Double.parseDouble( field[1]); + overflow_rate = Double.parseDouble( field[2]); + intake_depth = Double.parseDouble( field[3]); + timer_depth = Double.parseDouble( field[4]); + intake_lvl = Double.parseDouble( field[5]); + timer_lvl = Double.parseDouble( field[6]); + intake_vol = Double.parseDouble( field[7]); + timer_vol = Double.parseDouble( field[8]); + spout_height = Double.parseDouble( field[9]); + overflow_height = Double.parseDouble( field[10]); + input_flow = Double.parseDouble( field[11]); + tick = Integer.parseInt( field[12]); + simMode = Integer.parseInt( field[13]); + } catch (IOException | NullPointerException e ) { + go = false; + } + + // Update the display data. + rangeView.setSpoutRate(spout_rate); + rangeView.setOverflowRate(overflow_rate); + rangeView.setIntakeDepth(intake_depth); + rangeView.setTimerDepth(timer_depth); + rangeView.setIntakeWarerLevel(intake_lvl); + rangeView.setTimerWarerLevel(timer_lvl); + rangeView.setIntakeWaterVol(intake_vol); + rangeView.setTimerWaterLevel(timer_vol); + rangeView.setSpoutHeight(spout_height); + rangeView.setOverflowHeight(overflow_height); + rangeView.setInputFlow(input_flow); + rangeView.setCurrentTick(tick); + + if(rangeView.new_input_flow) { + flow_select = rangeView.getInputFlowSelect(); + waterClockDisplay.out.writeBytes( String.format("dyn.waterclock.input_flow = %f ;\n", flow_select )); + rangeView.new_input_flow = false; + } + + waterClockDisplay.out.flush(); + + // Update the scene. + waterClockDisplay.drawRangeView(); + + } // while + } // main +} // class diff --git a/trick_sims/SIM_waterclock/models/waterclock/include/waterclock.h b/trick_sims/SIM_waterclock/models/waterclock/include/waterclock.h new file mode 100644 index 00000000..15d1377b --- /dev/null +++ b/trick_sims/SIM_waterclock/models/waterclock/include/waterclock.h @@ -0,0 +1,76 @@ +/************************************************************************* +PURPOSE: (Represent the state and initial conditions of the water clock) +**************************************************************************/ +#ifndef WATERCLOCK_H +#define WATERCLOCK_H + +#include "trick/regula_falsi.h" + +typedef struct { + + + ////////////////////////// + + /* ASSUMPTIONS + * 1) For the purpose of determining if a pipe is submerged, it will be treated as a single point at the center of the pipe + * 2) When the timing bucket is filled, a siphon will drain it instaneously + * 3) Buckets are cylindrical + */ + + /* DESCRIPTION + * This is a simulation of a simple water clock. The clock consists of two cylinders (buckets). + * The first bucket is known as the intake bucket. It receives water from an unspecified external source (like a stream). + * The intake bucket has two cylindrical spouts extending from its sides, one known as an overflow spout and the other the clock spout. + * The overflow spout is simply for maintaing an equilibrium of the water level. It keeps the intake bucket from exceeding a certain water level, thus ensuring it's water level is consistent. + * The clock spout pours water into the second bucket (timer bucket). In an ideal clock, the water level of the intake bucket will remain consistent, meaning the clock spout will output at a constant rate and operate as an accurate clock. + * The timer bucket receives water from the clock spout. The timer bucket has no spouts, it fills until it is full, upon which a siphon instantaneously drains it. + * There exists a float in the timer bucket, connected to an arrow which will point to vertical tick marks. As the timer bucket fills, the arrow will move vertically along these ticks, indicating how much time has passed. + * Depending on the configuration of the clock (size of the buckets, size of the spouts, external water source rate, and the number/spacing of ticks) you can create a clock that tracks a variety of times. + */ + + double time; /* s Model time */ + + double input_flow; /* cm^3/s Flow rate of the external water source to the water clock */ + double intake_clock_spout_flowrate; /* cm^3/s Intake bucket output spout pipe flow rate */ + double intake_overflow_flowrate; /* cm^3/s Intake bucket overflow pipe flow rate */ + double intake_bucket_net_flow; /* cm^3/s Intake bucket net flow rate */ + + double intake_bucket_depth; /* cm Intake bucket depth */ + double intake_bucket_diam; /* cm Intake bucket diameter */ + + double intake_overflow_height; /* cm Intake bucket overflow pipe height of center */ + double intake_overflow_diameter; /* cm Intake bucket overflow pipe diameter */ + + double intake_clock_spout_height; /* cm Intake bucket output spout pipe height of center */ + double intake_clock_spout_diameter; /* cm Intake bucket output spout pipe diameter */ + + double timer_bucket_depth; /* cm Timer bucket depth */ + double timer_bucket_diam; /* cm Timer bucket diameter */ + + double intake_bucket_vol; /* cm^3 Intake bucket water volume */ + double intake_water_level; /* cm Intake bucket water level */ + double timer_bucket_vol; /* cm^3 Timer bucket water volume */ + double timer_water_level; /* cm Timer bucket water level */ + + double tick_gap; /* cm Distance between tick marks */ + int total_ticks; /* -- Total number of ticks on the timer */ + int current_tick; /* -- The current timer tick to have crossed the threshold*/ + + double gravity; /* m/s^2 Gravity constant */ + + REGULA_FALSI rf1 ; + REGULA_FALSI rf2 ; + +} WATERCLOCK ; + +#ifdef __cplusplus +extern "C" { +#endif + int waterclock_default_data(WATERCLOCK*) ; + int waterclock_init(WATERCLOCK*) ; + int waterclock_shutdown(WATERCLOCK*) ; +#ifdef __cplusplus +} +#endif + +#endif diff --git a/trick_sims/SIM_waterclock/models/waterclock/include/waterclock_numeric.h b/trick_sims/SIM_waterclock/models/waterclock/include/waterclock_numeric.h new file mode 100644 index 00000000..eff39022 --- /dev/null +++ b/trick_sims/SIM_waterclock/models/waterclock/include/waterclock_numeric.h @@ -0,0 +1,21 @@ +/************************************************************************* +PURPOSE: ( Water Clock Numeric Model ) +**************************************************************************/ + +#ifndef WATRERCLOCK_NUMERIC_H +#define WATERCLOCK_NUMERIC_H + +#include "waterclock.h" + +#ifdef __cplusplus +extern "C" { +#endif +int waterclock_integ(WATERCLOCK*); +int waterclock_deriv(WATERCLOCK*); +double waterclock_tick_change(WATERCLOCK*); +double waterclock_overflow_timer(WATERCLOCK*); +void waterclock_update_water_level(WATERCLOCK* WC); +#ifdef __cplusplus +} +#endif +#endif diff --git a/trick_sims/SIM_waterclock/models/waterclock/src/waterclock_init.c b/trick_sims/SIM_waterclock/models/waterclock/src/waterclock_init.c new file mode 100644 index 00000000..26437d17 --- /dev/null +++ b/trick_sims/SIM_waterclock/models/waterclock/src/waterclock_init.c @@ -0,0 +1,59 @@ +/******************************* TRICK HEADER **************************** +PURPOSE: (Set the initial data values) +*************************************************************************/ + +/* Model Include files */ +#include +#include "../include/waterclock.h" + +/* default data job */ +int waterclock_default_data( WATERCLOCK* WC ) { + + WC->time = 0.0 ; + + WC->input_flow = 1000; + WC->intake_clock_spout_flowrate = 0.0; + WC->intake_overflow_flowrate = 0.0; + + WC->intake_bucket_depth = 100.0; + WC->intake_bucket_diam = 500.0; + + WC->intake_overflow_height = 080.0 * WC->intake_bucket_depth; + WC->intake_overflow_diameter = 100.0; + + WC->intake_clock_spout_height = 010.0; + WC->intake_clock_spout_diameter = 005.0; + + WC->timer_bucket_depth = 120.0; + WC->timer_bucket_diam = 050.0; + + WC->intake_bucket_vol = 0.0; + WC->timer_bucket_vol = 0.0; + + WC->total_ticks = 5; + WC->current_tick = 0; + + WC->gravity = 9.81; + + return 0 ; +} + +/* initialization job */ +int waterclock_init( WATERCLOCK* WC) { + + if (WC->intake_overflow_height > WC->intake_bucket_depth) { + WC->intake_overflow_height = WC->intake_bucket_depth; + } + if (WC->intake_clock_spout_height > WC->intake_bucket_depth) { + WC->intake_clock_spout_height = WC->intake_bucket_depth; + } + if (WC->intake_overflow_height < 0) { + WC->intake_overflow_height = 0; + } + if (WC->intake_clock_spout_height < 0) { + WC->intake_clock_spout_height = 0; + } + WC->tick_gap = WC->timer_bucket_depth / WC->total_ticks ; + + return 0 ; +} diff --git a/trick_sims/SIM_waterclock/models/waterclock/src/waterclock_numeric.c b/trick_sims/SIM_waterclock/models/waterclock/src/waterclock_numeric.c new file mode 100644 index 00000000..f7a2ec7b --- /dev/null +++ b/trick_sims/SIM_waterclock/models/waterclock/src/waterclock_numeric.c @@ -0,0 +1,124 @@ +/********************************************************************* + PURPOSE: ( Trick numeric ) +*********************************************************************/ +#include +#include +#include +#include "trick/integrator_c_intf.h" +#include "../include/waterclock_numeric.h" +#include "trick/exec_proto.h" +#include "trick/message_proto.h" +#include + +int waterclock_deriv(WATERCLOCK* WC) { + + //Make sure water level is up to date + waterclock_update_water_level(WC); + + //Clock spout area + double spout_radius = WC->intake_clock_spout_diameter / 2; + double spout_area = M_PI * spout_radius * spout_radius; + + //Overflow spout area + double overflow_radius = WC->intake_overflow_diameter / 2; + double overflow_area = M_PI * overflow_radius * overflow_radius; + + //Calculate flow rate using Torricelli's equation ( V = sqrt(2gh) ) to find water velocity. Multiple velocity by spout area to find flow rate. + //Calculate input bucket spout flow rate. + if(WC->intake_water_level > WC->intake_clock_spout_height) + WC->intake_clock_spout_flowrate = spout_area * sqrt(2 * WC->gravity * (WC->intake_water_level - WC->intake_clock_spout_height) ); + else + WC->intake_clock_spout_flowrate = 0.0; + + //Calculate input bucket over flow rate + if(WC->intake_water_level > WC->intake_overflow_height) + WC->intake_overflow_flowrate = overflow_area * sqrt(2 * WC->gravity * (WC->intake_water_level - WC->intake_overflow_height) ); + else + WC->intake_overflow_flowrate = 0.0; + + //Need to know net flow of the source, overflow spout, and clock spout for integration + WC->intake_bucket_net_flow = WC->input_flow - WC->intake_clock_spout_flowrate - WC->intake_overflow_flowrate; + + return(0); +} + +int waterclock_integ(WATERCLOCK* WC) { + int ipass; + + load_state( + &WC->intake_bucket_vol, + &WC->timer_bucket_vol, + NULL); + + load_deriv( + &WC->intake_bucket_net_flow, + &WC->intake_clock_spout_flowrate, + NULL); + + ipass = integrate(); + + unload_state( + &WC->intake_bucket_vol, + &WC->timer_bucket_vol, + NULL ); + + waterclock_update_water_level(WC); + + return(ipass); +} + +//Since we are inetgrating over water volume, we must convert volume to water level in order to track how quickly the timer bucket is filling up. +void waterclock_update_water_level(WATERCLOCK* WC) +{ + //Calculate Input bucket water level + double intake_bucket_radius = WC->intake_bucket_diam / 2; + double intake_bucket_base = M_PI * intake_bucket_radius * intake_bucket_radius; + WC->intake_water_level = WC->intake_bucket_vol / intake_bucket_base; + + //Calculate Timer bucket water level + double timer_bucket_radius = WC->timer_bucket_diam / 2; + double timer_bucket_base = M_PI * timer_bucket_radius * timer_bucket_radius; + WC->timer_water_level = WC->timer_bucket_vol / timer_bucket_base; + +} + +//When timer bucket fills, drain it instantly (we have a magic siphon) +double waterclock_overflow_timer( WATERCLOCK* WC ) { + double tgo; + double now; + + WC->rf1.error = WC->timer_bucket_depth - WC->timer_water_level; + now = get_integ_time(); + tgo = regula_falsi( now, &(WC->rf1) ); + if (tgo == 0.0) { + now = get_integ_time() ; + reset_regula_falsi( now, &(WC->rf1) ) ; + WC->timer_water_level = 0; //Instantly drains + WC->timer_bucket_vol = 0; //Instantly drains + WC->current_tick = 0; + message_publish(MSG_NORMAL, "WATER CLOCK RESET\n" ) ; + } + return (tgo) ; +} + +//Detect when the arrow has passed a new tick, print some diagnostics. +double waterclock_tick_change( WATERCLOCK* WC ) { + double tgo; + double now; + + WC->rf2.error = WC->tick_gap - (WC->timer_water_level - ( WC->current_tick * WC->tick_gap )); + now = get_integ_time(); + tgo = regula_falsi( now, &(WC->rf2) ); + if (tgo == 0.0) { + now = get_integ_time() ; + reset_regula_falsi( now, &(WC->rf2) ) ; + if( (WC->current_tick < WC->total_ticks) && (WC->current_tick >= 0) ) + { + WC->current_tick += 1; + message_publish(MSG_NORMAL, "Tick %d, Sim Time %f, Water Level %f\n", WC->current_tick, exec_get_sim_time(), WC->timer_water_level) ; + } + else + fprintf(stderr, "ERROR, SOMETHING WENT VERY WRONG!\n" ) ; + } + return (tgo) ; +} diff --git a/trick_sims/SIM_waterclock/models/waterclock/src/waterclock_shutdown.c b/trick_sims/SIM_waterclock/models/waterclock/src/waterclock_shutdown.c new file mode 100644 index 00000000..17486af8 --- /dev/null +++ b/trick_sims/SIM_waterclock/models/waterclock/src/waterclock_shutdown.c @@ -0,0 +1,13 @@ +/************************************************************************ +PURPOSE: (Shutdown the sim) +*************************************************************************/ +#include +#include "../include/waterclock.h" +#include "trick/exec_proto.h" + +int waterclock_shutdown( WATERCLOCK* WC) { + printf( "========================================\n"); + printf( " Water Clock Shutdown \n"); + printf( "========================================\n"); + return 0 ; +} diff --git a/trick_sims/SIM_waterclock/waterclock.tv b/trick_sims/SIM_waterclock/waterclock.tv new file mode 100644 index 00000000..44dff879 --- /dev/null +++ b/trick_sims/SIM_waterclock/waterclock.tv @@ -0,0 +1,96 @@ + + + 0.5 + + dyn.waterclock.intake_overflow_flowrate + + 0.0 + Decimal + + Valid + m^3/s + + + dyn.waterclock.intake_clock_spout_flowrate + + 0.0 + Decimal + + Valid + m^3/s + + + dyn.waterclock.intake_bucket_depth + + 5.0 + Decimal + + Valid + m + + + dyn.waterclock.intake_overflow_height + + 4.0 + Decimal + + Valid + m + + + dyn.waterclock.intake_clock_spout_height + + 0.25 + Decimal + + Valid + m + + + dyn.waterclock.intake_water_level + + 0.0 + Decimal + + Valid + m + + + dyn.waterclock.total_ticks + + 60 + false + Decimal + + Valid + -- + + + dyn.waterclock.current_tick + + 0 + false + Decimal + + Valid + -- + + + dyn.waterclock.timer_bucket_depth + + 5.133689839572193 + Decimal + + Valid + m + + + dyn.waterclock.timer_water_level + + 0.0 + Decimal + + Valid + m + + diff --git a/trick_sims/SIM_waterclock/waterclock_debug.tv b/trick_sims/SIM_waterclock/waterclock_debug.tv new file mode 100644 index 00000000..228c6d81 --- /dev/null +++ b/trick_sims/SIM_waterclock/waterclock_debug.tv @@ -0,0 +1,141 @@ + + + 0.5 + + dyn.waterclock.intake_overflow_flowrate + + 0.0 + Decimal + + Valid + m^3/s + + + dyn.waterclock.intake_clock_spout_flowrate + + 0.0 + Decimal + + Valid + m^3/s + + + dyn.waterclock.intake_bucket_depth + + 1.0 + Decimal + + Valid + m + + + dyn.waterclock.intake_overflow_height + + 0.8 + Decimal + + Valid + m + + + dyn.waterclock.intake_clock_spout_height + + 0.1 + Decimal + + Valid + m + + + dyn.waterclock.intake_water_level + + 0.0 + Decimal + + Valid + m + + + dyn.waterclock.intake_bucket_vol + + 0.0 + Decimal + + Valid + m^3 + + + dyn.waterclock.timer_bucket_depth + + 2.3077 + Decimal + + Valid + m + + + dyn.waterclock.timer_water_level + + 0.0 + Decimal + + Valid + m + + + dyn.waterclock.timer_bucket_vol + + 0.0 + Decimal + + Valid + m^3 + + + dyn.waterclock.rf1.error + + 0.0 + Decimal + + Valid + -- + + + dyn.waterclock.rf2.error + + 0.0 + Decimal + + Valid + -- + + + dyn.waterclock.tick_gap + + 0.03846166666666666 + Decimal + + Valid + m + + + dyn.waterclock.total_ticks + + 60 + false + Decimal + + Valid + -- + + + dyn.waterclock.current_tick + + 0 + false + Decimal + + Valid + -- + + From 5065d96a15940cd9f5dacad37a10a6f28ba96d44 Mon Sep 17 00:00:00 2001 From: jmpenn Date: Thu, 18 Apr 2024 11:41:35 -0500 Subject: [PATCH 07/52] =?UTF-8?q?Pre-increment=20(rather=20than=20post-inc?= =?UTF-8?q?rement)=20STL=20iterators=20in=20for=20loops=E2=80=A6=20(#1692)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Pre-increment (rather than post-increment) STL iterators in for loops. #1594 * Fix a goof. #1594 --- include/trick/ClassSizeCheck.hh | 2 +- include/trick/checkpoint_sequence_stl.hh | 4 +-- .../src/SegmentedExecutive.cpp | 22 ++++++++-------- trick_sims/ODE/models/DrawStuff/DrawStuff.cpp | 4 +-- .../Interface_Code_Gen/ClassValues.cpp | 14 +++++----- .../Interface_Code_Gen/ClassVisitor.cpp | 6 ++--- .../Interface_Code_Gen/CommentSaver.cpp | 2 +- .../Interface_Code_Gen/FieldDescription.cpp | 2 +- .../Interface_Code_Gen/FieldVisitor.cpp | 2 +- .../Interface_Code_Gen/FindTrickICG.cpp | 6 ++--- .../Interface_Code_Gen/HeaderSearchDirs.cpp | 26 +++++++++---------- .../Interface_Code_Gen/PrintAttributes.cpp | 6 ++--- .../DataRecord/DataRecordDispatcher.cpp | 2 +- .../DataRecord/DataRecordGroup.cpp | 4 +-- .../sim_services/Environment/Environment.cpp | 2 +- .../EventManager/EventProcessor.cpp | 2 +- .../Executive/Executive_add_jobs_to_queue.cpp | 2 +- .../Executive/Executive_get_job.cpp | 2 +- .../Executive/Executive_remove_jobs.cpp | 2 +- .../Executive/Executive_remove_sim_object.cpp | 6 ++--- .../Executive/Executive_restart.cpp | 8 +++--- .../Executive/Executive_set_job_cycle.cpp | 2 +- .../Executive/Executive_set_job_onoff.cpp | 2 +- .../FrameLog/FrameDataRecordGroup.cpp | 2 +- .../sim_services/FrameLog/FrameLog.cpp | 20 +++++++------- .../sim_services/InputProcessor/IPPython.cpp | 2 +- .../JITInputFile/JITInputFile.cpp | 2 +- .../JSONVariableServerThread.cpp | 2 +- .../MemoryManager/MemoryManager.cpp | 2 +- .../MemoryManager/test/MM_stl_checkpoint.cc | 2 +- .../sim_services/Message/MessagePublisher.cpp | 4 +-- .../sim_services/RealtimeInjector/RtiExec.cpp | 2 +- .../sim_services/RealtimeInjector/RtiList.cpp | 4 +-- .../RealtimeInjector/RtiStager.cpp | 2 +- .../sim_services/Sie/AttributesMap.cpp | 4 +-- .../sim_services/Sie/EnumAttributesMap.cpp | 4 +-- trick_source/sim_services/Sie/Sie.cpp | 6 ++--- .../sim_services/SimObject/SimObject.cpp | 10 +++---- .../UdUnits/map_trick_units_to_udunits.cpp | 2 +- .../sim_services/UnitTest/UnitTest.cpp | 8 +++--- .../sim_services/UnitsMap/UnitsMap.cpp | 2 +- .../VariableServer/VariableServer.cpp | 2 +- .../VariableServer_copy_and_write_freeze.cpp | 2 +- ...Server_copy_and_write_freeze_scheduled.cpp | 2 +- ...ariableServer_copy_and_write_scheduled.cpp | 2 +- .../VariableServer_copy_and_write_top.cpp | 2 +- .../VariableServer_freeze_init.cpp | 2 +- ...riableServer_get_next_freeze_call_time.cpp | 2 +- ...VariableServer_get_next_sync_call_time.cpp | 2 +- .../trick_swig/PrimitiveAttributesMap.cpp | 2 +- .../CivetServer/src/VariableServerSession.cpp | 8 +++--- 51 files changed, 118 insertions(+), 118 deletions(-) diff --git a/include/trick/ClassSizeCheck.hh b/include/trick/ClassSizeCheck.hh index b132f2d3..983e81e7 100644 --- a/include/trick/ClassSizeCheck.hh +++ b/include/trick/ClassSizeCheck.hh @@ -61,7 +61,7 @@ namespace Trick { */ void print_nonzero_diffs() { std::map::iterator it ; - for ( it = name_to_diff.begin() ; it != name_to_diff.end() ; it++ ) { + for ( it = name_to_diff.begin() ; it != name_to_diff.end() ; ++it ) { int curr_diff = it->second.diff ; ATTRIBUTES * attr = Trick::AttributesMap::attributes_map()->get_attr(it->first) ; unsigned int ii ; diff --git a/include/trick/checkpoint_sequence_stl.hh b/include/trick/checkpoint_sequence_stl.hh index ce616692..11c147d0 100644 --- a/include/trick/checkpoint_sequence_stl.hh +++ b/include/trick/checkpoint_sequence_stl.hh @@ -64,7 +64,7 @@ int checkpoint_sequence_i(STL & in_stl , std::string object_name , std::string v //message_publish(1, "CHECKPOINT_SEQUENCE_STL with %s\n", var_declare) ; /* copy the contents of the stl */ - for ( ii = 0 , it = in_stl.begin() , end = in_stl.end() ; it != end ; it++ , ii++ ) { + for ( ii = 0 , it = in_stl.begin() , end = in_stl.end() ; it != end ; ++it , ii++ ) { items[ii] = *it ; } } @@ -103,7 +103,7 @@ int checkpoint_sequence_s(STL & in_stl , std::string object_name , std::string v //message_publish(1, "CHECKPOINT_SEQUENCE_STL_STL with %s\n", temp_str.c_str()) ; /* create the names of the sub stl checkpoint names we're going to be using */ - for ( ii = 0 , it = in_stl.begin() , end = in_stl.end() ; it != end ; it++ , ii++ ) { + for ( ii = 0 , it = in_stl.begin() , end = in_stl.end() ; it != end ; ++it , ii++ ) { std::ostringstream sub_elements ; sub_elements << object_name << "_" << var_name << "_" << ii ; items[ii] = sub_elements.str() ; diff --git a/test/SIM_segments/models/SegmentedExecutive/src/SegmentedExecutive.cpp b/test/SIM_segments/models/SegmentedExecutive/src/SegmentedExecutive.cpp index 6c72684f..5f217705 100644 --- a/test/SIM_segments/models/SegmentedExecutive/src/SegmentedExecutive.cpp +++ b/test/SIM_segments/models/SegmentedExecutive/src/SegmentedExecutive.cpp @@ -19,7 +19,7 @@ int Trick::SegmentedExecutive::add_segment( Trick::Segment * ps ) { // Gets the job class to job queue map for this segment and adds the job classes to the executive. std::map < std::string , Trick::ScheduledJobQueue * >::iterator it ; - for ( it = ps->get_job_queues().begin() ; it != ps->get_job_queues().end() ; it++ ) { + for ( it = ps->get_job_queues().begin() ; it != ps->get_job_queues().end() ; ++it ) { class_map[(*it).first] = num_classes ; class_to_queue[num_classes++] = (*it).second ; } @@ -41,7 +41,7 @@ int Trick::SegmentedExecutive::gather_segmented_jobs() { std::map < std::string , Trick::Segment * >::iterator mit ; std::set< std::string > segment_tags ; - for ( mit = segment_map.begin() ; mit != segment_map.end() ; mit++ ) { + for ( mit = segment_map.begin() ; mit != segment_map.end() ; ++mit ) { segment_tags.insert((*mit).first) ; } @@ -129,7 +129,7 @@ int Trick::SegmentedExecutive::segment_set_jobs_onoff() { Trick::JobData * job ; std::set < Trick::JobData * >::iterator it ; - for ( it = all_segmented_jobs.begin() ; it != all_segmented_jobs.end() ; it++ ) { + for ( it = all_segmented_jobs.begin() ; it != all_segmented_jobs.end() ; ++it ) { job = *it ; // Test to see if the next segment is present in the job tags. // Set the disabled flag to the negation of the tag's presence @@ -164,10 +164,10 @@ int Trick::SegmentedExecutive::write_s_job_execution(FILE *fp) { fprintf(fp, "Segment Jobs:\n") ; std::map < std::string , Trick::Segment * >::iterator pmit ; - for ( pmit = segment_map.begin() ; pmit != segment_map.end() ; pmit++ ) { + for ( pmit = segment_map.begin() ; pmit != segment_map.end() ; ++pmit ) { Trick::Segment * pb = (*pmit).second ; std::map < std::string , Trick::ScheduledJobQueue * >::iterator jqit ; - for ( jqit = pb->get_job_queues().begin() ; jqit != pb->get_job_queues().end() ; jqit++ ) { + for ( jqit = pb->get_job_queues().begin() ; jqit != pb->get_job_queues().end() ; ++jqit ) { (*jqit).second->write_non_sched_queue(fp) ; } } @@ -187,10 +187,10 @@ int Trick::SegmentedExecutive::instrument_job_before( Trick::JobData * instrumen //go through all of the segmented jobs and instrument them. std::map < std::string , Trick::Segment * >::iterator pmit ; - for ( pmit = segment_map.begin() ; pmit != segment_map.end() ; pmit++ ) { + for ( pmit = segment_map.begin() ; pmit != segment_map.end() ; ++pmit ) { Trick::Segment * pb = (*pmit).second ; std::map < std::string , Trick::ScheduledJobQueue * >::iterator jqit ; - for ( jqit = pb->get_job_queues().begin() ; jqit != pb->get_job_queues().end() ; jqit++ ) { + for ( jqit = pb->get_job_queues().begin() ; jqit != pb->get_job_queues().end() ; ++jqit ) { (*jqit).second->instrument_before(instrument_job) ; } } @@ -209,10 +209,10 @@ int Trick::SegmentedExecutive::instrument_job_after( Trick::JobData * instrument //go through all of the segmented jobs and instrument them. std::map < std::string , Trick::Segment * >::iterator pmit ; - for ( pmit = segment_map.begin() ; pmit != segment_map.end() ; pmit++ ) { + for ( pmit = segment_map.begin() ; pmit != segment_map.end() ; ++pmit ) { Trick::Segment * pb = (*pmit).second ; std::map < std::string , Trick::ScheduledJobQueue * >::iterator jqit ; - for ( jqit = pb->get_job_queues().begin() ; jqit != pb->get_job_queues().end() ; jqit++ ) { + for ( jqit = pb->get_job_queues().begin() ; jqit != pb->get_job_queues().end() ; ++jqit ) { (*jqit).second->instrument_after(instrument_job) ; } } @@ -226,10 +226,10 @@ int Trick::SegmentedExecutive::instrument_job_remove(std::string in_job) { Trick::Executive::instrument_job_remove( in_job ) ; std::map < std::string , Trick::Segment * >::iterator pmit ; - for ( pmit = segment_map.begin() ; pmit != segment_map.end() ; pmit++ ) { + for ( pmit = segment_map.begin() ; pmit != segment_map.end() ; ++pmit ) { Trick::Segment * pb = (*pmit).second ; std::map < std::string , Trick::ScheduledJobQueue * >::iterator jqit ; - for ( jqit = pb->get_job_queues().begin() ; jqit != pb->get_job_queues().end() ; jqit++ ) { + for ( jqit = pb->get_job_queues().begin() ; jqit != pb->get_job_queues().end() ; ++jqit ) { (*jqit).second->instrument_remove(in_job) ; } } diff --git a/trick_sims/ODE/models/DrawStuff/DrawStuff.cpp b/trick_sims/ODE/models/DrawStuff/DrawStuff.cpp index 4eec2295..ad335ed2 100644 --- a/trick_sims/ODE/models/DrawStuff/DrawStuff.cpp +++ b/trick_sims/ODE/models/DrawStuff/DrawStuff.cpp @@ -13,14 +13,14 @@ void DrawStuff::start() { void DrawStuff::step(int) { std::vector::iterator it ; - for( it = objects.begin() ; it != objects.end() ; it++ ) { + for( it = objects.begin() ; it != objects.end() ; ++it ) { (*it)->draw() ; } } void DrawStuff::command(int cmd) { std::vector::iterator it ; - for( it = objects.begin() ; it != objects.end() ; it++ ) { + for( it = objects.begin() ; it != objects.end() ; ++it ) { (*it)->command(cmd) ; } } diff --git a/trick_source/codegen/Interface_Code_Gen/ClassValues.cpp b/trick_source/codegen/Interface_Code_Gen/ClassValues.cpp index 9af34595..105e04c8 100644 --- a/trick_source/codegen/Interface_Code_Gen/ClassValues.cpp +++ b/trick_source/codegen/Interface_Code_Gen/ClassValues.cpp @@ -22,7 +22,7 @@ ClassValues::ClassValues() : ClassValues::~ClassValues() { std::vector::iterator fdit ; - for ( fdit = field_descripts.begin() ; fdit != field_descripts.end() ; fdit++ ) { + for ( fdit = field_descripts.begin() ; fdit != field_descripts.end() ; ++fdit ) { delete (*fdit) ; } } @@ -57,7 +57,7 @@ void ClassValues::addInheritedFieldDescriptions(std::vector std::vector::iterator fdit ; // Loop through the incoming inherited variable names - for ( fdit = in_fdes.begin() ; fdit != in_fdes.end() ; fdit++ ) { + for ( fdit = in_fdes.begin() ; fdit != in_fdes.end() ; ++fdit ) { (*fdit)->setBaseClassOffset( class_offset ) ; (*fdit)->setInherited( true ) ; @@ -72,7 +72,7 @@ void ClassValues::addInheritedFieldDescriptions(std::vector #else { #endif - for ( fdit = in_fdes.begin() ; fdit != in_fdes.end() ; fdit++ ) { + for ( fdit = in_fdes.begin() ; fdit != in_fdes.end() ; ++fdit ) { std::string in_name = (*fdit)->getName() ; // search existing names for incoming inherited variable name. @@ -113,7 +113,7 @@ void ClassValues::addInheritedFieldDescriptions(std::vector void ClassValues::saveInheritAncestry( ClassValues * in_cv ) { std::map< std::string , unsigned int >::iterator mit ; - for ( mit = in_cv->all_inherited_class_names_map.begin() ; mit != in_cv->all_inherited_class_names_map.end() ; mit++ ) { + for ( mit = in_cv->all_inherited_class_names_map.begin() ; mit != in_cv->all_inherited_class_names_map.end() ; ++mit ) { all_inherited_class_names_map[(*mit).first] += (*mit).second ; } @@ -123,7 +123,7 @@ void ClassValues::saveInheritAncestry( ClassValues * in_cv ) { void ClassValues::setContainerClassForFields() { std::vector::iterator fdit ; // Loop through all fields - for ( fdit = field_descripts.begin() ; fdit != field_descripts.end() ; fdit++ ) { + for ( fdit = field_descripts.begin() ; fdit != field_descripts.end() ; ++fdit ) { // Prepend the field container class with the current class name. (*fdit)->setContainerClass( name + "::" + (*fdit)->getContainerClass() ) ; } @@ -134,13 +134,13 @@ void ClassValues::clearAmbiguousVariables() { std::map< std::string , unsigned int >::iterator mit ; std::vector::iterator fdit ; - for ( mit = all_inherited_class_names_map.begin() ; mit != all_inherited_class_names_map.end() ; mit++ ) { + for ( mit = all_inherited_class_names_map.begin() ; mit != all_inherited_class_names_map.end() ; ++mit ) { // If a class in inherited more than once we have a diamond. We'll need to modify variables that were // inherited from that class. if ( (*mit).second > 1 ) { std::string str = (*mit).first + "::" ; // Loop through all fields testing for the diamond inherited class in the name. - for ( fdit = field_descripts.begin() ; fdit != field_descripts.end() ; fdit++ ) { + for ( fdit = field_descripts.begin() ; fdit != field_descripts.end() ; ++fdit ) { std::string fdit_name = (*fdit)->getName() ; size_t f = fdit_name.find(str) ; // If the variable contains the diamond class string, remove the diamond class qualification. diff --git a/trick_source/codegen/Interface_Code_Gen/ClassVisitor.cpp b/trick_source/codegen/Interface_Code_Gen/ClassVisitor.cpp index 0f9d70bd..c5ef77fc 100644 --- a/trick_source/codegen/Interface_Code_Gen/ClassVisitor.cpp +++ b/trick_source/codegen/Interface_Code_Gen/ClassVisitor.cpp @@ -210,7 +210,7 @@ bool CXXRecordVisitor::VisitCXXRecordDecl( clang::CXXRecordDecl *rec ) { } else { // Test all constructors to see if any of those are the default and public clang::CXXRecordDecl::ctor_iterator cit ; - for ( cit = rec->ctor_begin() ; cit != rec->ctor_end() ; cit++ ) { + for ( cit = rec->ctor_begin() ; cit != rec->ctor_end() ; ++cit ) { if ( ( !(*cit)->isDeleted() ) and (*cit)->isDefaultConstructor() and (*cit)->getAccess() == clang::AS_public ) { cval.setHasDefaultConstructor(true) ; } @@ -234,7 +234,7 @@ bool CXXRecordVisitor::VisitCXXRecordDecl( clang::CXXRecordDecl *rec ) { //std::cout << "parsing " << cval.getName() << std::endl ; //std::cout << " processing inheritance " << rec->getNumBases() << " " << rec->getNumVBases() << "" << std::endl ; clang::CXXRecordDecl::base_class_iterator bcii ; - for ( bcii = rec->bases_begin() ; bcii != rec->bases_end() ; bcii++ ) { + for ( bcii = rec->bases_begin() ; bcii != rec->bases_end() ; ++bcii ) { if ( !bcii->isVirtual() ) { const clang::Type * temp = bcii->getType().getTypePtr() ; //std::cout << "\ninherited Type = " << temp->getTypeClassName() << "" << std::endl ; @@ -282,7 +282,7 @@ bool CXXRecordVisitor::VisitCXXRecordDecl( clang::CXXRecordDecl *rec ) { // When processing inherited classes include_virtual_base will be set to true // so we don't process virtual inherited classes multiple times. if ( include_virtual_base ) { - for ( bcii = rec->vbases_begin() ; bcii != rec->vbases_end() ; bcii++ ) { + for ( bcii = rec->vbases_begin() ; bcii != rec->vbases_end() ; ++bcii ) { const clang::Type * temp = bcii->getType().getTypePtr() ; //std::cout << "\ninherited Type = " << temp->getTypeClassName() << "" << std::endl ; const clang::RecordType * rt = temp->getAs() ; diff --git a/trick_source/codegen/Interface_Code_Gen/CommentSaver.cpp b/trick_source/codegen/Interface_Code_Gen/CommentSaver.cpp index ef5aaf4d..33e3b74b 100644 --- a/trick_source/codegen/Interface_Code_Gen/CommentSaver.cpp +++ b/trick_source/codegen/Interface_Code_Gen/CommentSaver.cpp @@ -60,7 +60,7 @@ std::string CommentSaver::getTrickHeaderComment( std::string file_name ) { if ( resolved_path != NULL ) { if ( trick_header_comments.find(resolved_path) == trick_header_comments.end() ) { trick_header_comments[resolved_path] = std::string() ; - for ( cit = comment_map[resolved_path].begin() ; cit != comment_map[resolved_path].end() ; cit++ ) { + for ( cit = comment_map[resolved_path].begin() ; cit != comment_map[resolved_path].end() ; ++cit ) { std::string comment_str = getComment((*cit).second) ; if ( comment_str.find("@trick_parse") != std::string::npos or comment_str.find("\\trick_parse") != std::string::npos ) { diff --git a/trick_source/codegen/Interface_Code_Gen/FieldDescription.cpp b/trick_source/codegen/Interface_Code_Gen/FieldDescription.cpp index f1519ff2..2fd8a0aa 100644 --- a/trick_source/codegen/Interface_Code_Gen/FieldDescription.cpp +++ b/trick_source/codegen/Interface_Code_Gen/FieldDescription.cpp @@ -304,7 +304,7 @@ void FieldDescription::parseComment(std::string comment) { // escape special characters, convert tabs and newlines to spaces, remove multiple spaces. std::ostringstream ss ; bool is_space = false ; - for (std::string::iterator it = comment.begin(); it != comment.end(); it++) { + for (std::string::iterator it = comment.begin(); it != comment.end(); ++it) { switch (*it) { case '\\': ss << "\\\\"; is_space = false ; break; case '"': ss << "\\\""; is_space = false ; break; diff --git a/trick_source/codegen/Interface_Code_Gen/FieldVisitor.cpp b/trick_source/codegen/Interface_Code_Gen/FieldVisitor.cpp index 79bf2af8..e88d71d4 100644 --- a/trick_source/codegen/Interface_Code_Gen/FieldVisitor.cpp +++ b/trick_source/codegen/Interface_Code_Gen/FieldVisitor.cpp @@ -442,7 +442,7 @@ bool FieldVisitor::VisitRecordType(clang::RecordType *rt) { // Test if we have some type from STL. if (!tst_string.compare( 0 , 5 , "std::")) { // If we have some type from std, figure out if it is one we support. - for ( std::map::iterator it = stl_classes.begin() ; it != stl_classes.end() ; it++ ) { + for ( std::map::iterator it = stl_classes.begin() ; it != stl_classes.end() ; ++it ) { /* Mark STL types that are not strings and exit */ if (!tst_string.compare( 0 , (*it).first.size() , (*it).first)) { diff --git a/trick_source/codegen/Interface_Code_Gen/FindTrickICG.cpp b/trick_source/codegen/Interface_Code_Gen/FindTrickICG.cpp index eab21e2a..9501b1fc 100644 --- a/trick_source/codegen/Interface_Code_Gen/FindTrickICG.cpp +++ b/trick_source/codegen/Interface_Code_Gen/FindTrickICG.cpp @@ -80,7 +80,7 @@ void FindTrickICG::If(clang::SourceLocation Loc, clang::SourceRange ConditionRan if ( ref.str().find("TRICK_ICG") != std::string::npos ) { // for each header in the stack, mark them as being exposed to TRICK_ICG std::vector::iterator it ; - for ( it = included_files.begin() ; it != included_files.end() ; it++ ) { + for ( it = included_files.begin() ; it != included_files.end() ; ++it ) { hsd.addTrickICGFoundFile(*it) ; } // print warning messages. @@ -124,7 +124,7 @@ void FindTrickICG::Ifdef(clang::SourceLocation Loc, const clang::Token &MacroNam if ( (loc_str.find("S_source.hh") == std::string::npos) ) { // for each header in the stack, mark them as being exposed to TRICK_ICG std::vector::iterator it ; - for ( it = included_files.begin() ; it != included_files.end() ; it++ ) { + for ( it = included_files.begin() ; it != included_files.end() ; ++it ) { hsd.addTrickICGFoundFile(*it) ; } // print warning messages. @@ -149,7 +149,7 @@ void FindTrickICG::Ifndef(clang::SourceLocation Loc, const clang::Token &MacroNa std::string loc_str = Loc.printToString(ci.getSourceManager()) ; // for each header in the stack, mark them as being exposed to TRICK_ICG std::vector::iterator it ; - for ( it = included_files.begin() ; it != included_files.end() ; it++ ) { + for ( it = included_files.begin() ; it != included_files.end() ; ++it ) { hsd.addTrickICGFoundFile(*it) ; } // print warning messages. diff --git a/trick_source/codegen/Interface_Code_Gen/HeaderSearchDirs.cpp b/trick_source/codegen/Interface_Code_Gen/HeaderSearchDirs.cpp index a2fe7046..347c277e 100644 --- a/trick_source/codegen/Interface_Code_Gen/HeaderSearchDirs.cpp +++ b/trick_source/codegen/Interface_Code_Gen/HeaderSearchDirs.cpp @@ -186,13 +186,13 @@ void HeaderSearchDirs::ApplyHeaderSearchOptions () { clang::ApplyHeaderSearchOptions( hs , hso , pp.getLangOpts() , pp.getTargetInfo().getTriple() ) ; //clang::HeaderSearch::search_dir_iterator sdi ; /* - for ( sdi = hs.quoted_dir_begin() ; sdi != hs.quoted_dir_end() ; sdi++ ) { + for ( sdi = hs.quoted_dir_begin() ; sdi != hs.quoted_dir_end() ; ++sdi ) { std::cout << "quoted dir " << (*sdi).getName() << std::endl ; } - for ( sdi = hs.angled_dir_begin() ; sdi != hs.angled_dir_end() ; sdi++ ) { + for ( sdi = hs.angled_dir_begin() ; sdi != hs.angled_dir_end() ; ++sdi ) { std::cout << "angled dir " << (*sdi).getName() << std::endl ; } - for ( sdi = hs.system_dir_begin() ; sdi != hs.system_dir_end() ; sdi++ ) { + for ( sdi = hs.system_dir_begin() ; sdi != hs.system_dir_end() ; ++sdi ) { std::cout << "system dir " << (*sdi).getName() << std::endl ; } */ @@ -229,7 +229,7 @@ bool HeaderSearchDirs::isPathInUserDir (const std::string& in_dir ) { for ( clang::ConstSearchDirIterator sdi = hs.system_dir_begin() ; sdi != hs.system_dir_end() ; sdi = std::next(sdi) ) #else clang::HeaderSearch::search_dir_iterator sdi ; - for ( sdi = hs.system_dir_begin() ; sdi != hs.system_dir_end() ; sdi++ ) + for ( sdi = hs.system_dir_begin() ; sdi != hs.system_dir_end() ; ++sdi ) #endif { #if (LIBCLANG_MAJOR < 4) // TODO delete when RHEL 7 no longer supported @@ -261,7 +261,7 @@ bool HeaderSearchDirs::isPathInUserOrTrickDir (const std::string& in_dir ) { for ( clang::ConstSearchDirIterator sdi = hs.system_dir_begin() ; sdi != hs.system_dir_end() ; sdi = std::next(sdi) ) #else clang::HeaderSearch::search_dir_iterator sdi ; - for ( sdi = hs.system_dir_begin() ; sdi != hs.system_dir_end() ; sdi++ ) + for ( sdi = hs.system_dir_begin() ; sdi != hs.system_dir_end() ; ++sdi ) #endif { #if (LIBCLANG_MAJOR < 4) // TODO delete when RHEL 7 no longer supported @@ -279,7 +279,7 @@ bool HeaderSearchDirs::isPathInUserOrTrickDir (const std::string& in_dir ) { bool HeaderSearchDirs::isPathInExclude (const std::string& in_dir ) { std::vector::iterator vit ; - for ( vit = exclude_dirs.begin() ; vit != exclude_dirs.end() ; vit++ ) { + for ( vit = exclude_dirs.begin() ; vit != exclude_dirs.end() ; ++vit ) { if ( ! in_dir.compare(0, (*vit).size(), (*vit))) { return true ; } @@ -291,7 +291,7 @@ bool HeaderSearchDirs::isPathInExclude (const std::string& in_dir ) { bool HeaderSearchDirs::isPathInICGExclude (const std::string& in_dir ) { std::vector::iterator vit ; - for ( vit = icg_exclude_dirs.begin() ; vit != icg_exclude_dirs.end() ; vit++ ) { + for ( vit = icg_exclude_dirs.begin() ; vit != icg_exclude_dirs.end() ; ++vit ) { if ( ! in_dir.compare(0, (*vit).size(), (*vit))) { return true ; } @@ -303,7 +303,7 @@ bool HeaderSearchDirs::isPathInICGExclude (const std::string& in_dir ) { bool HeaderSearchDirs::isPathInExtLib (const std::string& in_dir ) { std::vector::iterator vit ; - for ( vit = ext_lib_dirs.begin() ; vit != ext_lib_dirs.end() ; vit++ ) { + for ( vit = ext_lib_dirs.begin() ; vit != ext_lib_dirs.end() ; ++vit ) { if ( ! in_dir.compare(0, (*vit).size(), (*vit))) { return true ; } @@ -318,7 +318,7 @@ bool HeaderSearchDirs::isPathInICGNoComment (const std::string& in_dir ) { } else { std::vector::iterator vit ; - for ( vit = icg_nocomment_dirs.begin() ; vit != icg_nocomment_dirs.end() ; vit++ ) { + for ( vit = icg_nocomment_dirs.begin() ; vit != icg_nocomment_dirs.end() ; ++vit ) { if ( ! in_dir.compare(0, (*vit).size(), (*vit))) { icg_nocomment_files[in_dir] = true ; return true; @@ -332,7 +332,7 @@ bool HeaderSearchDirs::isPathInICGNoComment (const std::string& in_dir ) { bool HeaderSearchDirs::isPathInCompat15 (const std::string& in_dir ) { std::vector::iterator vit ; - for ( vit = compat15_dirs.begin() ; vit != compat15_dirs.end() ; vit++ ) { + for ( vit = compat15_dirs.begin() ; vit != compat15_dirs.end() ; ++vit ) { if ( ! in_dir.compare(0, (*vit).size(), (*vit))) { return true ; } @@ -347,7 +347,7 @@ bool HeaderSearchDirs::isPathInCompat15 (const std::string& in_dir ) { std::string HeaderSearchDirs::getPathInExclude (const std::string& in_dir ) { std::vector::iterator vit ; - for ( vit = exclude_dirs.begin() ; vit != exclude_dirs.end() ; vit++ ) { + for ( vit = exclude_dirs.begin() ; vit != exclude_dirs.end() ; ++vit ) { if ( ! in_dir.compare(0, (*vit).size(), (*vit))) { return (*vit) ; } @@ -359,7 +359,7 @@ std::string HeaderSearchDirs::getPathInExclude (const std::string& in_dir ) { std::string HeaderSearchDirs::getPathInICGExclude (const std::string& in_dir ) { std::vector::iterator vit ; - for ( vit = icg_exclude_dirs.begin() ; vit != icg_exclude_dirs.end() ; vit++ ) { + for ( vit = icg_exclude_dirs.begin() ; vit != icg_exclude_dirs.end() ; ++vit ) { if ( ! in_dir.compare(0, (*vit).size(), (*vit))) { return (*vit) ; } @@ -371,7 +371,7 @@ std::string HeaderSearchDirs::getPathInICGExclude (const std::string& in_dir ) { std::string HeaderSearchDirs::getPathInExtLib (const std::string& in_dir ) { std::vector::iterator vit ; - for ( vit = ext_lib_dirs.begin() ; vit != ext_lib_dirs.end() ; vit++ ) { + for ( vit = ext_lib_dirs.begin() ; vit != ext_lib_dirs.end() ; ++vit ) { if ( ! in_dir.compare(0, (*vit).size(), (*vit))) { return (*vit) ; } diff --git a/trick_source/codegen/Interface_Code_Gen/PrintAttributes.cpp b/trick_source/codegen/Interface_Code_Gen/PrintAttributes.cpp index 1e1fc79d..758a84cd 100644 --- a/trick_source/codegen/Interface_Code_Gen/PrintAttributes.cpp +++ b/trick_source/codegen/Interface_Code_Gen/PrintAttributes.cpp @@ -449,7 +449,7 @@ void PrintAttributes::printIOMakefile() { << "IO_OBJECTS =" ; std::map< std::string , std::string >::iterator mit ; - for ( mit = all_io_files.begin() ; mit != all_io_files.end() ; mit++ ) { + for ( mit = all_io_files.begin() ; mit != all_io_files.end() ; ++mit ) { size_t found ; found = (*mit).second.find_last_of(".") ; makefile_io_src << " \\\n " << (*mit).second.substr(0,found) << ".o" ; @@ -487,7 +487,7 @@ void PrintAttributes::printIOMakefile() { ICG_processed.open("build/ICG_processed") ; makefile_ICG << "build/Makefile_io_src:" ; - for ( mit = all_io_files.begin() ; mit != all_io_files.end() ; mit++ ) { + for ( mit = all_io_files.begin() ; mit != all_io_files.end() ; ++mit ) { makefile_ICG << " \\\n " << (*mit).first ; size_t found ; found = (*mit).second.find_last_of(".") ; @@ -518,7 +518,7 @@ void PrintAttributes::printICGNoFiles() { if ( ! sim_services_flag ) { std::vector< std::string >::iterator it ; std::ofstream icg_no_outfile("build/ICG_no_found") ; - for ( it = icg_no_files.begin() ; it != icg_no_files.end() ; it++ ) { + for ( it = icg_no_files.begin() ; it != icg_no_files.end() ; ++it ) { icg_no_outfile << (*it) << std::endl ; } icg_no_outfile.close() ; diff --git a/trick_source/sim_services/DataRecord/DataRecordDispatcher.cpp b/trick_source/sim_services/DataRecord/DataRecordDispatcher.cpp index 19911b21..ac75689c 100644 --- a/trick_source/sim_services/DataRecord/DataRecordDispatcher.cpp +++ b/trick_source/sim_services/DataRecord/DataRecordDispatcher.cpp @@ -182,7 +182,7 @@ void Trick::DataRecordDispatcher::remove_all_groups() { Trick::DataRecordGroup * Trick::DataRecordDispatcher::get_group(std::string in_name) { std::vector ::iterator it ; - for ( it = groups.begin() ; it != groups.end() ; it++ ) { + for ( it = groups.begin() ; it != groups.end() ; ++it ) { if ( ! (*it)->get_group_name().compare(in_name) ) return *it ; } diff --git a/trick_source/sim_services/DataRecord/DataRecordGroup.cpp b/trick_source/sim_services/DataRecord/DataRecordGroup.cpp index d9266e72..5808e9dc 100644 --- a/trick_source/sim_services/DataRecord/DataRecordGroup.cpp +++ b/trick_source/sim_services/DataRecord/DataRecordGroup.cpp @@ -512,7 +512,7 @@ int Trick::DataRecordGroup::restart() { std::vector ::iterator drb_it ; /* delete the current rec_buffer */ - for ( drb_it = rec_buffer.begin() ; drb_it != rec_buffer.end() ; drb_it++ ) { + for ( drb_it = rec_buffer.begin() ; drb_it != rec_buffer.end() ; ++drb_it ) { delete *drb_it ; } rec_buffer.clear() ; @@ -520,7 +520,7 @@ int Trick::DataRecordGroup::restart() { add_time_variable() ; /* delete the current change_buffer contents */ - for ( drb_it = change_buffer.begin() ; drb_it != change_buffer.end() ; drb_it++ ) { + for ( drb_it = change_buffer.begin() ; drb_it != change_buffer.end() ; ++drb_it ) { delete *drb_it ; } change_buffer.clear() ; diff --git a/trick_source/sim_services/Environment/Environment.cpp b/trick_source/sim_services/Environment/Environment.cpp index a7de3366..17ebe4fc 100644 --- a/trick_source/sim_services/Environment/Environment.cpp +++ b/trick_source/sim_services/Environment/Environment.cpp @@ -44,7 +44,7 @@ int Trick::Environment::print_vars( FILE * fp ) { std::map::iterator it ; - for ( it = local_env.begin() ; it != local_env.end() ; it++ ) { + for ( it = local_env.begin() ; it != local_env.end() ; ++it ) { fprintf(fp, "%s = %s\n", it->first.c_str(), it->second.c_str()); } diff --git a/trick_source/sim_services/EventManager/EventProcessor.cpp b/trick_source/sim_services/EventManager/EventProcessor.cpp index 76032584..1ee3fa1e 100644 --- a/trick_source/sim_services/EventManager/EventProcessor.cpp +++ b/trick_source/sim_services/EventManager/EventProcessor.cpp @@ -30,7 +30,7 @@ void Trick::EventProcessor::add_event(Trick::Event * in_event) { */ void Trick::EventProcessor::remove_event(Trick::Event * in_event) { std::multiset< Trick::Event *, CompareEventPtrs >::iterator sit = event_set.begin() ; - for (sit=event_set.begin(); sit!=event_set.end(); sit++) { + for (sit=event_set.begin(); sit!=event_set.end(); ++sit) { if ((*sit) == in_event) { event_set.erase(sit) ; break; diff --git a/trick_source/sim_services/Executive/Executive_add_jobs_to_queue.cpp b/trick_source/sim_services/Executive/Executive_add_jobs_to_queue.cpp index db712c34..eadbb8d9 100644 --- a/trick_source/sim_services/Executive/Executive_add_jobs_to_queue.cpp +++ b/trick_source/sim_services/Executive/Executive_add_jobs_to_queue.cpp @@ -148,7 +148,7 @@ int Trick::Executive::add_job_to_queue( Trick::JobData * job ) { /* Add job to convienience constructs for easy retrival */ all_jobs.insert(std::pair(job->name,job)) ; all_jobs_vector.push_back(job) ; - for ( it = job->tags_begin() ; it != job->tags_end() ; it++ ) { + for ( it = job->tags_begin() ; it != job->tags_end() ; ++it ) { all_tagged_jobs.insert(std::pair(*it,job)) ; } diff --git a/trick_source/sim_services/Executive/Executive_get_job.cpp b/trick_source/sim_services/Executive/Executive_get_job.cpp index 65eabce5..1289ef4f 100644 --- a/trick_source/sim_services/Executive/Executive_get_job.cpp +++ b/trick_source/sim_services/Executive/Executive_get_job.cpp @@ -15,7 +15,7 @@ Trick::JobData * Trick::Executive::get_job(std::string job_name, unsigned int j_ range = all_jobs.equal_range(job_name) ; /** @li Move to the j_instance-th item in the list */ - for ( it = range.first , ii = 1 ; (it != range.second) && (ii < j_instance) ; it++ , ii++ ) ; + for ( it = range.first , ii = 1 ; (it != range.second) && (ii < j_instance) ; ++it , ii++ ) ; /** @li If the j_instance-th item doesn't exist return NULL */ if ( it == range.second ) { diff --git a/trick_source/sim_services/Executive/Executive_remove_jobs.cpp b/trick_source/sim_services/Executive/Executive_remove_jobs.cpp index 1cfcb8c6..00799dc0 100644 --- a/trick_source/sim_services/Executive/Executive_remove_jobs.cpp +++ b/trick_source/sim_services/Executive/Executive_remove_jobs.cpp @@ -40,7 +40,7 @@ int Trick::Executive::remove_jobs( Trick::SimObject * in_sim_object ) { } /* search the executive queues for the job and remove it if found */ - for ( std::vector ::iterator jit = in_sim_object->jobs.begin() ; jit != in_sim_object->jobs.end() ; jit++ ) { + for ( std::vector ::iterator jit = in_sim_object->jobs.begin() ; jit != in_sim_object->jobs.end() ; ++jit ) { std::map::iterator class_id_it ; std::map::iterator queue_it ; Trick::ScheduledJobQueue * curr_queue ; diff --git a/trick_source/sim_services/Executive/Executive_remove_sim_object.cpp b/trick_source/sim_services/Executive/Executive_remove_sim_object.cpp index 665e7fab..8682ea3e 100644 --- a/trick_source/sim_services/Executive/Executive_remove_sim_object.cpp +++ b/trick_source/sim_services/Executive/Executive_remove_sim_object.cpp @@ -17,7 +17,7 @@ int Trick::Executive::delete_sim_object( Trick::SimObject * in_object ) { std::vector ::iterator so_it ; std::vector ::iterator sched_it ; - for ( so_it = in_object->pre_component_objects.begin() ; so_it != in_object->pre_component_objects.end() ; so_it++ ) { + for ( so_it = in_object->pre_component_objects.begin() ; so_it != in_object->pre_component_objects.end() ; ++so_it ) { delete_sim_object((*so_it)) ; } @@ -31,11 +31,11 @@ int Trick::Executive::delete_sim_object( Trick::SimObject * in_object ) { remove_jobs( in_object ) ; - for ( sched_it = other_schedulers.begin() ; sched_it != other_schedulers.end() ; sched_it++ ) { + for ( sched_it = other_schedulers.begin() ; sched_it != other_schedulers.end() ; ++sched_it ) { (*sched_it)->delete_sim_object(in_object) ; } - for ( so_it = in_object->post_component_objects.begin() ; so_it != in_object->post_component_objects.end() ; so_it++ ) { + for ( so_it = in_object->post_component_objects.begin() ; so_it != in_object->post_component_objects.end() ; ++so_it ) { delete_sim_object((*so_it)) ; } diff --git a/trick_source/sim_services/Executive/Executive_restart.cpp b/trick_source/sim_services/Executive/Executive_restart.cpp index 7cd6fec3..9837e7d8 100644 --- a/trick_source/sim_services/Executive/Executive_restart.cpp +++ b/trick_source/sim_services/Executive/Executive_restart.cpp @@ -44,8 +44,8 @@ int Trick::Executive::restart() { all_tagged_jobs.clear() ; /* Create a temporary all_jobs map to use to restore job data from all_jobs_for_checkpoint */ - for ( sit = sim_objects.begin() ; sit != sim_objects.end() ; sit++ ) { - for ( jit = (*sit)->jobs.begin() ; jit != (*sit)->jobs.end() ; jit++ ) { + for ( sit = sim_objects.begin() ; sit != sim_objects.end() ; ++sit ) { + for ( jit = (*sit)->jobs.begin() ; jit != (*sit)->jobs.end() ; ++jit ) { /* Dynamically created sim_objects, like data_recording objects, require that some of the job class data be repopulated before we start copying job data back into the sim. */ @@ -67,7 +67,7 @@ int Trick::Executive::restart() { message_publish(MSG_ERROR, "Could not find job %s\n", all_jobs_for_checkpoint[ii].name.c_str()) ; exec_terminate_with_return( -1 , __FILE__ , __LINE__ , "Job in checkpoint file does not exist in current sim." ) ; } else { - for ( it = ret.first ; it != ret.second ; it++ ) { + for ( it = ret.first ; it != ret.second ; ++it ) { // The JobData::id and JobData::sim_object_id together uniquely identify a job. if (( it->second->id == all_jobs_for_checkpoint[ii].id ) && ( it->second->sim_object_id == all_jobs_for_checkpoint[ii].sim_object_id )) { @@ -80,7 +80,7 @@ int Trick::Executive::restart() { /* restore the executive sim_objects vector from the checkpoint and add back all of the jobs to the schedulers */ - for ( sit = sim_objects.begin() ; sit != sim_objects.end() ; sit++ ) { + for ( sit = sim_objects.begin() ; sit != sim_objects.end() ; ++sit ) { add_jobs_to_queue(*sit, true) ; for ( ii = 0 ; ii < other_schedulers.size() ; ii++ ) { other_schedulers[ii]->add_sim_object(*sit) ; diff --git a/trick_source/sim_services/Executive/Executive_set_job_cycle.cpp b/trick_source/sim_services/Executive/Executive_set_job_cycle.cpp index 4ecb2d1d..425faaf2 100644 --- a/trick_source/sim_services/Executive/Executive_set_job_cycle.cpp +++ b/trick_source/sim_services/Executive/Executive_set_job_cycle.cpp @@ -27,7 +27,7 @@ int Trick::Executive::set_job_cycle(std::string job_name, int instance_num, doub range = all_tagged_jobs.equal_range(job_name) ; if (range.first != range.second) { // set cycle for all jobs with this tag - for ( it = range.first; it != range.second ; it++ ) { + for ( it = range.first; it != range.second ; ++it ) { (*it).second->set_cycle(in_cycle) ; (*it).second->set_next_call_time(time_tics) ; } diff --git a/trick_source/sim_services/Executive/Executive_set_job_onoff.cpp b/trick_source/sim_services/Executive/Executive_set_job_onoff.cpp index 0a94105a..07aa5e7d 100644 --- a/trick_source/sim_services/Executive/Executive_set_job_onoff.cpp +++ b/trick_source/sim_services/Executive/Executive_set_job_onoff.cpp @@ -21,7 +21,7 @@ int Trick::Executive::set_job_onoff(std::string job_name, int instance_num , int range = all_tagged_jobs.equal_range(job_name) ; if (range.first != range.second) { // set disabled flag accordingly for all jobs with this tag - for ( it = range.first; it != range.second ; it++ ) { + for ( it = range.first; it != range.second ; ++it ) { it->second->disabled = !on ; } } else { diff --git a/trick_source/sim_services/FrameLog/FrameDataRecordGroup.cpp b/trick_source/sim_services/FrameLog/FrameDataRecordGroup.cpp index af11b6a6..c0da71b2 100644 --- a/trick_source/sim_services/FrameLog/FrameDataRecordGroup.cpp +++ b/trick_source/sim_services/FrameLog/FrameDataRecordGroup.cpp @@ -33,7 +33,7 @@ int Trick::FrameDataRecordGroup::frame_log_clear() { return 0 ; } std::vector< Trick::JobData *>::iterator it ; - for ( it = rec_jobs.begin() ; it != rec_jobs.end() ; it++ ) { + for ( it = rec_jobs.begin() ; it != rec_jobs.end() ; ++it ) { (*it)->frame_time = 0 ; (*it)->frame_time_seconds = 0.0; } diff --git a/trick_source/sim_services/FrameLog/FrameLog.cpp b/trick_source/sim_services/FrameLog/FrameLog.cpp index 66715a2b..e392e683 100644 --- a/trick_source/sim_services/FrameLog/FrameLog.cpp +++ b/trick_source/sim_services/FrameLog/FrameLog.cpp @@ -177,7 +177,7 @@ void Trick::FrameLog::add_recording_vars_for_jobs() { /* set the recoring job be and end of frame job. Set each recording group to it's proper thread. */ std::vector< Trick::FrameDataRecordGroup *>::iterator fdrg_it ; - for ( fdrg_it = drg_users.begin() , ii = 0 ; fdrg_it != drg_users.end() ; fdrg_it++ , ii++ ) { + for ( fdrg_it = drg_users.begin() , ii = 0 ; fdrg_it != drg_users.end() ; ++fdrg_it , ii++ ) { (*fdrg_it)->set_job_class("end_of_frame") ; (*fdrg_it)->set_phase(65533); (*fdrg_it)->set_thread(ii); @@ -251,7 +251,7 @@ void Trick::FrameLog::add_recording_vars_for_frame() { */ void Trick::FrameLog::add_recording_groups_to_sim() { std::vector< Trick::FrameDataRecordGroup *>::iterator fdrg_it ; - for ( fdrg_it = drg_users.begin() ; fdrg_it != drg_users.end() ; fdrg_it++ ) { + for ( fdrg_it = drg_users.begin() ; fdrg_it != drg_users.end() ; ++fdrg_it ) { add_data_record_group( *fdrg_it , Trick::DR_Ring_Buffer) ; } add_data_record_group(drg_trick, Trick::DR_Ring_Buffer) ; @@ -267,7 +267,7 @@ void Trick::FrameLog::add_recording_groups_to_sim() { */ void Trick::FrameLog::remove_recording_groups_from_sim() { std::vector< Trick::FrameDataRecordGroup *>::iterator fdrg_it ; - for ( fdrg_it = drg_users.begin() ; fdrg_it != drg_users.end() ; fdrg_it++ ) { + for ( fdrg_it = drg_users.begin() ; fdrg_it != drg_users.end() ; ++fdrg_it ) { remove_data_record_group( *fdrg_it) ; } remove_data_record_group(drg_trick) ; @@ -283,7 +283,7 @@ void Trick::FrameLog::remove_recording_groups_from_sim() { */ void Trick::FrameLog::enable_recording_groups() { std::vector< Trick::FrameDataRecordGroup *>::iterator fdrg_it ; - for ( fdrg_it = drg_users.begin() ; fdrg_it != drg_users.end() ; fdrg_it++ ) { + for ( fdrg_it = drg_users.begin() ; fdrg_it != drg_users.end() ; ++fdrg_it ) { (*fdrg_it)->enable() ; } drg_trick->enable() ; @@ -299,7 +299,7 @@ void Trick::FrameLog::enable_recording_groups() { */ void Trick::FrameLog::disable_recording_groups() { std::vector< Trick::FrameDataRecordGroup *>::iterator fdrg_it ; - for ( fdrg_it = drg_users.begin() ; fdrg_it != drg_users.end() ; fdrg_it++ ) { + for ( fdrg_it = drg_users.begin() ; fdrg_it != drg_users.end() ; ++fdrg_it ) { (*fdrg_it)->disable() ; } drg_trick->disable() ; @@ -315,7 +315,7 @@ void Trick::FrameLog::disable_recording_groups() { */ void Trick::FrameLog::init_recording_groups() { std::vector< Trick::FrameDataRecordGroup *>::iterator fdrg_it ; - for ( fdrg_it = drg_users.begin() ; fdrg_it != drg_users.end() ; fdrg_it++ ) { + for ( fdrg_it = drg_users.begin() ; fdrg_it != drg_users.end() ; ++fdrg_it ) { (*fdrg_it)->init() ; } drg_trick->init() ; @@ -481,7 +481,7 @@ int Trick::FrameLog::set_max_samples(int num) { timeline_other[ii] = (Trick::timeline_t *)realloc( timeline_other[ii], tl_max_samples*sizeof(Trick::timeline_t)); } std::vector< Trick::FrameDataRecordGroup *>::iterator it ; - for ( it = drg_users.begin() ; it != drg_users.end() ; it++ ) { + for ( it = drg_users.begin() ; it != drg_users.end() ; ++it ) { (*it)->set_max_buffer_size(num) ; } drg_trick->set_max_buffer_size(num) ; @@ -527,7 +527,7 @@ int Trick::FrameLog::clear_data_record_info() { remove_recording_groups_from_sim() ; std::vector< Trick::FrameDataRecordGroup *>::iterator it ; - for ( it = drg_users.begin() ; it != drg_users.end() ; it++ ) { + for ( it = drg_users.begin() ; it != drg_users.end() ; ++it ) { (*it)->clear_checkpoint_vars() ; } drg_trick->clear_checkpoint_vars() ; @@ -549,7 +549,7 @@ clear_data_record_info. int Trick::FrameLog::restart() { // removing the data record groups removed the restart jobs too. call them here. std::vector< Trick::FrameDataRecordGroup *>::iterator it ; - for ( it = drg_users.begin() ; it != drg_users.end() ; it++ ) { + for ( it = drg_users.begin() ; it != drg_users.end() ; ++it ) { (*it)->restart() ; } drg_trick->restart() ; @@ -844,7 +844,7 @@ int Trick::FrameLog::create_DP_job_files() { total_plots = drg_users[ii]->rec_buffer.size(); std::vector ::iterator drb_it ; bg_color = (char *)"cornsilk2"; - for ( drb_it = drg_users[ii]->rec_buffer.begin() + 1 ; drb_it != drg_users[ii]->rec_buffer.end() ; drb_it++ ) { + for ( drb_it = drg_users[ii]->rec_buffer.begin() + 1 ; drb_it != drg_users[ii]->rec_buffer.end() ; ++drb_it ) { if ( ! (*drb_it)->name.compare(0, 5, "frame") ) continue ; // plots_per_page job plots per page if ((plots == 0) || (plots > plots_per_page)) { diff --git a/trick_source/sim_services/InputProcessor/IPPython.cpp b/trick_source/sim_services/InputProcessor/IPPython.cpp index 0ecafeea..e259ff7a 100644 --- a/trick_source/sim_services/InputProcessor/IPPython.cpp +++ b/trick_source/sim_services/InputProcessor/IPPython.cpp @@ -46,7 +46,7 @@ static PyThreadState *_save = NULL; void Trick::IPPython::get_TMM_named_variables() { //std::cout << "top level names at initialization" << std::endl ; Trick::ALLOC_INFO_MAP_ITER aim_it ; - for ( aim_it = trick_MM->alloc_info_map_begin() ; aim_it != trick_MM->alloc_info_map_end() ; aim_it++ ) { + for ( aim_it = trick_MM->alloc_info_map_begin() ; aim_it != trick_MM->alloc_info_map_end() ; ++aim_it ) { ALLOC_INFO * alloc_info = (*aim_it).second ; if ( alloc_info->name != NULL and alloc_info->user_type_name != NULL ) { std::stringstream ss ; diff --git a/trick_source/sim_services/JITInputFile/JITInputFile.cpp b/trick_source/sim_services/JITInputFile/JITInputFile.cpp index 1393f10c..7447b066 100644 --- a/trick_source/sim_services/JITInputFile/JITInputFile.cpp +++ b/trick_source/sim_services/JITInputFile/JITInputFile.cpp @@ -264,7 +264,7 @@ int Trick::JITInputFile::add_library(std::string lib_name) { void * Trick::JITInputFile::find_symbol(std::string sym) { std::map< std::string , JITLibInfo >::iterator it ; - for ( it = file_to_libinfo_map.begin() ; it != file_to_libinfo_map.end() ; it++ ) { + for ( it = file_to_libinfo_map.begin() ; it != file_to_libinfo_map.end() ; ++it ) { void * ret = (*it).second.find_symbol(sym) ; if (ret != NULL) { return ret ; diff --git a/trick_source/sim_services/JSONVariableServer/JSONVariableServerThread.cpp b/trick_source/sim_services/JSONVariableServer/JSONVariableServerThread.cpp index d9b37390..af03e8d8 100644 --- a/trick_source/sim_services/JSONVariableServer/JSONVariableServerThread.cpp +++ b/trick_source/sim_services/JSONVariableServer/JSONVariableServerThread.cpp @@ -225,7 +225,7 @@ int Trick::JSONVariableServerThread::get_vars( std::stringstream & body , char * if ( path[0] == '\0' ) { Trick::ALLOC_INFO_MAP_ITER aim_it ; bool first_item = true ; - for ( aim_it = trick_MM->alloc_info_map_begin() ; aim_it != trick_MM->alloc_info_map_end() ; aim_it++ ) { + for ( aim_it = trick_MM->alloc_info_map_begin() ; aim_it != trick_MM->alloc_info_map_end() ; ++aim_it ) { ALLOC_INFO * alloc_info = (*aim_it).second ; if ( alloc_info->name != NULL and alloc_info->user_type_name != NULL ) { if ( first_item == true ) { diff --git a/trick_source/sim_services/MemoryManager/MemoryManager.cpp b/trick_source/sim_services/MemoryManager/MemoryManager.cpp index 801554da..1cb398a6 100644 --- a/trick_source/sim_services/MemoryManager/MemoryManager.cpp +++ b/trick_source/sim_services/MemoryManager/MemoryManager.cpp @@ -80,7 +80,7 @@ Trick::MemoryManager::~MemoryManager() { delete defaultCheckPointAgent ; - for ( ait = alloc_info_map.begin() ; ait != alloc_info_map.end() ; ait++ ) { + for ( ait = alloc_info_map.begin() ; ait != alloc_info_map.end() ; ++ait ) { ALLOC_INFO * ai_ptr = (*ait).second ; if (ai_ptr->stcl == TRICK_LOCAL) { if ( ai_ptr->alloc_type == TRICK_ALLOC_MALLOC ) { diff --git a/trick_source/sim_services/MemoryManager/test/MM_stl_checkpoint.cc b/trick_source/sim_services/MemoryManager/test/MM_stl_checkpoint.cc index 8a4b4f2d..a16e5bac 100644 --- a/trick_source/sim_services/MemoryManager/test/MM_stl_checkpoint.cc +++ b/trick_source/sim_services/MemoryManager/test/MM_stl_checkpoint.cc @@ -1294,7 +1294,7 @@ TEST_F(MM_stl_checkpoint, recursive_nightmare ) { for (int i = 0; i < 5; i++) { int j = 0; - for (auto it = recursive_nightmare_copy[i].begin(); it != recursive_nightmare_copy[i].end(); it++, j++) { + for (auto it = recursive_nightmare_copy[i].begin(); it != recursive_nightmare_copy[i].end(); ++it, j++) { std::pair key = it->first; std::vector> val = it->second; diff --git a/trick_source/sim_services/Message/MessagePublisher.cpp b/trick_source/sim_services/Message/MessagePublisher.cpp index a5b491bc..d208e41a 100644 --- a/trick_source/sim_services/Message/MessagePublisher.cpp +++ b/trick_source/sim_services/Message/MessagePublisher.cpp @@ -63,7 +63,7 @@ int Trick::MessagePublisher::publish(int level , std::string message) { /** @li Go through all its subscribers and send a message update to the subscriber that is enabled. */ if ( ! subscribers.empty() ) { - for ( p = subscribers.begin() ; p != subscribers.end() ; p++ ) { + for ( p = subscribers.begin() ; p != subscribers.end() ; ++p ) { if ( (*p)->enabled ) { (*p)->update(level , header , message) ; } @@ -81,7 +81,7 @@ int Trick::MessagePublisher::publish(int level , std::string message) { Trick::MessageSubscriber * Trick::MessagePublisher::getSubscriber( std::string sub_name ) { std::list::iterator lit ; - for ( lit = subscribers.begin() ; lit != subscribers.end() ; lit++ ) { + for ( lit = subscribers.begin() ; lit != subscribers.end() ; ++lit ) { if ( ! (*lit)->name.compare(sub_name) ) { return *lit ; } diff --git a/trick_source/sim_services/RealtimeInjector/RtiExec.cpp b/trick_source/sim_services/RealtimeInjector/RtiExec.cpp index 5bf05d84..2ee9d0f6 100644 --- a/trick_source/sim_services/RealtimeInjector/RtiExec.cpp +++ b/trick_source/sim_services/RealtimeInjector/RtiExec.cpp @@ -40,7 +40,7 @@ int Trick::RtiExec::Exec () { // use trylock so we don't block if the mutex is in use. if ( pthread_mutex_trylock(&list_mutex) == 0 ) { std::vector < RtiList * >::iterator rlit ; - for ( rlit = fire_list.begin() ; rlit != fire_list.end() ; rlit++ ) { + for ( rlit = fire_list.begin() ; rlit != fire_list.end() ; ++rlit ) { (*rlit)->execute(debug) ; delete (*rlit) ; } diff --git a/trick_source/sim_services/RealtimeInjector/RtiList.cpp b/trick_source/sim_services/RealtimeInjector/RtiList.cpp index 2835f778..1adea7de 100644 --- a/trick_source/sim_services/RealtimeInjector/RtiList.cpp +++ b/trick_source/sim_services/RealtimeInjector/RtiList.cpp @@ -7,7 +7,7 @@ void Trick::RtiList::execute( bool debug ) { std::vector::iterator rebit ; - for ( rebit = event_list.begin() ; rebit != event_list.end() ; rebit++ ) { + for ( rebit = event_list.begin() ; rebit != event_list.end() ; ++rebit ) { if ( debug ) { message_publish(MSG_DEBUG, "Executing RTI: %s = %s\n", (*rebit)->ref->reference , (*rebit)->print_val().c_str() ); @@ -20,7 +20,7 @@ void Trick::RtiList::execute( bool debug ) { void Trick::RtiList::print_list() { std::vector::iterator rebit ; - for ( rebit = event_list.begin() ; rebit != event_list.end() ; rebit++ ) { + for ( rebit = event_list.begin() ; rebit != event_list.end() ; ++rebit ) { (*rebit)->print_rti() ; } } diff --git a/trick_source/sim_services/RealtimeInjector/RtiStager.cpp b/trick_source/sim_services/RealtimeInjector/RtiStager.cpp index 4f6fbae2..2e5c2bed 100644 --- a/trick_source/sim_services/RealtimeInjector/RtiStager.cpp +++ b/trick_source/sim_services/RealtimeInjector/RtiStager.cpp @@ -76,7 +76,7 @@ int Trick::RtiStager::List () { int Trick::RtiStager::SetDebug( bool on_off ) { debug = on_off ; std::vector < RtiExec * >::iterator reit ; - for ( reit = executors.begin() ; reit != executors.end() ; reit++ ) { + for ( reit = executors.begin() ; reit != executors.end() ; ++reit ) { (*reit)->SetDebug(on_off) ; } return 0 ; diff --git a/trick_source/sim_services/Sie/AttributesMap.cpp b/trick_source/sim_services/Sie/AttributesMap.cpp index 7c991677..649ce3dd 100644 --- a/trick_source/sim_services/Sie/AttributesMap.cpp +++ b/trick_source/sim_services/Sie/AttributesMap.cpp @@ -60,7 +60,7 @@ void Trick::AttributesMap::print_xml(std::ofstream & sie_out ) { std::map::iterator it ; int jj ; - for ( it = name_to_attr_map.begin() ; it != name_to_attr_map.end() ; it++ ) { + for ( it = name_to_attr_map.begin() ; it != name_to_attr_map.end() ; ++it ) { ATTRIBUTES * attr = (*it).second ; std::string class_name = (*it).first; std::replace(class_name.begin(), class_name.end(), ':', '_'); @@ -102,7 +102,7 @@ void Trick::AttributesMap::print_json(std::ofstream & sie_out ) { std::map::iterator it ; int jj ; sie_out << " \"classes\": [\n" ; - for ( it = name_to_attr_map.begin() ; it != name_to_attr_map.end() ; it++ ) { + for ( it = name_to_attr_map.begin() ; it != name_to_attr_map.end() ; ++it ) { ATTRIBUTES * attr = (*it).second ; std::string class_name = (*it).first; std::replace(class_name.begin(), class_name.end(), ':', '_'); diff --git a/trick_source/sim_services/Sie/EnumAttributesMap.cpp b/trick_source/sim_services/Sie/EnumAttributesMap.cpp index 173c2d96..59005d15 100644 --- a/trick_source/sim_services/Sie/EnumAttributesMap.cpp +++ b/trick_source/sim_services/Sie/EnumAttributesMap.cpp @@ -14,7 +14,7 @@ void Trick::EnumAttributesMap::print_xml(std::ofstream & sie_out ) { std::map::iterator it ; ENUM_ATTR * enum_attr ; - for ( it = name_to_attr_map.begin() ; it != name_to_attr_map.end() ; it++ ) { + for ( it = name_to_attr_map.begin() ; it != name_to_attr_map.end() ; ++it ) { enum_attr = (*it).second ; if ( enum_attr != NULL ) { @@ -35,7 +35,7 @@ void Trick::EnumAttributesMap::print_json(std::ofstream & sie_out ) { std::map::iterator it ; ENUM_ATTR * enum_attr ; sie_out << " \"enumerations\": [\n" ; - for ( it = name_to_attr_map.begin() ; it != name_to_attr_map.end() ; it++ ) { + for ( it = name_to_attr_map.begin() ; it != name_to_attr_map.end() ; ++it ) { enum_attr = (*it).second ; if ( enum_attr != NULL ) { diff --git a/trick_source/sim_services/Sie/Sie.cpp b/trick_source/sim_services/Sie/Sie.cpp index cc7ed2b6..2239e896 100644 --- a/trick_source/sim_services/Sie/Sie.cpp +++ b/trick_source/sim_services/Sie/Sie.cpp @@ -62,7 +62,7 @@ void Trick::Sie::top_level_objects_print(std::ofstream & sie_out) { Trick::VARIABLE_MAP_ITER vit ; int jj ; - for ( vit = trick_MM->variable_map_begin() ; vit != trick_MM->variable_map_end() ; vit++ ) { + for ( vit = trick_MM->variable_map_begin() ; vit != trick_MM->variable_map_end() ; ++vit ) { ALLOC_INFO * alloc_info = (*vit).second ; if ( alloc_info != NULL ) { @@ -88,7 +88,7 @@ void Trick::Sie::runtime_objects_print(std::fstream & sie_out) { Trick::VARIABLE_MAP_ITER vit ; int jj ; - for ( vit = trick_MM->variable_map_begin() ; vit != trick_MM->variable_map_end() ; vit++ ) { + for ( vit = trick_MM->variable_map_begin() ; vit != trick_MM->variable_map_end() ; ++vit ) { ALLOC_INFO * alloc_info = (*vit).second ; if ( alloc_info != NULL && alloc_info->alloced_in_memory_init == 0) { @@ -114,7 +114,7 @@ void Trick::Sie::top_level_objects_json(std::ofstream & sie_out) { Trick::VARIABLE_MAP_ITER vit ; int jj ; sie_out << " \"top_level_objects\": [\n"; - for ( vit = trick_MM->variable_map_begin() ; vit != trick_MM->variable_map_end() ; vit++ ) { + for ( vit = trick_MM->variable_map_begin() ; vit != trick_MM->variable_map_end() ; ++vit ) { ALLOC_INFO * alloc_info = (*vit).second ; if ( alloc_info != NULL ) { diff --git a/trick_source/sim_services/SimObject/SimObject.cpp b/trick_source/sim_services/SimObject/SimObject.cpp index f17dc20b..bdf92c0c 100644 --- a/trick_source/sim_services/SimObject/SimObject.cpp +++ b/trick_source/sim_services/SimObject/SimObject.cpp @@ -13,7 +13,7 @@ Trick::SimObject::~SimObject() { int Trick::SimObject::add_tag( std::string job_tag ) { std::vector ::iterator it ; - for ( it = jobs.begin() ; it != jobs.end() ; it++ ) { + for ( it = jobs.begin() ; it != jobs.end() ; ++it ) { (*it)->add_tag(job_tag) ; } return(0) ; @@ -72,7 +72,7 @@ Trick::JobData * Trick::SimObject::get_job( std::string job_name, unsigned int j std::vector ::iterator it ; // Look for the name - for ( it = jobs.begin() ; it != jobs.end() ; it++ ) { + for ( it = jobs.begin() ; it != jobs.end() ; ++it ) { if ( ! (*it)->name.compare(job_name) ) { if ( j_instance == 1 ) { return *it ; @@ -87,7 +87,7 @@ Trick::JobData * Trick::SimObject::get_job( std::string job_name, unsigned int j job_name = name + "." + job_name ; } // Look for the job with the sim object name prepended. - for ( it = jobs.begin() ; it != jobs.end() ; it++ ) { + for ( it = jobs.begin() ; it != jobs.end() ; ++it ) { if ( ! (*it)->name.compare(job_name) ) { if ( j_instance == 1 ) { return *it ; @@ -102,7 +102,7 @@ Trick::JobData * Trick::SimObject::get_job( std::string job_name, unsigned int j void Trick::SimObject::enable_all_jobs() { std::vector ::iterator it ; - for ( it = jobs.begin() ; it != jobs.end() ; it++ ) { + for ( it = jobs.begin() ; it != jobs.end() ; ++it ) { (*it)->enable() ; } } @@ -115,7 +115,7 @@ void Trick::SimObject::enable() { void Trick::SimObject::disable_all_jobs() { std::vector ::iterator it ; - for ( it = jobs.begin() ; it != jobs.end() ; it++ ) { + for ( it = jobs.begin() ; it != jobs.end() ; ++it ) { (*it)->disable() ; } } diff --git a/trick_source/sim_services/UdUnits/map_trick_units_to_udunits.cpp b/trick_source/sim_services/UdUnits/map_trick_units_to_udunits.cpp index cddfd8c5..e2aad26c 100644 --- a/trick_source/sim_services/UdUnits/map_trick_units_to_udunits.cpp +++ b/trick_source/sim_services/UdUnits/map_trick_units_to_udunits.cpp @@ -73,7 +73,7 @@ std::string map_trick_units_to_udunits( std::string orig_units ) { std::vector tokens ; std::vector::iterator it ; tokenize_units(orig_units, tokens, "*/^()") ; - for( it = tokens.begin() ; it != tokens.end() ; it++ ) { + for( it = tokens.begin() ; it != tokens.end() ; ++it ) { char last_char = *((*it).rbegin()) ; // tokens can end in powers of 2 or 3 in the old system. // save the power if it is the last character diff --git a/trick_source/sim_services/UnitTest/UnitTest.cpp b/trick_source/sim_services/UnitTest/UnitTest.cpp index 0a4961f8..edd401c1 100644 --- a/trick_source/sim_services/UnitTest/UnitTest.cpp +++ b/trick_source/sim_services/UnitTest/UnitTest.cpp @@ -47,7 +47,7 @@ int Trick::TestSuite::add_test_requirements(std::string test_case , std::string void Trick::TestSuite::delete_test_results() { std::vector ::iterator it ; - for ( it = test_results.begin() ; it != test_results.end() ; it++ ) { + for ( it = test_results.begin() ; it != test_results.end() ; ++it ) { delete (*it) ; } test_results.clear() ; @@ -63,7 +63,7 @@ Trick::UnitTest::UnitTest() { Trick::UnitTest::~UnitTest() { std::map< std::string , TestSuite >::iterator it ; - for ( it = test_suites.begin() ; it != test_suites.end() ; it++ ) { + for ( it = test_suites.begin() ; it != test_suites.end() ; ++it ) { (it->second).delete_test_results() ; } } @@ -121,7 +121,7 @@ int Trick::UnitTest::write_output() { unsigned int jj ; if ( enabled ) { - for ( it = test_suites.begin() ; it != test_suites.end() ; it++ ) { + for ( it = test_suites.begin() ; it != test_suites.end() ; ++it ) { curr_suite = &(it->second) ; num_tests += curr_suite->test_results.size() ; num_failures += curr_suite->num_failures ; @@ -133,7 +133,7 @@ int Trick::UnitTest::write_output() { out << "" << std::endl ; - for ( it = test_suites.begin() ; it != test_suites.end() ; it++ ) { + for ( it = test_suites.begin() ; it != test_suites.end() ; ++it ) { curr_suite = &(it->second) ; out << " first << "\" tests=\"" << curr_suite->test_results.size() ; out << "\" failures=\"" << num_failures << "\" disabled=\"0\" errors=\"0\" time=\"0.0\">" << std::endl ; diff --git a/trick_source/sim_services/UnitsMap/UnitsMap.cpp b/trick_source/sim_services/UnitsMap/UnitsMap.cpp index b9617956..6d6b4b49 100644 --- a/trick_source/sim_services/UnitsMap/UnitsMap.cpp +++ b/trick_source/sim_services/UnitsMap/UnitsMap.cpp @@ -21,7 +21,7 @@ Trick::UnitsMap::~UnitsMap() { std::map::iterator pit ; - for ( pit = param_units.begin() ; pit != param_units.end() ; pit++ ) { + for ( pit = param_units.begin() ; pit != param_units.end() ; ++pit ) { free((*pit).second) ; } param_units.clear() ; diff --git a/trick_source/sim_services/VariableServer/VariableServer.cpp b/trick_source/sim_services/VariableServer/VariableServer.cpp index 5507703e..7d212e92 100644 --- a/trick_source/sim_services/VariableServer/VariableServer.cpp +++ b/trick_source/sim_services/VariableServer/VariableServer.cpp @@ -29,7 +29,7 @@ std::ostream& Trick::operator<< (std::ostream& s, Trick::VariableServer& vs) { s << "{\"variable_server_connections\":[\n"; int count = 0; int n_connections = (int)vs.var_server_threads.size(); - for ( it = vs.var_server_threads.begin() ; it != vs.var_server_threads.end() ; it++ ) { + for ( it = vs.var_server_threads.begin() ; it != vs.var_server_threads.end() ; ++it ) { s << "{\n"; s << *(*it).second; s << "}"; diff --git a/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_freeze.cpp b/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_freeze.cpp index 81a479d1..209c56f2 100644 --- a/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_freeze.cpp +++ b/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_freeze.cpp @@ -4,7 +4,7 @@ int Trick::VariableServer::copy_and_write_freeze() { pthread_mutex_lock(&map_mutex) ; - for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; it++ ) { + for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; ++it ) { (*it).second->copy_and_write_freeze(exec_get_freeze_frame_count()) ; } pthread_mutex_unlock(&map_mutex) ; diff --git a/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_freeze_scheduled.cpp b/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_freeze_scheduled.cpp index 511afbd2..4c485896 100644 --- a/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_freeze_scheduled.cpp +++ b/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_freeze_scheduled.cpp @@ -10,7 +10,7 @@ int Trick::VariableServer::copy_and_write_freeze_scheduled() { long long next_call_tics = TRICK_MAX_LONG_LONG ; pthread_mutex_lock(&map_mutex) ; - for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; it++ ) { + for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; ++it ) { VariableServerSession * session = (*it).second ; session->copy_and_write_freeze_scheduled(copy_and_write_freeze_job->next_tics) ; if ( session->get_freeze_next_tics() < next_call_tics ) { diff --git a/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_scheduled.cpp b/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_scheduled.cpp index 9ef7fde2..fa82104f 100644 --- a/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_scheduled.cpp +++ b/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_scheduled.cpp @@ -10,7 +10,7 @@ int Trick::VariableServer::copy_and_write_scheduled() { long long next_call_tics = TRICK_MAX_LONG_LONG; pthread_mutex_lock(&map_mutex) ; - for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; it++ ) { + for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; ++it ) { VariableServerSession * session = (*it).second ; session->copy_and_write_scheduled(copy_data_job->next_tics) ; if ( session->get_next_tics() < next_call_tics ) { diff --git a/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_top.cpp b/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_top.cpp index 3118098d..d2d8e222 100644 --- a/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_top.cpp +++ b/trick_source/sim_services/VariableServer/VariableServer_copy_and_write_top.cpp @@ -4,7 +4,7 @@ int Trick::VariableServer::copy_and_write_top() { pthread_mutex_lock(&map_mutex) ; - for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; it++ ) { + for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; ++it ) { (*it).second->copy_and_write_top(exec_get_frame_count()) ; } pthread_mutex_unlock(&map_mutex) ; diff --git a/trick_source/sim_services/VariableServer/VariableServer_freeze_init.cpp b/trick_source/sim_services/VariableServer/VariableServer_freeze_init.cpp index c7a81c04..818d0464 100644 --- a/trick_source/sim_services/VariableServer/VariableServer_freeze_init.cpp +++ b/trick_source/sim_services/VariableServer/VariableServer_freeze_init.cpp @@ -12,7 +12,7 @@ int Trick::VariableServer::freeze_init() { long long next_call_tics = TRICK_MAX_LONG_LONG ; pthread_mutex_lock(&map_mutex) ; - for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; it++ ) { + for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; ++it ) { VariableServerSession * session = (*it).second ; session->freeze_init() ; if ( session->get_freeze_next_tics() < next_call_tics ) { diff --git a/trick_source/sim_services/VariableServer/VariableServer_get_next_freeze_call_time.cpp b/trick_source/sim_services/VariableServer/VariableServer_get_next_freeze_call_time.cpp index f001c76f..bbb51c81 100644 --- a/trick_source/sim_services/VariableServer/VariableServer_get_next_freeze_call_time.cpp +++ b/trick_source/sim_services/VariableServer/VariableServer_get_next_freeze_call_time.cpp @@ -9,7 +9,7 @@ int Trick::VariableServer::get_next_freeze_call_time() { long long next_call_tics = TRICK_MAX_LONG_LONG; pthread_mutex_lock(&map_mutex) ; - for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; it++ ) { + for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; ++it ) { VariableServerSession * session = (*it).second ; if ( session->get_freeze_next_tics() < next_call_tics ) { next_call_tics = session->get_freeze_next_tics() ; diff --git a/trick_source/sim_services/VariableServer/VariableServer_get_next_sync_call_time.cpp b/trick_source/sim_services/VariableServer/VariableServer_get_next_sync_call_time.cpp index fd969d64..8761a4d4 100644 --- a/trick_source/sim_services/VariableServer/VariableServer_get_next_sync_call_time.cpp +++ b/trick_source/sim_services/VariableServer/VariableServer_get_next_sync_call_time.cpp @@ -9,7 +9,7 @@ int Trick::VariableServer::get_next_sync_call_time() { long long next_call_tics = TRICK_MAX_LONG_LONG ; pthread_mutex_lock(&map_mutex) ; - for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; it++ ) { + for ( auto it = var_server_sessions.begin() ; it != var_server_sessions.end() ; ++it ) { VariableServerSession * session = (*it).second ; if ( session->get_next_tics() < next_call_tics ) { next_call_tics = session->get_next_tics() ; diff --git a/trick_source/trick_swig/PrimitiveAttributesMap.cpp b/trick_source/trick_swig/PrimitiveAttributesMap.cpp index f3508d80..659f2fd6 100644 --- a/trick_source/trick_swig/PrimitiveAttributesMap.cpp +++ b/trick_source/trick_swig/PrimitiveAttributesMap.cpp @@ -27,7 +27,7 @@ Trick::PrimitiveAttributesMap::PrimitiveAttributesMap() { Trick::PrimitiveAttributesMap::~PrimitiveAttributesMap() { std::map::iterator pit ; - for ( pit = param_attr.begin() ; pit != param_attr.end() ; pit++ ) { + for ( pit = param_attr.begin() ; pit != param_attr.end() ; ++pit ) { delete(pit->second) ; } param_attr.clear() ; diff --git a/trick_source/web/CivetServer/src/VariableServerSession.cpp b/trick_source/web/CivetServer/src/VariableServerSession.cpp index 85c0ddfc..f56a8f22 100644 --- a/trick_source/web/CivetServer/src/VariableServerSession.cpp +++ b/trick_source/web/CivetServer/src/VariableServerSession.cpp @@ -60,7 +60,7 @@ void VariableServerSession::sendMessage() { ss << " \"time\" : " << std::setprecision(16) << stageTime << ",\n"; ss << " \"values\" : [\n"; - for (it = sessionVariables.begin(); it != sessionVariables.end(); it++ ) { + for (it = sessionVariables.begin(); it != sessionVariables.end(); ++it ) { if (it != sessionVariables.begin()) ss << ",\n"; (*it)->writeValue(ss); } @@ -83,7 +83,7 @@ int VariableServerSession::handleMessage(const std::string& client_msg) { std::string pycode; int period; - for (it = members.begin(); it != members.end(); it++ ) { + for (it = members.begin(); it != members.end(); ++it ) { if (strcmp((*it)->key, "cmd") == 0) { cmd = (*it)->valText; } else if (strcmp((*it)->key, "var_name") == 0) { @@ -172,7 +172,7 @@ void VariableServerSession::addVariable(char* vname){ void VariableServerSession::stageValues() { stageTime = (double)(exec_get_time_tics()) / exec_get_time_tic_value(); std::vector::iterator it; - for (it = sessionVariables.begin(); it != sessionVariables.end(); it++ ) { + for (it = sessionVariables.begin(); it != sessionVariables.end(); ++it ) { (*it)->stageValue(); } dataStaged = true; @@ -251,7 +251,7 @@ int VariableServerSession::sendUnitsMessage(const char* vname) { std::vector::iterator it; std::stringstream ss; ss << "{ \"msg_type\": \"units\", \"var_name\": \"" << vname << "\", \"data\": \""; - for (it = sessionVariables.begin(); it != sessionVariables.end(); it++ ) { + for (it = sessionVariables.begin(); it != sessionVariables.end(); ++it ) { if(!strcmp((*it)->getName(), vname)) { ss << ( ( From 14708ca9ccaa864f6d466fb2774af9171bf9f1ab Mon Sep 17 00:00:00 2001 From: Pherring04 <158035107+Pherring04@users.noreply.github.com> Date: Thu, 18 Apr 2024 13:46:05 -0500 Subject: [PATCH 08/52] Issue-1677 Fix (#1688) * Added timeout to control panel to variable server connection attempts * Updated 127.0.0.1 to localhost --- .../utils/VariableServerConnection.java | 24 ++++++++++++++++- .../simcontrol/SimControlApplication.java | 27 +++++++++++++++---- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/trick_source/java/src/main/java/trick/common/utils/VariableServerConnection.java b/trick_source/java/src/main/java/trick/common/utils/VariableServerConnection.java index 6d6f216f..eaff77c6 100644 --- a/trick_source/java/src/main/java/trick/common/utils/VariableServerConnection.java +++ b/trick_source/java/src/main/java/trick/common/utils/VariableServerConnection.java @@ -7,7 +7,11 @@ import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; +import java.net.SocketAddress; +import java.net.InetSocketAddress; import java.net.UnknownHostException; +import java.net.SocketTimeoutException; + /** * a generic variable server client that provides for sending commands and @@ -54,12 +58,30 @@ public class VariableServerConnection implements AutoCloseable { * @throws IOException IOException * @throws SecurityException SecurityException */ - public VariableServerConnection(String host, int port) throws UnknownHostException, IOException, SecurityException { + public VariableServerConnection(String host, int port) throws UnknownHostException, IOException, SecurityException, SocketTimeoutException { socket = new Socket(host, port); inputStream = new BufferedReader(new InputStreamReader(socket.getInputStream())); outputStream = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream())); } + /** + * attempts to connect to the Variable Server on the given host and port with a timeout + * + * @param host Variable Server machine name + * @param port Variable Server port number + * @param timeout Time out in milliseconds + * @throws UnknownHostException UnknownHostException + * @throws IOException IOException + * @throws SecurityException SecurityException + */ + public VariableServerConnection(String host, int port, int timeout) throws UnknownHostException, IOException, SecurityException, SocketTimeoutException { + socket = new Socket(); + SocketAddress addr = new InetSocketAddress(host, port); + socket.connect(addr, timeout); + inputStream = new BufferedReader(new InputStreamReader(socket.getInputStream())); + outputStream = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream())); + } + /** * sends the given command and any commands in the output stream's buffer * to the Variable Server. The command is written to the output stream, diff --git a/trick_source/java/src/main/java/trick/simcontrol/SimControlApplication.java b/trick_source/java/src/main/java/trick/simcontrol/SimControlApplication.java index 545ed988..ab4aeb05 100644 --- a/trick_source/java/src/main/java/trick/simcontrol/SimControlApplication.java +++ b/trick_source/java/src/main/java/trick/simcontrol/SimControlApplication.java @@ -29,6 +29,7 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.MulticastSocket; import java.net.UnknownHostException; +import java.net.SocketTimeoutException; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.NotYetConnectedException; @@ -171,6 +172,10 @@ public class SimControlApplication extends TrickApplication implements PropertyC private static String host; private static int port = -1; private static boolean isRestartOptionOn; + //True if an error was encountered during the attempt to connect to Variable Server during intialize() + private boolean errOnInitConnect = false; + //Time out when attempting to establish connection with Variable Server in milliseconds + private int varServerTimeout = 5000; // The object of SimState that has Sim state data. private SimState simState; @@ -405,22 +410,30 @@ public class SimControlApplication extends TrickApplication implements PropertyC String errMsg = "Error: SimControlApplication:getInitializationPacket()"; try { if (host != null && port != -1) { - commandSimcom = new VariableServerConnection(host, port); + commandSimcom = new VariableServerConnection(host, port, varServerTimeout); } else { commandSimcom = null; } } catch (UnknownHostException host_exception) { /** The IP address of the host could not be determined. */ errMsg += "\n Unknown host \""+host+"\""; - errMsg += "\n Please use a valid host name (e.g. localhost)"; - printErrorMessage(errMsg); + errMsg += "\n Please use a valid host name (e.g. localhost)"; + errOnInitConnect = true; + printErrorMessage(errMsg); + } catch (SocketTimeoutException ste) { + /** Connection attempt timed out. */ + errMsg += "\n Connection Timeout \""+host+"\""; + errMsg += "\n Please try a different host name (e.g. localhost)"; + errOnInitConnect = true; + printErrorMessage(errMsg); } catch (IOException ioe) { /** Port number is unavailable, or there is no connection, etc. */ errMsg += "\n Invalid TCP/IP port number \""+port+"\""; errMsg += "\n Please check the server and enter a proper port number!"; errMsg += "\n IOException ..." + ioe; errMsg += "\n If there is no connection, please make sure SIM is up running properly!"; - printErrorMessage(errMsg); + errOnInitConnect = true; + printErrorMessage(errMsg); } if (commandSimcom == null) { @@ -644,6 +657,10 @@ public class SimControlApplication extends TrickApplication implements PropertyC view.setToolBar(createToolBar()); view.setStatusBar(createStatusBar()); + if(errOnInitConnect && (runningSimList != null) ) { + runningSimList.addItem("localhost : " + port); + } + show(view); } @@ -1396,7 +1413,7 @@ public class SimControlApplication extends TrickApplication implements PropertyC // Reset the packet length or future messages will be clipped. packet.setLength(buffer.length); // version Trick 10 or later - if (info[7] != null && info[7].startsWith("10.")) { + if (info[7] != null) { if (runningSimList != null) { String hostPort = info[0] + " : " + info[1] + " (" + info[5] + " " + info[6] + ")"; if (!UIUtils.comboBoxContains((DefaultComboBoxModel)runningSimList.getModel(), hostPort)) { From f8a079ec7147b037b98460930ddc40052774ec90 Mon Sep 17 00:00:00 2001 From: Thomas Brain Date: Thu, 18 Apr 2024 13:47:06 -0500 Subject: [PATCH 09/52] write template directive before template instance (#1679) * Rework swig template declarations to be written before used in the containing class so that private methods are honored * Fix SIM_test_ip for swig 4.2.0 and implemented review suggestions * Additional review comment fixes --------- Co-authored-by: Thomas Brain --- libexec/trick/convert_swig | 73 +++++++++++++------ .../models/test_ip/include/Namespace_tests.hh | 6 +- 2 files changed, 56 insertions(+), 23 deletions(-) diff --git a/libexec/trick/convert_swig b/libexec/trick/convert_swig index c43f4d40..27296bdb 100755 --- a/libexec/trick/convert_swig +++ b/libexec/trick/convert_swig @@ -590,18 +590,19 @@ sub process_class($$$$$) { my ($class_name) ; my $template_typedefs ; - ## Extract the class_name from the class_string $class_string =~ /^(?:class|struct)\s+ # keyword class or struct ([_A-Za-z]\w*) # class name \s*[\{\:]$ /sx or die "Internal error" ; $class_name = $1 ; - $$new_contents_ref .= $class_string ; + + my $class_content; + $class_content .= $class_string ; if ( $class_string !~ /\{$/ ) { $$contents_ref =~ s/^(.*?\s*\{)//s ; - $$new_contents_ref .= $1 ; + $class_content .= $1 ; } ($extracted, $$contents_ref) = extract_bracketed( "{" . $$contents_ref , "{}") ; @@ -614,10 +615,21 @@ sub process_class($$$$$) { #print "*** extracted = $extracted ***\n" ; #print "*** contents = $$contents_ref ***\n" ; + my $save_namespace_content; + + if ( $curr_namespace ne "" ) { + my @split_namespaces = split "::", $curr_namespace; + my $sanitized_namespace = $split_namespaces[-1] ; + my @namespace_split = split /namespace\s*$sanitized_namespace/, $$new_contents_ref; + $save_namespace_content = 'namespace ' . $sanitized_namespace . $namespace_split[-1]; + $$new_contents_ref = join('namespace ' . $sanitized_namespace, $namespace_split[0 .. $#namespace_split-1]); + } # SWIG doesn't like "const static". Change it to "static const" $extracted =~ s/const\s+static/static const/g ; + my $isSwigExcludeBlock = 0; + # templated variables need to be declared with the SWIG %template directive. # This loop looks for any templated variables and creates the %template lines. while ( $extracted =~ s/^(.*?)(?:($template_var_def))//sx ) { @@ -626,7 +638,17 @@ sub process_class($$$$$) { if ( $non_var ne "" ) { #print "*** non_var = $non_var ***\n" ; - $$new_contents_ref .= $non_var ; + $class_content .= $non_var ; + my $ifndefSwig = $non_var; + if ($isSwigExcludeBlock == 0) { + if ($ifndefSwig =~ /(?:ifndef\s*SWIG|if\s*!\s*defined\s*\(\s*SWIG\s*\))/ ) { + $isSwigExcludeBlock = 1; + } + } else { + if ($ifndefSwig =~ /endif/ ) { + $isSwigExcludeBlock = 1; + } + } } if ( $template_var_def_str ne "" ) { @@ -635,7 +657,6 @@ sub process_class($$$$$) { $template_var_def_str =~ /(.*?>)\s*([_A-Za-z]\w*).*?;/s ; my ($template_full_type) = $1 ; my ($var_name) = $2 ; - $$new_contents_ref .= $template_var_def_str ; $template_full_type =~ /([_A-Za-z][:\w]*)\s* 0x040000\n\%pythoncode \%{\n __setattr__ = _swig_setattr_nondynamic_instance_variable(object.__setattr__)\n\%}\n#endif\n" ; - $$new_contents_ref .= $extracted . ";\n" ; - # write out the templated variable declaration lines found in this class. - $$new_contents_ref .= $template_typedefs ; + $class_content .= "\n#if SWIG_VERSION > 0x040000\n\%pythoncode \%{\n __setattr__ = _swig_setattr_nondynamic_instance_variable(object.__setattr__)\n\%}\n#endif\n" ; + $class_content .= $extracted . ";\n" ; my $c_ = "$curr_namespace$class_name" ; $c_ =~ s/\:/_/g ; # Add a #define line that signals that this class has been processed by swig. Classes excluded in #if 0 blocks will # not have this #define defined. - $$new_contents_ref .= "#define TRICK_SWIG_DEFINED_$c_" ; + $class_content .= "#define TRICK_SWIG_DEFINED_$c_" ; + if ( $save_namespace_content ne "" ) { + $$new_contents_ref .= $save_namespace_content; + } + $$new_contents_ref .= $class_content; } ## ================================================================================ diff --git a/test/SIM_test_ip/models/test_ip/include/Namespace_tests.hh b/test/SIM_test_ip/models/test_ip/include/Namespace_tests.hh index 9977fcd8..a765b809 100644 --- a/test/SIM_test_ip/models/test_ip/include/Namespace_tests.hh +++ b/test/SIM_test_ip/models/test_ip/include/Namespace_tests.hh @@ -54,8 +54,12 @@ namespace NS2 { class B { public : //TODO: in the clang based convert_swig, we can use NS1 without the leading :: - //NS1::A< int > m ; + //Since swig 4.2.0, leading :: causes error. +#if SWIG_VERSION >= 0x040200 + NS1::A< int > m ; +#else ::NS1::A< int > m ; +#endif } ; } #endif From 6937d003b3dba0553bf41158fbb3f0246e30bdcf Mon Sep 17 00:00:00 2001 From: Pherring04 <158035107+Pherring04@users.noreply.github.com> Date: Thu, 18 Apr 2024 13:48:20 -0500 Subject: [PATCH 10/52] fixed outdated trick_message function calls in documentation (#1691) --- .../Status-Message-System.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/documentation/simulation_capabilities/Status-Message-System.md b/docs/documentation/simulation_capabilities/Status-Message-System.md index a93777a1..c2518f9e 100644 --- a/docs/documentation/simulation_capabilities/Status-Message-System.md +++ b/docs/documentation/simulation_capabilities/Status-Message-System.md @@ -102,9 +102,10 @@ By default these are all enabled. If you disable `file` at startup, the `send_hs That means you cannot then later try to enable and subscribe to file/device. ```cpp -int message_cout_set_enabled(int yes_no) ; -int message_file_set_enabled(int yes_no) ; -int message_device_set_enabled(int yes_no) ; +int set_enabled(bool yes_no) +trick_message.mcout.set_enabled(bool yes_no); +trick_message.mdevice.set_enabled(bool yes_no); +trick_message.mfile.set_enabled(bool yes_no); ``` To enable / disable showing colored messages in Trick's default subscribers: @@ -112,9 +113,10 @@ To enable / disable showing colored messages in Trick's default subscribers: By default color is enabled for `cout` and `device`. Color is achieved by adding ANSI escape codes around the message. ```cpp -int message_cout_set_color(int yes_no) ; -int message_file_set_color(int yes_no) ; -int message_device_set_color(int yes_no) ; +int set_color(bool yes_no) +trick_message.mcout.set_color(bool yes_no); +trick_message.mdevice.set_color(bool yes_no); +trick_message.mfile.set_color(bool yes_no); ``` [Continue to Command Line Arguments](Command-Line-Arguments) From 873e4e203db1ec46b98bdf81dd0b96be30a523af Mon Sep 17 00:00:00 2001 From: Thomas Brain Date: Tue, 23 Apr 2024 10:49:39 -0500 Subject: [PATCH 11/52] Fix bug dereferencing namespaces in convert_swig (#1696) --- libexec/trick/convert_swig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libexec/trick/convert_swig b/libexec/trick/convert_swig index 27296bdb..ca58cad6 100755 --- a/libexec/trick/convert_swig +++ b/libexec/trick/convert_swig @@ -622,7 +622,7 @@ sub process_class($$$$$) { my $sanitized_namespace = $split_namespaces[-1] ; my @namespace_split = split /namespace\s*$sanitized_namespace/, $$new_contents_ref; $save_namespace_content = 'namespace ' . $sanitized_namespace . $namespace_split[-1]; - $$new_contents_ref = join('namespace ' . $sanitized_namespace, $namespace_split[0 .. $#namespace_split-1]); + $$new_contents_ref = join('namespace ' . $sanitized_namespace, @namespace_split[0 .. $#namespace_split-1]); } # SWIG doesn't like "const static". Change it to "static const" From e4f6774b3c220c2df3ccce652b95e2efb206b067 Mon Sep 17 00:00:00 2001 From: Hong Chen Date: Thu, 25 Apr 2024 10:17:40 -0500 Subject: [PATCH 12/52] Updated to use the latest swig and llvm 15. (#1699) * Updated to use the latest swig and llvm 15. * Updated to use the latest llvm that comes with the macos docker image. * Added missing install * Test without installing llvm * Tested to link llvm * Changed back to use downloaded llvm+clang package. * Check if macos (13-arm) image can find the installed udunits. * Try macos-13 if it works as documented * Need to match the cpu type of macos and the build for clang+llvm. * Change to Mac-12 for gtest.h to be found. * Switch back to Mac-13 as gtest.h is not a factor for this CI process.. --- .github/workflows/test_macos.yml | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/.github/workflows/test_macos.yml b/.github/workflows/test_macos.yml index 7ac9d157..e07f4e45 100644 --- a/.github/workflows/test_macos.yml +++ b/.github/workflows/test_macos.yml @@ -13,11 +13,10 @@ on: jobs: macOS: - runs-on: macos-latest + runs-on: macos-13 steps: - name: Checkout repository - uses: actions/checkout@master - + uses: actions/checkout@v3 - name: Install gtest run: | brew install googletest @@ -26,21 +25,13 @@ jobs: # sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.15.pkg -target / brew install --cask xquartz brew install udunits openmotif maven - wget https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.6/clang+llvm-14.0.6-x86_64-apple-darwin.tar.xz - tar -xvf clang+llvm-14.0.6-x86_64-apple-darwin.tar.xz - brew install autoconf automake libtool - wget https://github.com/swig/swig/archive/refs/tags/v4.1.1.tar.gz - tar -xvzf v4.1.1.tar.gz - cd swig-4.1.1 - ./autogen.sh - ./configure - make - make install - cd .. + brew install swig + wget https://github.com/llvm/llvm-project/releases/download/llvmorg-15.0.7/clang+llvm-15.0.7-x86_64-apple-darwin21.0.tar.xz + tar -xvf clang+llvm-15.0.7-x86_64-apple-darwin21.0.tar.xz - name: Build Trick run: | export MAKEFLAGS=-j4 - ./configure --with-llvm=${GITHUB_WORKSPACE}/clang+llvm-14.0.6-x86_64-apple-darwin + ./configure --with-llvm=${GITHUB_WORKSPACE}/clang+llvm-15.0.7-x86_64-apple-darwin21.0 make - name: Test run: | From 26c18d95af1731f9f10b73de79d19fb265f579e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 14:56:17 -0500 Subject: [PATCH 13/52] Bump ejs from 3.1.9 to 3.1.10 in /trick_source/web/dashboard (#1705) Bumps [ejs](https://github.com/mde/ejs) from 3.1.9 to 3.1.10. - [Release notes](https://github.com/mde/ejs/releases) - [Commits](https://github.com/mde/ejs/compare/v3.1.9...v3.1.10) --- updated-dependencies: - dependency-name: ejs dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- trick_source/web/dashboard/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/trick_source/web/dashboard/package-lock.json b/trick_source/web/dashboard/package-lock.json index 588d8289..c438667a 100644 --- a/trick_source/web/dashboard/package-lock.json +++ b/trick_source/web/dashboard/package-lock.json @@ -6853,9 +6853,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "requires": { "jake": "^10.8.5" } From 353b5afd8487e8795dc5d8de34f1716c463c35f7 Mon Sep 17 00:00:00 2001 From: "John M. Penn" Date: Mon, 13 May 2024 13:49:46 -0500 Subject: [PATCH 14/52] Wrote a Real-time Best Practices HOW TO --- docs/howto_guides/How-To-Guides.md | 1 + docs/howto_guides/Realtime-Best-Practices.md | 520 ++++++++++++++++++ docs/howto_guides/images/NUMA_Arch.png | Bin 0 -> 141507 bytes docs/howto_guides/images/RealtimeOverRun.png | Bin 0 -> 123456 bytes docs/howto_guides/images/RealtimeUnderRun.png | Bin 0 -> 156032 bytes .../images/RealtimeWithItimer.png | Bin 0 -> 187600 bytes docs/howto_guides/images/UMA_Arch.png | Bin 0 -> 57372 bytes 7 files changed, 521 insertions(+) create mode 100644 docs/howto_guides/Realtime-Best-Practices.md create mode 100644 docs/howto_guides/images/NUMA_Arch.png create mode 100644 docs/howto_guides/images/RealtimeOverRun.png create mode 100644 docs/howto_guides/images/RealtimeUnderRun.png create mode 100644 docs/howto_guides/images/RealtimeWithItimer.png create mode 100644 docs/howto_guides/images/UMA_Arch.png diff --git a/docs/howto_guides/How-To-Guides.md b/docs/howto_guides/How-To-Guides.md index 0c17bc94..d82b22ea 100644 --- a/docs/howto_guides/How-To-Guides.md +++ b/docs/howto_guides/How-To-Guides.md @@ -11,3 +11,4 @@ 01. [How to Containerize Trick with Docker](How-To-Containerize-Trick-with-Docker) 01. [How to Setup a Virtual Python Environment](How-To-Python-Virtual-Environment) 01. [Checkpointing Best Practices](Checkpointing-Best-Practices) +01. [Realtime Best Practices](RealTime-Best-Practices) diff --git a/docs/howto_guides/Realtime-Best-Practices.md b/docs/howto_guides/Realtime-Best-Practices.md new file mode 100644 index 00000000..b72847e3 --- /dev/null +++ b/docs/howto_guides/Realtime-Best-Practices.md @@ -0,0 +1,520 @@ +# Trick Real-time Best Practices + +**Contents** + +* [Purpose](#Purpose)
+* [Prerequisite Knowledge](#prerequisite-knowledge)
+* [Do's, Don'ts and Wisdom](#guidelines)
+ + + +--- +## Purpose +The intention of this document is to compile and share practical knowledge, based on the experience of people in the Trick simulation community regarding the development of real-time computer simulations. + + +## Prerequisite Knowledge +(Assuming you've completed the [Trick Tutorial] (https://nasa.github.io/trick/tutorial/Tutorial)) + +-- + + +### Simulation Time vs Real Time + +Real world dynamic systems change in real time (the time that you and I experience). A simulated dynamic system changes in simulation-time. Simulation time begins at t=0, and runs until we stop it. Simulation time can elapse faster or slower than real-time. + +If we want to interact with a simulation as if it were real, we need to synchronize simulation time to real time. This requires that a simulation is capable of running at least as fast as real time. If it is incapable, then it can not be made to run in real time. + +-- + + +### Real Time Clock +* By default, the Trick real-time scheduler will synchronize to the system clock: + * ```clock_gettime(CLOCK_REALTIME,…)``` [Linux] + * ```gettimeofday()``` [Mac OS] + +* The Trick real-time scheduler can also be configured to synchronize to a [custom real-time clock] (https://nasa.github.io/trick/documentation/simulation_capabilities/Realtime-Clock). + +-- + + +### Enabling Real-time + +Trick tries to consistently and repetitively execute its scheduled math models to completion within some predetermined real-time interval for an indefinite period. This real-time interval is called the **real-time software frame**. + +To enable real-time synchronization, call ```trick.real_time_enable()``` in the input file. + +[Ref: Realtime](https://nasa.github.io/trick/documentation/simulation_capabilities/Realtime) + +-- + + +### Real-time Software Frame +The real-time software frame determines how often Trick will synchronize simulation time to the real time clock. Simulation time will run as fast as it can in the intervals between real time synchronizations. + +To set the real time software frame, call the following in the input file: + +```python +trick.exec_set_software_frame(double time) +``` +[Ref: Software Frame](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler#software-frame) + +-- + + +### Under-runs and Over-runs + +An **under-run** occurs when the Trick executive finishes running all of its scheduled jobs, between synchronizations to the real time clock. This is a **good thing**. In this case the executive will enter a spin loop, waiting for the next real-time frame to start. + + +![Real time Under Run](images/RealtimeUnderRun.png) + +An **over-run** occurs if the executive does not finish running all of its scheduled jobs. This is a **bad-thing**. In this case, the executive will immediately start the next frame in an attempt to catch up. + + +![Real time Over Run](images/RealtimeOverRun.png) + +-- + + +### Itimers ( Being Nice to Other Processes On Your System ) + +During real time under runs you may want to release the processor for other tasks to use instead of spinning waiting for the clock. Trick provides a real-time sleep timer based on itimers. You might think of it as a “snooze button”. + +To enable itimers call ```trick.itimer_enable()``` from the input file. + +With itimer_enabled, the simulation will sleep() after completing the jobs scheduled for the current frame. The itimer will then wake the sim 2ms before the real-time frame is to expire. The executive will spin for the final 2ms. The 2ms spin is there because an itimer interval is not guaranteed to be perfectly precise. + + +![Real time with itimer](images/RealtimeWithItimer.png) + +[Ref: Itimer](https://nasa.github.io/trick/documentation/simulation_capabilities/Realtime-Timer) + +-- + + +### Frame-Logging ( Critical For Improving Sim Performance ) + +The failure of a simulation to meet its scheduling requirements can have many causes. To aid in solving these problems, Trick can gather simulation performance data, called **frame-logging** by calling: + +```trick.frame_log_on()``` + +in your sim's input file. + +Note that frame logging will add some overhead to a simulation as each job is timed and recorded. + +[Ref: Frame-Logging](https://nasa.github.io/trick/documentation/simulation_capabilities/Frame-Logging) + + +#### Frame Log Files +Frame logging records the following data files in your sim’s RUN_ directory: + +* [```log_frame.trk```](#log-frame-trk)
+* [```log_frame_trickjobs.trk```](#log-frame-trickjobs-trk) +* [```log_frame_frame_userjobs_main.trk```](#log-frame-userjobs-main-trk) + +Note that **main** in this file name refers to the main thread. +If child threads (for example: C1, C2, ...) have been specified in the sim then frame log files for those threads will also be created ( that is:```log_trick_frame_userjobs_C1.trk```, ```log_trick_frame_userjobs_C2.trk```, ```...```). + +--- + + +#### ```log_frame.trk``` +* Number of fields per record : 5 + +|# | Name | Type | Units | Description | +|--:|:---- |:-----|:-----:|-------------| +| 1| ```sys.exec.out.time``` | double | seconds |Simulation Time | +| 2| ```trick_real_time.rt_sync.frame_time``` | double | seconds | This badly named parameter expresses the amount of time that the scheduled jobs in this frame took to execute. See: [figure](#figure-Real-time-under``-run) + | +|3| ```trick_real_time.rt_sync.frame_overrun ``` | double | seconds | The magnitude of the current overrun. See: [figure](#figure-Real-time-over-run) + | +|4| ```JOB_data_record_group_frame_userjobs.data_record...``` | double | s | How long the write job for the user Jobs data recording group took. | +|5| ```JOB_data_record_group.trickjobs...``` | double | seconds | How long did the write job for the Trick Jobs data recording group take. | + +--- + + +#### ```log_frame_userjobs_main.trk``` +* Number of fields per record : 1 + *#user-jobs* + +|# | Name | Type | Units | Description | +|--:|:---- |:-----|:-----:|-------------| +| 1| ```sys.exec.out.time``` | double | seconds |Simulation Time | +| n| *user-job-name* | double | seconds |How long the user-job took to execute. | + +--- + + +#### ```log_frame_trickjobs.trk``` +* Number of fields per record : 1 + *#trick-jobs* + +|# | Name | Type | Units | Description | +|--:|:---- |:-----|:-----:|-------------| +| 1| ```sys.exec.out.time``` | double | seconds |Simulation Time | +| n| *trick-job-name* | double | seconds |How long the trick-job took to execute. | + +### Analyzing the Frame Log Files +There are several ways we can examine/ analyze the data logged in these files. + +#### [trick-DP](https://nasa.github.io/trick/tutorial/ATutPlottingData) +When you build your Trick sim, the following data-product files are created for you to plot your sim's frame log data. + +* ```DP_rt_frame.xml``` +* ```DP_rt_timeline.xml``` +* ```DP_rt_timeline_init.xml``` +* ```DP_rt_trickjobs.xml``` +* ```DP_rt_userjobs.xml``` + +#### [koviz](https://github.com/nasa/koviz) +**koviz** Is an open-source project for plotting Trick data-recording files. It's particularly good for Monte Carlo data plotting. It also has a nifty feature for processing frame-log files. Not only can it plot them, but ```% koviz -rt RUN_directory``` will generate a report that will list the top 10 spikes in your frame log. + +**TIP:**`` ```trick_real_time.rt_sync.rt_monitor``` (the Trick real-time monitor) should show the max job time. If not, you might have problems to solve. + +-- + +### Other Useful Files Generated by a Trick Sim Run + +| Name | Desscription| +|:-----|:------------| +|```RUN_*/S_job_execution```| Lists the simulation jobs by Name, Job ID, Trick Thread ID (PID) Job class, Phase, Start time, Stop time, Cycle, and whether the job is enabled.| +|```RUN_*/S_run_summary ```|(Should be called build_summary) - Documents the name and path of the executable and the input file, the build time of the simulation executable, and the Trick version. It also contains the list of environment variables used when the simulation was built and the model versions.| +|```RUN_*/send_hs ```|the end of this file contains run statistics that may be useful.| + +-- + +### Trick Executive Scheduler + +The + [Executive Scheduler](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler) determines how, when, and where (which CPU) the jobs in your Trick sim are executed. + + +* [Job Control](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler#job-control) - describes the Trick job control interface. +* [Thread Control](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler#thread-control) - describes the attributes and behaviors of different Trick thread types. + +Thread control will in some cases require that you isolate CPUs at boot-time. This is usualy done with the **isolcpus** boot parameter: + +```isolcpus= cpu_number[, cpu_number,...]``` + +Ref: [RedHat: Isolating CPUs Using tuned-profiles-realtime](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_for_real_time/7/html/tuning_guide/isolating_cpus_using_tuned-profiles-realtime) + + + +## Do's, Don'ts, and Wisdom + +--- +### 1 Trick +--- + +#### 1.1 Trick events are computationally expensive. Use them judiciously. + +Trick events can provide a quick, easy, way to customize the behavior of a sim, based on some condition. But, because they require Python interpretation, they are slow. They are not intended for implementation of permanent sim functionality. If they are over used, they can seriously degrade simulation performance. So, take it easy with the events. + +See [Event Manager] (https://nasa.github.io/trick/documentation/simulation_capabilities/Event-Manager). + +-- + +#### 1.2 Disable Trick run-time components that your sim doesn't need. + +```default_trick_sys.sm```, the file included at the top of any Trick ```S_define``` file defines numerous "modules" that provide functionality to a Trick sim. Whereas some of these modules ( like the Executive, MemoryManager, CommandLineArguments) are required for any Trick Simulation to function, many are optional. If the modules are not needed, then disabling them can improve simulation perfromance. + +Inserting one or more of the ```#define``` statements listed below to the top of the ```S_define```, just before the inclusion of ```default_trick_sys.sm``` will disable those modules. + +``` +#define TRICK_NO_EXECUTIVE +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MEMORY_MANAGER +#define TRICK_NO_CHECKPOINT_RESTART +#define TRICK_NO_SIE +#define TRICK_NO_COMMANDLINEARGUMENTS +#define TRICK_NO_MESSAGE +#define TRICK_NO_INPUTPROCESSOR +#define TRICK_NO_VARIABLE_SERVER +#define TRICK_NO_DATA_RECORD +#define TRICK_NO_REALTIME +#define TRICK_NO_FRAMELOG +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_INTEGRATE +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF +#define TRICK_NO_UNITTEST +``` +##### Example +Using "SIM_submarine" as an example, the following demonstrates disabling unneeded ```default_trick_sys.sm``` modules. + +``` +/************************************************************ +PURPOSE: + ( Simulate a submarine. ) +LIBRARY DEPENDENCIES: + ((submarine/src/Submarine.cpp)) +*************************************************************/ +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF +#define TRICK_NO_UNITTEST +#include "sim_objects/default_trick_sys.sm" + +##include "submarine/include/Submarine.hh" + +class SubmarineSimObject : public Trick::SimObject { + public: + + ... +``` + +-- + +#### 1.3 Consider running Trick variable server clients and Sims on different machines. +Trick variable server clients communicate with a simulation via a TCP/IP connection. +The client process may, but isn't required to run on the same machine as your simulation process. On the same machine, both will competing for the same resources. This can degrade sim performance, especially when clients are rendering high-definition graphics. + +-- + +#### 1.4 Compile Trick and Trick sims with optimizations turned on + +Example : +In my ```S_overrides.mk``` file, I'll add the "-O2" optimization flag. + +``` +TRICK_CFLAGS += -Imodels -O2 +TRICK_CXXFLAGS += -Imodels -O2 +``` + +See: + +* [GCC Optimization Options](https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html) +* [Clang Optimization Options](https://clang.llvm.org/docs/CommandGuide/clang.html#code-generation-options) + +-- + +#### 1.5 Disable unused jobs in Trick sims + +Jobs can be enabled and disabled from the input file with the following commands: + +``` +trick.exec_get_job(, ).enable() +trick.exec_get_job(, ).disable() +``` + +Alternatively, we can use: + +``` +trick.exec_set_job_onoff(, , True|False) +``` + +If a job isn't necessary for a particular RUN scenario, consider disabling it. But, make sure that it doesn’t impact the rest of the sim. + +##### Example: + +Suppose ```SIM_submarine```'s S_define file contains the job ```submarine.diagnostics```: + +``` +... +(0.1, "scheduled") submarine.diagnostics(); +... +}; +SubmarineSimObject dyn; +... +``` +This job only transmits information. It doesn't effect the simulation, but does degrade real-time performance slightly. To disable it, we'll add the following to our input file: + +```trick.exec_get_job("dyn.submarine.diagnostics", 0).disable()``` + +-- + +#### 1.6 Name the child threads in your Trick sim +Do this for easier identification of time spikes. + +```trick.exec_get_thread().set_name()``` + +##### Example: + +In ```SIM_lander's``` ```S_define```, suppose we specify that ```lander.control()``` job is to run in thread 1 (C1): + +``` C1 (0.1, "scheduled") lander.control() ;``` + +Then in the input file, we add: + +```trick.exec_get_thread(1).set_name("LanderControl")``` + +to name the C1 thread "LanderControl". + +-- + +#### 1.7 Use ```default_data``` jobs to specify the default sim state. Customize it with the input file. + +Prefer ```default_data``` jobs as the **primary** means of initializing your sim. Then, **customize** the default for different scenarios, with an input file. Try to make your sim capable of initializing to a valid state with an empty input file. + +Doing this has several benefits. + +1. The sim will initialize faster because ```default_data``` jobs are compiled rather that interpreted. + +2. If you can test and confirm that your base, default, "empty input file" sim is initialized to a valid state, then it will be easier to identify errors when the sim is customized for different scenarios, via an input file. It saves time and reduces pain. + +--- +### 2. User Simulation Software +--- + +#### 2.1 Don't read from the disk during run-time. +Disk access is slow. If you need to read from disk, do it in a ```default_data```, or ```initialization``` job. + +-- + +#### 2.2 Try to reduce variation in job cycle times. +Realtime performance is largely about minimizing the worst case, rather than the average case. +The most well behaved job takes the same time, every time. + +-- + +#### 2.3 Minimize dynamic memory allocation during run-time +The time to dynamically allocate memory can vary, and in the worst-case is unbounded. This is bad for real-time performance. + +-- + +#### 2.4 Allow the compiler to help you find problems + +Modern compilers have gotten very helpful, and can check for a lot of potential problems. +Many people are familiar with the compiler warning options like ```-Wall```, ```-Wextra```, and ```-Wshadow```. Be aware that there are a lot more, to help you find problems: + +* [GCC Warning Options](https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html) +* [CLANG Warning Options](https://clang.llvm.org/docs/DiagnosticsReference.html) + +-- + +#### 2.5 Fix All Compiler Warnings And Errors +Many a time the necessary clue needed to solve an intractable problem was there all along, in the form of an unheeded warning that scrolled by unseen. + +Don't ignore the messages. + +When Trick builds a sim, it generates the files, ```MAKE_out``` and ```MAKE_err``` in the ```build``` directory. These files contain the makefile output of the sim build. It's a good idea to check these for warnings on a big sim build. + +--- +### 3. Hardware +--- + +#### 3.1 Know Your Simulation Machine Architecture +Getting the best performance from a simulation on a multi-CPU machine requires understanding of the machine's hardware architecture. Particularly important is data transfer delay from memory to the CPU (latency). Depending on the machine architecture, and how data processing is allocated across CPUs, the time used for memory access, and therefore simulation performance can very significantly. + +##### Uniform Memory Access (UMA) +Uniform memory access (UMA) is a multi-processor model in which all processors share the physical memory uniformly. All memory accesses have the same latency. + +![Real time with itimer](images/UMA_Arch.png) + +In an UMA architecture, as the number of CPUs increases, the higher tha chance that the system bus will become a bottle-neck. + +##### Non Uniform Memory Access (NUMA) +Non-Uniform Memory Access (NUMA) is a multiprocessor model in which each processor is connected to dedicated memory but may access memory attached to other processors in the system. A NUMA architecture is one in which accesses to different addresses may have different latencies depending on where the data is stored. NUMA essentially connects UMA elements via a data-transfer interconnect. For best performance, applications should be “NUMA aware”. + +![Real time with itimer](images/NUMA_Arch.png) + +On a Linux system the following will display the available nodes, CPUs, memory, and a normalized measure of access latency between nodes. + +```% numactl --hardware``` + +##### Example 1 +``` +available: 1 nodes (0) +node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 +node 0 size: 63986 MB +node 0 free: 54389 MB +node distances: +node   0 +  0:  10 +``` +This computer has one NUMA node with 20 CPUs, and 64 Gigabytes. + +##### Example 2 +``` +available: 2 nodes (0-1) +node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 24 25 26 27 28 29 30 31 32 33 34 35 +node 0 size: 15371 MB +node 0 free: 3926 MB +node 1 cpus: 12 13 14 15 16 17 18 19 20 21 22 23 36 37 38 39 40 41 42 43 44 45 46 47 +node 1 size: 16120 MB +node 1 free: 4504 MB +node distances: +node   0   1  +  0:  10  21  +  1:  21  10  +``` +This computer has two NUMA nodes, each with 24 CPUs, and each with about 16 gigabytes of local memory, for a total of 32 Gigabytes. The "distances" matrix at the bottom tells us that memory access latency between the nodes is (21/10) = 2.1 times the latency within a node. + +-- + +#### 3.2 Turn Off Any Energy-Efficiency Settings +Energy efficiency and performance are usually trade-offs. Turn off any energy-efficiency settings the computer may have enabled, usually in the BIOS. + +-- + +#### 3.3 Fewer, Faster Cores Are Preferable to More, Slower Cores +For simulation hosts, fewer but faster cores is usually preferable to more but slower cores + +* **Server-class** machines are designed for throughput. +* **Performance** machines are designed for low latency, high-speed computing. + +-- + +#### 3.4 Buy More Memory +Insufficient random access memory (RAM) leads to virtual memory page swapping, which degrades real-time performance. More RAM is one of the easiest and cheapest ways of boosting machine performance. + +-- + +#### 3.5 Avoid Intel “Efficiency” Cores +Intel "efficiency" cores aren’t currently recognized by most Linux OS’s and will cause a lot of problems. They are more energy efficient, but slower, the opposite of what hard real-time needs. RHEL8 is unable to determine which cores are “E” (Efficiency) and which are “P” (Performance). Buy more memory. Do it! + +--- +### 4. Network +--- + +#### 4.1 Have Multiple Network Interface Jacks On Sim Machines +Isolate all sim-to-sim traffic to one network interface. Leave the other for connections to the box and OS traffic. + +-- + +#### 4.2 Use One Master Clock For All Machines On The Network +All clocks will drift apart unless periodically synchronized. Synchronization means that one of the clocks must be the reference, or "master". Multiple unsynchronized clocks in a real-time system is nightmare fuel. + +--- +### 5. Miscellaneous +--- + +#### 5.1 Maintain a history of simulation performance. + +Maintain a performance history of your sim as development procedes. This can be very useful evidence in solving problems. Begin frame logging the sim even before implementing real-time. + +-- + +#### 5.2 Take care when "tuning" operating system behavior +Overriding the OS by isolating CPUs, assigning threads to CPUs, redirecting interrupts, changing priorities, and so forth can be powerful techniques to improve performance, but with the same power they can degrade it. Modern operating systems are pretty good at managing performance. If you decide to "help" the OS, you’ll need to know what you’re doing. Take the time to study up first. + +Some useful learning material: + +* [Challenges Using Linux as a Real-Time Operating System] +(https://ntrs.nasa.gov/api/citations/20200002390/downloads/20200002390.pdf) +* [Optimizing RHEL 8 for Real Time for low latency operation] +(https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_for_real_time/8/html-single/optimizing_rhel_8_for_real_time_for_low_latency_operation/index) + +-- + +#### 5.3 Don’t isolate CPU 0 +Nothing good can come from this. + +-- + +#### 5.4 Best Performance Requires Root Privileges + +Ways to give root privilege to sim: + +1. Run as root ( Don't ) +2. Change owner of executable to root and set user id bit + +Use ```sudo``` command to give root privileges to the simulation executable using ```chown``` and ```chmod``` commands. + +``` +chown root S_main_${TRICK_HOST_CPU}.exe +chmod 4775 S_main_${TRICK_HOST_CPU}.exe +``` \ No newline at end of file diff --git a/docs/howto_guides/images/NUMA_Arch.png b/docs/howto_guides/images/NUMA_Arch.png new file mode 100644 index 0000000000000000000000000000000000000000..4e44160226a752d681385b717f87b4aa24da13d1 GIT binary patch literal 141507 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%0D?Bk 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 E4~a_F&j0`b literal 0 HcmV?d00001 diff --git a/docs/howto_guides/images/RealtimeOverRun.png b/docs/howto_guides/images/RealtimeOverRun.png new file mode 100644 index 0000000000000000000000000000000000000000..2a2a8b6497717de4fefe6ee40eed0793cb2a2978 GIT binary patch literal 123456 zcmeFZc{r5q-#=d36BR`zv|uVBVeBN8#MnyqCCWbbeHp2w`3Tk62V-Bd3|YoLDw(X4 zb(q1(U@(|0V;IYPr_Zzeo}2qVp8NUpcO3WO$Xuq2^E}_%>%F|Lf$HgKa2!2%bkCkW z9Gds<80^_|?8=@!`@S4L$a-f_@8Mq7_q|>Q8n^e9be*4J{qX9Uv8EjewC5V@`tY6u zd%5=P`+W=RYtP(r?T}j{fU)TG-{Qf=6e!W=M%MthcCSH5?+-&;&Z|{|-ri49vZtc;$ zqxQ&u@7&0d;b5}A>h_(-W_N@RU%JQ@RFE@pAwM&Isn8-av+~up3;N?@t;)(x=e&4> zGDAl#XCtkGVh01~>nFLigsNU$zsi&BNb&gxhBynxzHa5Wj&zHDvGXtt@8!Yhxf+KYC<24iyjI8iz=%q z`#Hx^(SRZCcIQ`DkC}%0(-7Oqb%t zdERTkB4)NUpt;Tv*I7ioaX5#0QtoZ*;sdj8n-96Hw4@s>$;BIijF7-g2vqIjUkY?r z;F&sMoWpUnoae%T>?NG+08zptLta~Yq>&AH#RcKae4a8}M2}V2P9Q`yCvh1ognhl4 z#k^k;P|O*(T=3QpduPk^<^Q47^*&{s$8j_(l3O?GD?2xCVftc75c^btZM2awO;y?$lqV?@f~Xm*(-0wErZod zz6l#m1SU=m9A&Lmxeb?LWJ&#)4r(sis2tL~c*}Z`ZNu(OpkPUqTDfIH7A6L?UCtfz zU|7r}t2qq1#a%h{(+(OTY?-hYXj3s?v>~Xw4dOcb7X`lY(XiA68y*q0ogSWe-96%b z?bgIs#rY)LLqa7Vs)u9it0HtX$9cH`fJTIzls@}OENCuy5R91@s2Nc#!$wzYyGo=@ zn>8l9j?vy!CvsL0c-ZKjCZqln+7vX^LcycI`7<;y+V`rJ&eBDTbKgf!g#`*$8%4a| z7OklqGhrRggAJvPL+bPqH-I@R>h&u6U=@7s=lfk8UTEO;VP$=UtX&*J3B43`AFaEB*yCn(-ehyd0^n&;4*FO^QXhXrC()=DC;H9lBxqv7^{cj*Jyorz>m&{ zFjKsl6%)$RWkEKh1_;qvUITn|h_|Qn*W|x%1&5CbxhJehId+d_Gjwx0!w;Sdt$=@B z8jFN#l5{?XI^&O(m3nxKFSrSYS+y1nunlQqk==oOr{b3b7U^P0VoT-b56`sMCMS&p z!WfmW7~vnHaQGs^aUuFqb~y?q51VD$l?7R!q4V50WWn`!`#oV`(H}IUQ)!=W6)5-8 zd%4PaWTFL`xQZcg*m4gokX=bAPj)-SDbVHR7f+Sr0;5X|uz4?8jO>_rIxLPy?nXJ& z(}v^&oL|*w4f4)}bUNzi0L2@xNrDBkFxw9L+}#p?VV%1-IOxhI*l{FAya(>XT!8Oc zDT?;`D9;=b>1aPexvGagywuxVL~i6bsyOdWl2djPT6n)uK!F{1TN?*CB5S zpQ1S*7MzhoCKEgH-r^CrUN#*mAoxe?)>f)L$xEHZ9l96d^s@J6Ea52^7?`Bwdsf7m zbN|5ov03>9H{p9kUXc+bZn^Jf zi@SHK)?@DNghkMENuOQe@;|L3_o%t`tp1@RyEgQiXYG-~TFeX>{%{+;Cdh`sHm2VAQUScpd2*Zz-8vwcz^>xMiK ?oD|H3WnkppRQ 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 literal 0 HcmV?d00001 diff --git a/docs/howto_guides/images/RealtimeUnderRun.png b/docs/howto_guides/images/RealtimeUnderRun.png new file mode 100644 index 0000000000000000000000000000000000000000..89c99d7a1084e6e6eb92698cbd02beb7d619eb61 GIT binary patch literal 156032 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�r(#{pBl4KE0CD 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 z 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%0A3cCJ)oE_#->`Wt4^ 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 ItzFOl7hPs4hyVZp literal 0 HcmV?d00001 diff --git a/docs/howto_guides/images/RealtimeWithItimer.png b/docs/howto_guides/images/RealtimeWithItimer.png new file mode 100644 index 0000000000000000000000000000000000000000..921329a305ca3c27b1f7261f80fd2abd8b2dc63e GIT binary patch literal 187600 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 X`s1SCt&V2gkfRdPlpLxbepBmpH$&N=5y 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 e+2#ZP{ Date: Mon, 13 May 2024 14:44:17 -0500 Subject: [PATCH 15/52] Mark down formating fixes to Realtime-Best-Practices.md --- docs/howto_guides/Realtime-Best-Practices.md | 29 ++------------------ 1 file changed, 3 insertions(+), 26 deletions(-) diff --git a/docs/howto_guides/Realtime-Best-Practices.md b/docs/howto_guides/Realtime-Best-Practices.md index b72847e3..1989eb76 100644 --- a/docs/howto_guides/Realtime-Best-Practices.md +++ b/docs/howto_guides/Realtime-Best-Practices.md @@ -125,10 +125,8 @@ If child threads (for example: C1, C2, ...) have been specified in the sim then |# | Name | Type | Units | Description | |--:|:---- |:-----|:-----:|-------------| | 1| ```sys.exec.out.time``` | double | seconds |Simulation Time | -| 2| ```trick_real_time.rt_sync.frame_time``` | double | seconds | This badly named parameter expresses the amount of time that the scheduled jobs in this frame took to execute. See: [figure](#figure-Real-time-under``-run) - | -|3| ```trick_real_time.rt_sync.frame_overrun ``` | double | seconds | The magnitude of the current overrun. See: [figure](#figure-Real-time-over-run) - | +| 2| ```trick_real_time.rt_sync.frame_time``` | double | seconds | This badly named parameter expresses the amount of time that the scheduled jobs in this frame took to execute. See: [figure](#figure-Real-time-under``-run)| +|3| ```trick_real_time.rt_sync.frame_overrun ``` | double | seconds | The magnitude of the current overrun. See: [figure](#figure-Real-time-over-run) | |4| ```JOB_data_record_group_frame_userjobs.data_record...``` | double | s | How long the write job for the user Jobs data recording group took. | |5| ```JOB_data_record_group.trickjobs...``` | double | seconds | How long did the write job for the Trick Jobs data recording group take. | @@ -211,8 +209,6 @@ Ref: [RedHat: Isolating CPUs Using tuned-profiles-realtime](https://access.redha Trick events can provide a quick, easy, way to customize the behavior of a sim, based on some condition. But, because they require Python interpretation, they are slow. They are not intended for implementation of permanent sim functionality. If they are over used, they can seriously degrade simulation performance. So, take it easy with the events. See [Event Manager] (https://nasa.github.io/trick/documentation/simulation_capabilities/Event-Manager). - --- #### 1.2 Disable Trick run-time components that your sim doesn't need. @@ -266,13 +262,10 @@ class SubmarineSimObject : public Trick::SimObject { ... ``` --- - #### 1.3 Consider running Trick variable server clients and Sims on different machines. Trick variable server clients communicate with a simulation via a TCP/IP connection. The client process may, but isn't required to run on the same machine as your simulation process. On the same machine, both will competing for the same resources. This can degrade sim performance, especially when clients are rendering high-definition graphics. --- #### 1.4 Compile Trick and Trick sims with optimizations turned on @@ -289,7 +282,6 @@ See: * [GCC Optimization Options](https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html) * [Clang Optimization Options](https://clang.llvm.org/docs/CommandGuide/clang.html#code-generation-options) --- #### 1.5 Disable unused jobs in Trick sims @@ -324,7 +316,6 @@ This job only transmits information. It doesn't effect the simulation, but does ```trick.exec_get_job("dyn.submarine.diagnostics", 0).disable()``` --- #### 1.6 Name the child threads in your Trick sim Do this for easier identification of time spikes. @@ -343,7 +334,6 @@ Then in the input file, we add: to name the C1 thread "LanderControl". --- #### 1.7 Use ```default_data``` jobs to specify the default sim state. Customize it with the input file. @@ -362,18 +352,15 @@ Doing this has several benefits. #### 2.1 Don't read from the disk during run-time. Disk access is slow. If you need to read from disk, do it in a ```default_data```, or ```initialization``` job. --- #### 2.2 Try to reduce variation in job cycle times. Realtime performance is largely about minimizing the worst case, rather than the average case. The most well behaved job takes the same time, every time. --- #### 2.3 Minimize dynamic memory allocation during run-time The time to dynamically allocate memory can vary, and in the worst-case is unbounded. This is bad for real-time performance. --- #### 2.4 Allow the compiler to help you find problems @@ -383,7 +370,6 @@ Many people are familiar with the compiler warning options like ```-Wall```, ``` * [GCC Warning Options](https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html) * [CLANG Warning Options](https://clang.llvm.org/docs/DiagnosticsReference.html) --- #### 2.5 Fix All Compiler Warnings And Errors Many a time the necessary clue needed to solve an intractable problem was there all along, in the form of an unheeded warning that scrolled by unseen. @@ -443,12 +429,10 @@ node   0   1  ``` This computer has two NUMA nodes, each with 24 CPUs, and each with about 16 gigabytes of local memory, for a total of 32 Gigabytes. The "distances" matrix at the bottom tells us that memory access latency between the nodes is (21/10) = 2.1 times the latency within a node. --- #### 3.2 Turn Off Any Energy-Efficiency Settings Energy efficiency and performance are usually trade-offs. Turn off any energy-efficiency settings the computer may have enabled, usually in the BIOS. --- #### 3.3 Fewer, Faster Cores Are Preferable to More, Slower Cores For simulation hosts, fewer but faster cores is usually preferable to more but slower cores @@ -456,12 +440,10 @@ For simulation hosts, fewer but faster cores is usually preferable to more but s * **Server-class** machines are designed for throughput. * **Performance** machines are designed for low latency, high-speed computing. --- #### 3.4 Buy More Memory Insufficient random access memory (RAM) leads to virtual memory page swapping, which degrades real-time performance. More RAM is one of the easiest and cheapest ways of boosting machine performance. --- #### 3.5 Avoid Intel “Efficiency” Cores Intel "efficiency" cores aren’t currently recognized by most Linux OS’s and will cause a lot of problems. They are more energy efficient, but slower, the opposite of what hard real-time needs. RHEL8 is unable to determine which cores are “E” (Efficiency) and which are “P” (Performance). Buy more memory. Do it! @@ -473,7 +455,6 @@ Intel "efficiency" cores aren’t currently recognized by most Linux OS’s and #### 4.1 Have Multiple Network Interface Jacks On Sim Machines Isolate all sim-to-sim traffic to one network interface. Leave the other for connections to the box and OS traffic. --- #### 4.2 Use One Master Clock For All Machines On The Network All clocks will drift apart unless periodically synchronized. Synchronization means that one of the clocks must be the reference, or "master". Multiple unsynchronized clocks in a real-time system is nightmare fuel. @@ -486,7 +467,6 @@ All clocks will drift apart unless periodically synchronized. Synchronization me Maintain a performance history of your sim as development procedes. This can be very useful evidence in solving problems. Begin frame logging the sim even before implementing real-time. --- #### 5.2 Take care when "tuning" operating system behavior Overriding the OS by isolating CPUs, assigning threads to CPUs, redirecting interrupts, changing priorities, and so forth can be powerful techniques to improve performance, but with the same power they can degrade it. Modern operating systems are pretty good at managing performance. If you decide to "help" the OS, you’ll need to know what you’re doing. Take the time to study up first. @@ -496,14 +476,11 @@ Some useful learning material: * [Challenges Using Linux as a Real-Time Operating System] (https://ntrs.nasa.gov/api/citations/20200002390/downloads/20200002390.pdf) * [Optimizing RHEL 8 for Real Time for low latency operation] -(https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_for_real_time/8/html-single/optimizing_rhel_8_for_real_time_for_low_latency_operation/index) - --- +(https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_for_real_time/8/html-single/optimizing_rhel_8_for_real_time_for_low_latency_operation/index) #### 5.3 Don’t isolate CPU 0 Nothing good can come from this. --- #### 5.4 Best Performance Requires Root Privileges From d72312c6023fa36997eecb2ef7b5028c28f605d5 Mon Sep 17 00:00:00 2001 From: Hong Chen Date: Tue, 14 May 2024 10:53:11 -0500 Subject: [PATCH 16/52] Customize clang diagnostic handling. (#1707) * Cutomize clang diagnostic handling. * Removed code that was commented out. --- .../ICGDiagnosticConsumer.cpp | 39 +++++++++++++++++ .../ICGDiagnosticConsumer.hh | 42 +++++++++++++++++++ .../codegen/Interface_Code_Gen/main.cpp | 8 ++++ 3 files changed, 89 insertions(+) create mode 100644 trick_source/codegen/Interface_Code_Gen/ICGDiagnosticConsumer.cpp create mode 100644 trick_source/codegen/Interface_Code_Gen/ICGDiagnosticConsumer.hh diff --git a/trick_source/codegen/Interface_Code_Gen/ICGDiagnosticConsumer.cpp b/trick_source/codegen/Interface_Code_Gen/ICGDiagnosticConsumer.cpp new file mode 100644 index 00000000..f753ab55 --- /dev/null +++ b/trick_source/codegen/Interface_Code_Gen/ICGDiagnosticConsumer.cpp @@ -0,0 +1,39 @@ +#include +#include "clang/Basic/SourceManager.h" +#include "clang/Basic/SourceLocation.h" + +#include "ICGDiagnosticConsumer.hh" +#include "HeaderSearchDirs.hh" +#include "Utilities.hh" + + +ICGDiagnosticConsumer::ICGDiagnosticConsumer(llvm::raw_ostream &os, clang::DiagnosticOptions *diags, clang::CompilerInstance &in_ci, HeaderSearchDirs &in_hsd) + : clang::TextDiagnosticPrinter(os, diags), ci(in_ci), hsd(in_hsd) { + error_in_user_code = false; +}; +ICGDiagnosticConsumer::~ICGDiagnosticConsumer() { + +}; + + +/** + * @details + * -# Check the diagnostic level to see if an error is from user code. + * -# Terminate the build if yes, continue otherwise. +*/ +void ICGDiagnosticConsumer::HandleDiagnostic(clang::DiagnosticsEngine::Level DiagLevel, const clang::Diagnostic &Info) { + // Use TextDiagnosticPrinter to handle diagnostic if the code is user code. + // Otherwise use base DiagnosticConsumer to handle diagnostic for system code. + if (isInUserCode(ci , Info.getLocation(), hsd)) { + // Parent class implementation for handling diagnostic + clang::TextDiagnosticPrinter::HandleDiagnostic(DiagLevel, Info); + + // Flag it if an error is from user code + if (DiagLevel == clang::DiagnosticsEngine::Level::Fatal || DiagLevel == clang::DiagnosticsEngine::Level::Error) { + error_in_user_code = true; + } + } else { + // Base class implementation for handling diagnostic + clang::DiagnosticConsumer::HandleDiagnostic(DiagLevel, Info); + } +} diff --git a/trick_source/codegen/Interface_Code_Gen/ICGDiagnosticConsumer.hh b/trick_source/codegen/Interface_Code_Gen/ICGDiagnosticConsumer.hh new file mode 100644 index 00000000..92b7de70 --- /dev/null +++ b/trick_source/codegen/Interface_Code_Gen/ICGDiagnosticConsumer.hh @@ -0,0 +1,42 @@ +#ifndef ICG_DIAGNOSTICCONSUMER_HH +#define ICG_DIAGNOSTICCONSUMER_HH + +#include "llvm/Support/raw_ostream.h" +#include "clang/Basic/Diagnostic.h" +#include "clang/Frontend/CompilerInstance.h" +#include "clang/Frontend/TextDiagnosticPrinter.h" + + +class HeaderSearchDirs; + +/** + + This class is passed to the clang parser as a DiagnosticConsumer. + It will terminate the trick build if an error found is from user code. + + @date May 2024 + + */ + + +class ICGDiagnosticConsumer : public clang::TextDiagnosticPrinter { +public: + ICGDiagnosticConsumer(llvm::raw_ostream &os, clang::DiagnosticOptions *diags, clang::CompilerInstance &in_ci, HeaderSearchDirs &in_hsd); + ~ICGDiagnosticConsumer() override; + + void HandleDiagnostic(clang::DiagnosticsEngine::Level DiagLevel, + const clang::Diagnostic &Info) override; + + /** Flag for if any error found in user code. */ + bool error_in_user_code; + +protected: + /** The compiler instance. */ + clang::CompilerInstance &ci ; + + /** The header search directories. */ + HeaderSearchDirs &hsd ; + +}; + +#endif diff --git a/trick_source/codegen/Interface_Code_Gen/main.cpp b/trick_source/codegen/Interface_Code_Gen/main.cpp index b2c4df79..84380329 100644 --- a/trick_source/codegen/Interface_Code_Gen/main.cpp +++ b/trick_source/codegen/Interface_Code_Gen/main.cpp @@ -25,6 +25,7 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Parse/ParseAST.h" +#include "ICGDiagnosticConsumer.hh" #include "ICGASTConsumer.hh" #include "HeaderSearchDirs.hh" #include "CommentSaver.hh" @@ -323,6 +324,8 @@ int main(int argc, char * argv[]) { #else ci.getSourceManager().createMainFileID(fileEntry); #endif + ICGDiagnosticConsumer *icgDiagConsumer = new ICGDiagnosticConsumer(llvm::errs(), &ci.getDiagnosticOpts(), ci, hsd); + ci.getDiagnostics().setClient(icgDiagConsumer); ci.getDiagnosticClient().BeginSourceFile(ci.getLangOpts(), &ci.getPreprocessor()); clang::ParseAST(ci.getSema()); ci.getDiagnosticClient().EndSourceFile(); @@ -337,5 +340,10 @@ int main(int argc, char * argv[]) { // Print the list of headers that have the ICG:(No) comment printAttributes.printICGNoFiles(); + if (icgDiagConsumer->error_in_user_code) { + std::cout << color(ERROR, "Trick build was terminated due to error in user code!") << std::endl; + exit(-1); + } + return 0; } From 92f1234deb6f153c1773b0dfeb051f2e23dbcddd Mon Sep 17 00:00:00 2001 From: "John M. Penn" Date: Thu, 16 May 2024 21:08:46 -0500 Subject: [PATCH 17/52] Fix review issues. --- docs/howto_guides/Realtime-Best-Practices.md | 158 ++++++++++++------- 1 file changed, 101 insertions(+), 57 deletions(-) diff --git a/docs/howto_guides/Realtime-Best-Practices.md b/docs/howto_guides/Realtime-Best-Practices.md index 1989eb76..b9432604 100644 --- a/docs/howto_guides/Realtime-Best-Practices.md +++ b/docs/howto_guides/Realtime-Best-Practices.md @@ -1,4 +1,4 @@ -# Trick Real-time Best Practices +# Trick Realtime Best Practices **Contents** @@ -10,87 +10,87 @@ --- ## Purpose -The intention of this document is to compile and share practical knowledge, based on the experience of people in the Trick simulation community regarding the development of real-time computer simulations. +The intention of this document is to compile and share practical knowledge, based on the experience of people in the Trick simulation community regarding the development of realtime computer simulations. ## Prerequisite Knowledge (Assuming you've completed the [Trick Tutorial] (https://nasa.github.io/trick/tutorial/Tutorial)) --- +--- - -### Simulation Time vs Real Time + +### Simulation Time vs Realtime -Real world dynamic systems change in real time (the time that you and I experience). A simulated dynamic system changes in simulation-time. Simulation time begins at t=0, and runs until we stop it. Simulation time can elapse faster or slower than real-time. +Real world dynamic systems change in realtime (the time that you and I experience). A simulated dynamic system changes in simulation time. Simulation time begins at t=0, and runs until we stop it. Simulation time can elapse faster or slower than realtime. -If we want to interact with a simulation as if it were real, we need to synchronize simulation time to real time. This requires that a simulation is capable of running at least as fast as real time. If it is incapable, then it can not be made to run in real time. +If we want to interact with a simulation as if it were real, we need to synchronize simulation time to realtime. This requires that a simulation is capable of running at least as fast as realtime. If it is incapable, then it can not be made to run in realtime. --- +--- - -### Real Time Clock -* By default, the Trick real-time scheduler will synchronize to the system clock: + +### Realtime Clock +* By default, the Trick realtime scheduler will synchronize to the system clock: * ```clock_gettime(CLOCK_REALTIME,…)``` [Linux] * ```gettimeofday()``` [Mac OS] -* The Trick real-time scheduler can also be configured to synchronize to a [custom real-time clock] (https://nasa.github.io/trick/documentation/simulation_capabilities/Realtime-Clock). +* The Trick realtime scheduler can also be configured to synchronize to a [custom realtime clock] (https://nasa.github.io/trick/documentation/simulation_capabilities/Realtime-Clock). --- +--- - -### Enabling Real-time + +### Enabling Realtime -Trick tries to consistently and repetitively execute its scheduled math models to completion within some predetermined real-time interval for an indefinite period. This real-time interval is called the **real-time software frame**. +Trick tries to consistently and repetitively execute its scheduled math models to completion within some predetermined realtime interval for an indefinite period. This realtime interval is called the **realtime software frame**. -To enable real-time synchronization, call ```trick.real_time_enable()``` in the input file. +To enable realtime synchronization, call ```trick.real_time_enable()``` in the input file. [Ref: Realtime](https://nasa.github.io/trick/documentation/simulation_capabilities/Realtime) --- +--- - -### Real-time Software Frame -The real-time software frame determines how often Trick will synchronize simulation time to the real time clock. Simulation time will run as fast as it can in the intervals between real time synchronizations. + +### Realtime Software Frame +The realtime software frame determines how often Trick will synchronize simulation time to the realtime clock. Simulation time will run as fast as it can in the intervals between realtime synchronizations. -To set the real time software frame, call the following in the input file: +To set the realtime software frame, call the following in the input file: ```python trick.exec_set_software_frame(double time) ``` [Ref: Software Frame](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler#software-frame) --- +--- ### Under-runs and Over-runs -An **under-run** occurs when the Trick executive finishes running all of its scheduled jobs, between synchronizations to the real time clock. This is a **good thing**. In this case the executive will enter a spin loop, waiting for the next real-time frame to start. +An **under-run** occurs when the Trick executive finishes running all of its scheduled jobs, between synchronizations to the realtime clock. This is a **good thing**. In this case the executive will enter a spin loop, waiting for the next realtime frame to start. - -![Real time Under Run](images/RealtimeUnderRun.png) + +![Realtime Under Run](images/RealtimeUnderRun.png) An **over-run** occurs if the executive does not finish running all of its scheduled jobs. This is a **bad-thing**. In this case, the executive will immediately start the next frame in an attempt to catch up. - -![Real time Over Run](images/RealtimeOverRun.png) + +![Realtime Over Run](images/RealtimeOverRun.png) --- +--- ### Itimers ( Being Nice to Other Processes On Your System ) -During real time under runs you may want to release the processor for other tasks to use instead of spinning waiting for the clock. Trick provides a real-time sleep timer based on itimers. You might think of it as a “snooze button”. +During real time under runs you may want to release the processor for other tasks to use instead of spinning waiting for the clock. Trick provides a realtime sleep timer based on itimers. You might think of it as a “snooze button”. To enable itimers call ```trick.itimer_enable()``` from the input file. -With itimer_enabled, the simulation will sleep() after completing the jobs scheduled for the current frame. The itimer will then wake the sim 2ms before the real-time frame is to expire. The executive will spin for the final 2ms. The 2ms spin is there because an itimer interval is not guaranteed to be perfectly precise. +With itimer_enabled, the simulation will sleep() after completing the jobs scheduled for the current frame. The itimer will then wake the sim 2ms before the realtime frame is to expire. The executive will spin for the final 2ms. The 2ms spin is there because an itimer interval is not guaranteed to be perfectly precise. - -![Real time with itimer](images/RealtimeWithItimer.png) + +![Realtime with itimer](images/RealtimeWithItimer.png) [Ref: Itimer](https://nasa.github.io/trick/documentation/simulation_capabilities/Realtime-Timer) --- +--- ### Frame-Logging ( Critical For Improving Sim Performance ) @@ -112,6 +112,8 @@ Frame logging records the following data files in your sim’s RUN_ directory: * [```log_frame.trk```](#log-frame-trk)
* [```log_frame_trickjobs.trk```](#log-frame-trickjobs-trk) * [```log_frame_frame_userjobs_main.trk```](#log-frame-userjobs-main-trk) +* [```log_timeline.csv```](#log-timeline-csv) +* [```log_timeline_init.csv```](#log-timeline-csv) Note that **main** in this file name refers to the main thread. If child threads (for example: C1, C2, ...) have been specified in the sim then frame log files for those threads will also be created ( that is:```log_trick_frame_userjobs_C1.trk```, ```log_trick_frame_userjobs_C2.trk```, ```...```). @@ -125,8 +127,8 @@ If child threads (for example: C1, C2, ...) have been specified in the sim then |# | Name | Type | Units | Description | |--:|:---- |:-----|:-----:|-------------| | 1| ```sys.exec.out.time``` | double | seconds |Simulation Time | -| 2| ```trick_real_time.rt_sync.frame_time``` | double | seconds | This badly named parameter expresses the amount of time that the scheduled jobs in this frame took to execute. See: [figure](#figure-Real-time-under``-run)| -|3| ```trick_real_time.rt_sync.frame_overrun ``` | double | seconds | The magnitude of the current overrun. See: [figure](#figure-Real-time-over-run) | +| 2| ```trick_real_time.rt_sync.frame_time``` | double | seconds | This badly named parameter expresses the amount of time that the scheduled jobs in this frame took to execute. See: [figure](#figure-realtime-under``-run)| +|3| ```trick_real_time.rt_sync.frame_overrun ``` | double | seconds | The magnitude of the current overrun. See: [figure](#figure-realtime-over-run) | |4| ```JOB_data_record_group_frame_userjobs.data_record...``` | double | s | How long the write job for the user Jobs data recording group took. | |5| ```JOB_data_record_group.trickjobs...``` | double | seconds | How long did the write job for the Trick Jobs data recording group take. | @@ -152,6 +154,48 @@ If child threads (for example: C1, C2, ...) have been specified in the sim then | 1| ```sys.exec.out.time``` | double | seconds |Simulation Time | | n| *trick-job-name* | double | seconds |How long the trick-job took to execute. | + +#### ```log_timeline.csv``` & ```log_timeline_init.csv``` +These files contain start and stop times for each of the jobs executed in a trick sim. +```log_timeline.csv``` contains times for jobs run during run-time. ```log_timeline_init.csv``` contains times for jobs run at initialization time. + +Frankly this format is **weird**, but it contains useful information. +It's weird because of its redundancy, and that each job timing "record" consists of four CSV lines. + +Both files have the same format. They contain three columns, of ```float``` formatted numbers representing (in order, left to right): + +1. time-stamp +2. trick job ID +3. user job ID + +Each record consists of four rows in the CSV file representing the start and stop times of a job. + +|row#|time-stamp|trick-job-id|user-job-id| +|---:|---:|---:|---:| +|4xRecord#+0|start-job-time|0|0| +|4xRecord#+1|start-job-time|trick job id|user-job-id| +|4xRecord#+2|stop-job-time|trick-job-id|user-job-id| +|4xRecord#+3|stop-job-time|0|0| + +If **trick** job ID is non-zero, then the **user** job ID will be zero, and vice versa. +Within any four line record the job-ID will be recorded twice. + +#####Example + +The following is one four-line record from a ```log_timeline.csv``` file. + +``` +... +0.000026,0,0 +0.000026,16.010000,0 +0.000027,16.010000,0 +0.000027,0,0 +... +``` +The first line of the record indicates that **some** job started at time=0.000026 seconds. It's not until the second line of the record that you find that the start time (0.000026) refers to the job with ID=16.01. The third line in the record indicates that the job with ID=16.01 stopped at 0.000027. The fourth line redundantly conveys that **some** job stopped at 0.000027. (I told you it was weird.) + +To match the job ID's with the job names, see the ```S_job_execution``` file. + ### Analyzing the Frame Log Files There are several ways we can examine/ analyze the data logged in these files. @@ -167,9 +211,9 @@ When you build your Trick sim, the following data-product files are created for #### [koviz](https://github.com/nasa/koviz) **koviz** Is an open-source project for plotting Trick data-recording files. It's particularly good for Monte Carlo data plotting. It also has a nifty feature for processing frame-log files. Not only can it plot them, but ```% koviz -rt RUN_directory``` will generate a report that will list the top 10 spikes in your frame log. -**TIP:**`` ```trick_real_time.rt_sync.rt_monitor``` (the Trick real-time monitor) should show the max job time. If not, you might have problems to solve. +**TIP:**`` ```trick_real_time.rt_sync.rt_monitor``` (the Trick realtime monitor) should show the max job time. If not, you might have problems to solve. --- +--- ### Other Useful Files Generated by a Trick Sim Run @@ -179,11 +223,11 @@ When you build your Trick sim, the following data-product files are created for |```RUN_*/S_run_summary ```|(Should be called build_summary) - Documents the name and path of the executable and the input file, the build time of the simulation executable, and the Trick version. It also contains the list of environment variables used when the simulation was built and the model versions.| |```RUN_*/send_hs ```|the end of this file contains run statistics that may be useful.| --- +--- ### Trick Executive Scheduler -The +The [Executive Scheduler](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler) determines how, when, and where (which CPU) the jobs in your Trick sim are executed. @@ -206,13 +250,13 @@ Ref: [RedHat: Isolating CPUs Using tuned-profiles-realtime](https://access.redha #### 1.1 Trick events are computationally expensive. Use them judiciously. -Trick events can provide a quick, easy, way to customize the behavior of a sim, based on some condition. But, because they require Python interpretation, they are slow. They are not intended for implementation of permanent sim functionality. If they are over used, they can seriously degrade simulation performance. So, take it easy with the events. +Trick events can provide a quick and easy way to customize the behavior of a sim, based on some condition. But, because they require Python interpretation, they are slow. They are not intended for implementation of permanent sim functionality. If they are over used, they can seriously degrade simulation performance. So, take it easy with the events. See [Event Manager] (https://nasa.github.io/trick/documentation/simulation_capabilities/Event-Manager). #### 1.2 Disable Trick run-time components that your sim doesn't need. -```default_trick_sys.sm```, the file included at the top of any Trick ```S_define``` file defines numerous "modules" that provide functionality to a Trick sim. Whereas some of these modules ( like the Executive, MemoryManager, CommandLineArguments) are required for any Trick Simulation to function, many are optional. If the modules are not needed, then disabling them can improve simulation perfromance. +```default_trick_sys.sm```, the file included at the top of any Trick ```S_define``` file defines numerous "modules" that provide functionality to a Trick sim. Whereas some of these modules ( like the Executive, MemoryManager, CommandLineArguments) are required for any Trick Simulation to function, many are optional. If the modules are not needed, then disabling them can improve simulation performance. Inserting one or more of the ```#define``` statements listed below to the top of the ```S_define```, just before the inclusion of ```default_trick_sys.sm``` will disable those modules. @@ -258,13 +302,13 @@ LIBRARY DEPENDENCIES: class SubmarineSimObject : public Trick::SimObject { public: - + ... ``` #### 1.3 Consider running Trick variable server clients and Sims on different machines. Trick variable server clients communicate with a simulation via a TCP/IP connection. -The client process may, but isn't required to run on the same machine as your simulation process. On the same machine, both will competing for the same resources. This can degrade sim performance, especially when clients are rendering high-definition graphics. +The client process may, but isn't required to, run on the same machine as your simulation process. On the same machine, both will competing for the same resources. This can degrade sim performance, especially when clients are rendering high-definition graphics. #### 1.4 Compile Trick and Trick sims with optimizations turned on @@ -277,7 +321,7 @@ TRICK_CFLAGS += -Imodels -O2 TRICK_CXXFLAGS += -Imodels -O2 ``` -See: +See: * [GCC Optimization Options](https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html) * [Clang Optimization Options](https://clang.llvm.org/docs/CommandGuide/clang.html#code-generation-options) @@ -312,7 +356,7 @@ Suppose ```SIM_submarine```'s S_define file contains the job ```submarine.diagno SubmarineSimObject dyn; ... ``` -This job only transmits information. It doesn't effect the simulation, but does degrade real-time performance slightly. To disable it, we'll add the following to our input file: +This job only transmits information. It doesn't affect the simulation, but does degrade realtime performance slightly. To disable it, we'll add the following to our input file: ```trick.exec_get_job("dyn.submarine.diagnostics", 0).disable()``` @@ -355,11 +399,11 @@ Disk access is slow. If you need to read from disk, do it in a ```default_data`` #### 2.2 Try to reduce variation in job cycle times. Realtime performance is largely about minimizing the worst case, rather than the average case. -The most well behaved job takes the same time, every time. +The most well behaved job takes the same amount of time, every time. #### 2.3 Minimize dynamic memory allocation during run-time -The time to dynamically allocate memory can vary, and in the worst-case is unbounded. This is bad for real-time performance. +The time to dynamically allocate memory can vary, and in the worst-case is unbounded. This is bad for realtime performance. #### 2.4 Allow the compiler to help you find problems @@ -388,14 +432,14 @@ Getting the best performance from a simulation on a multi-CPU machine requires u ##### Uniform Memory Access (UMA) Uniform memory access (UMA) is a multi-processor model in which all processors share the physical memory uniformly. All memory accesses have the same latency. -![Real time with itimer](images/UMA_Arch.png) +![Realtime with itimer](images/UMA_Arch.png) -In an UMA architecture, as the number of CPUs increases, the higher tha chance that the system bus will become a bottle-neck. +In an UMA architecture, as the number of CPUs increases, the higher the chance that the system bus will become a bottle-neck. ##### Non Uniform Memory Access (NUMA) Non-Uniform Memory Access (NUMA) is a multiprocessor model in which each processor is connected to dedicated memory but may access memory attached to other processors in the system. A NUMA architecture is one in which accesses to different addresses may have different latencies depending on where the data is stored. NUMA essentially connects UMA elements via a data-transfer interconnect. For best performance, applications should be “NUMA aware”. -![Real time with itimer](images/NUMA_Arch.png) +![Realtime with itimer](images/NUMA_Arch.png) On a Linux system the following will display the available nodes, CPUs, memory, and a normalized measure of access latency between nodes. @@ -434,7 +478,7 @@ This computer has two NUMA nodes, each with 24 CPUs, and each with about 16 giga Energy efficiency and performance are usually trade-offs. Turn off any energy-efficiency settings the computer may have enabled, usually in the BIOS. -#### 3.3 Fewer, Faster Cores Are Preferable to More, Slower Cores +#### 3.3 Fewer, Faster Cores Are Preferable to More, Slower Cores For simulation hosts, fewer but faster cores is usually preferable to more but slower cores * **Server-class** machines are designed for throughput. @@ -442,11 +486,11 @@ For simulation hosts, fewer but faster cores is usually preferable to more but s #### 3.4 Buy More Memory -Insufficient random access memory (RAM) leads to virtual memory page swapping, which degrades real-time performance. More RAM is one of the easiest and cheapest ways of boosting machine performance. +Insufficient random access memory (RAM) leads to virtual memory page swapping, which degrades realtime performance. More RAM is one of the easiest and cheapest ways of boosting machine performance. #### 3.5 Avoid Intel “Efficiency” Cores -Intel "efficiency" cores aren’t currently recognized by most Linux OS’s and will cause a lot of problems. They are more energy efficient, but slower, the opposite of what hard real-time needs. RHEL8 is unable to determine which cores are “E” (Efficiency) and which are “P” (Performance). Buy more memory. Do it! +Intel "efficiency" cores aren’t currently recognized by most Linux OS’s and will cause a lot of problems. They are more energy efficient, but slower, the opposite of what hard realtime needs. RHEL8 is unable to determine which cores are “E” (Efficiency) and which are “P” (Performance). Buy more memory. Do it! --- ### 4. Network @@ -457,7 +501,7 @@ Isolate all sim-to-sim traffic to one network interface. Leave the other for con #### 4.2 Use One Master Clock For All Machines On The Network -All clocks will drift apart unless periodically synchronized. Synchronization means that one of the clocks must be the reference, or "master". Multiple unsynchronized clocks in a real-time system is nightmare fuel. +All clocks will drift apart unless periodically synchronized. Synchronization means that one of the clocks must be the reference, or "master". Multiple unsynchronized clocks in a realtime system is nightmare fuel. --- ### 5. Miscellaneous @@ -465,7 +509,7 @@ All clocks will drift apart unless periodically synchronized. Synchronization me #### 5.1 Maintain a history of simulation performance. -Maintain a performance history of your sim as development procedes. This can be very useful evidence in solving problems. Begin frame logging the sim even before implementing real-time. +Maintain a performance history of your sim as development procedes. This can be very useful evidence in solving problems. Begin frame logging the sim even before implementing realtime. #### 5.2 Take care when "tuning" operating system behavior @@ -494,4 +538,4 @@ Use ```sudo``` command to give root privileges to the simulation executable usin ``` chown root S_main_${TRICK_HOST_CPU}.exe chmod 4775 S_main_${TRICK_HOST_CPU}.exe -``` \ No newline at end of file +``` From 5b994e687dd85d0278a5b6bad1e51c8cfd7f36a7 Mon Sep 17 00:00:00 2001 From: "John M. Penn" Date: Thu, 16 May 2024 21:17:25 -0500 Subject: [PATCH 18/52] Fixed link to figure. --- docs/howto_guides/Realtime-Best-Practices.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/howto_guides/Realtime-Best-Practices.md b/docs/howto_guides/Realtime-Best-Practices.md index b9432604..cfeff691 100644 --- a/docs/howto_guides/Realtime-Best-Practices.md +++ b/docs/howto_guides/Realtime-Best-Practices.md @@ -127,7 +127,7 @@ If child threads (for example: C1, C2, ...) have been specified in the sim then |# | Name | Type | Units | Description | |--:|:---- |:-----|:-----:|-------------| | 1| ```sys.exec.out.time``` | double | seconds |Simulation Time | -| 2| ```trick_real_time.rt_sync.frame_time``` | double | seconds | This badly named parameter expresses the amount of time that the scheduled jobs in this frame took to execute. See: [figure](#figure-realtime-under``-run)| +| 2| ```trick_real_time.rt_sync.frame_time``` | double | seconds | This badly named parameter expresses the amount of time that the scheduled jobs in this frame took to execute. See: [figure](#figure-realtime-under-run)| |3| ```trick_real_time.rt_sync.frame_overrun ``` | double | seconds | The magnitude of the current overrun. See: [figure](#figure-realtime-over-run) | |4| ```JOB_data_record_group_frame_userjobs.data_record...``` | double | s | How long the write job for the user Jobs data recording group took. | |5| ```JOB_data_record_group.trickjobs...``` | double | seconds | How long did the write job for the Trick Jobs data recording group take. | From 95f357a937fe81719fa9f6d82e7cf5614a3c31aa Mon Sep 17 00:00:00 2001 From: jmpenn Date: Mon, 20 May 2024 10:57:58 -0500 Subject: [PATCH 19/52] Update How-To-Guides.md Fix Link: Change .../RealTime-Best-Practices.md" to Realtime-Best-Practices.md" --- docs/howto_guides/How-To-Guides.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/howto_guides/How-To-Guides.md b/docs/howto_guides/How-To-Guides.md index d82b22ea..1df9210d 100644 --- a/docs/howto_guides/How-To-Guides.md +++ b/docs/howto_guides/How-To-Guides.md @@ -11,4 +11,4 @@ 01. [How to Containerize Trick with Docker](How-To-Containerize-Trick-with-Docker) 01. [How to Setup a Virtual Python Environment](How-To-Python-Virtual-Environment) 01. [Checkpointing Best Practices](Checkpointing-Best-Practices) -01. [Realtime Best Practices](RealTime-Best-Practices) +01. [Realtime Best Practices](Realtime-Best-Practices) From 474440876297ce6d5f433e15e6cd6a0bd6dd9821 Mon Sep 17 00:00:00 2001 From: jmpenn Date: Mon, 20 May 2024 11:06:59 -0500 Subject: [PATCH 20/52] Update Realtime-Best-Practices.md Fix example heading format: Added space between ##### and title --- docs/howto_guides/Realtime-Best-Practices.md | 920 +++++++++---------- 1 file changed, 460 insertions(+), 460 deletions(-) diff --git a/docs/howto_guides/Realtime-Best-Practices.md b/docs/howto_guides/Realtime-Best-Practices.md index cfeff691..097e0ed1 100644 --- a/docs/howto_guides/Realtime-Best-Practices.md +++ b/docs/howto_guides/Realtime-Best-Practices.md @@ -1,266 +1,266 @@ -# Trick Realtime Best Practices - -**Contents** - -* [Purpose](#Purpose)
-* [Prerequisite Knowledge](#prerequisite-knowledge)
-* [Do's, Don'ts and Wisdom](#guidelines)
- - - ---- -## Purpose -The intention of this document is to compile and share practical knowledge, based on the experience of people in the Trick simulation community regarding the development of realtime computer simulations. - - -## Prerequisite Knowledge -(Assuming you've completed the [Trick Tutorial] (https://nasa.github.io/trick/tutorial/Tutorial)) - ---- - - -### Simulation Time vs Realtime - +# Trick Realtime Best Practices + +**Contents** + +* [Purpose](#Purpose)
+* [Prerequisite Knowledge](#prerequisite-knowledge)
+* [Do's, Don'ts and Wisdom](#guidelines)
+ + + +--- +## Purpose +The intention of this document is to compile and share practical knowledge, based on the experience of people in the Trick simulation community regarding the development of realtime computer simulations. + + +## Prerequisite Knowledge +(Assuming you've completed the [Trick Tutorial] (https://nasa.github.io/trick/tutorial/Tutorial)) + +--- + + +### Simulation Time vs Realtime + Real world dynamic systems change in realtime (the time that you and I experience). A simulated dynamic system changes in simulation time. Simulation time begins at t=0, and runs until we stop it. Simulation time can elapse faster or slower than realtime. - + If we want to interact with a simulation as if it were real, we need to synchronize simulation time to realtime. This requires that a simulation is capable of running at least as fast as realtime. If it is incapable, then it can not be made to run in realtime. - ---- - - + +--- + + ### Realtime Clock * By default, the Trick realtime scheduler will synchronize to the system clock: - * ```clock_gettime(CLOCK_REALTIME,…)``` [Linux] + * ```clock_gettime(CLOCK_REALTIME,…)``` [Linux] * ```gettimeofday()``` [Mac OS] -* The Trick realtime scheduler can also be configured to synchronize to a [custom realtime clock] (https://nasa.github.io/trick/documentation/simulation_capabilities/Realtime-Clock). - ---- - - +* The Trick realtime scheduler can also be configured to synchronize to a [custom realtime clock] (https://nasa.github.io/trick/documentation/simulation_capabilities/Realtime-Clock). + +--- + + ### Enabling Realtime - + Trick tries to consistently and repetitively execute its scheduled math models to completion within some predetermined realtime interval for an indefinite period. This realtime interval is called the **realtime software frame**. -To enable realtime synchronization, call ```trick.real_time_enable()``` in the input file. - -[Ref: Realtime](https://nasa.github.io/trick/documentation/simulation_capabilities/Realtime) - ---- - - -### Realtime Software Frame +To enable realtime synchronization, call ```trick.real_time_enable()``` in the input file. + +[Ref: Realtime](https://nasa.github.io/trick/documentation/simulation_capabilities/Realtime) + +--- + + +### Realtime Software Frame The realtime software frame determines how often Trick will synchronize simulation time to the realtime clock. Simulation time will run as fast as it can in the intervals between realtime synchronizations. To set the realtime software frame, call the following in the input file: - -```python -trick.exec_set_software_frame(double time) -``` -[Ref: Software Frame](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler#software-frame) - ---- - -### Under-runs and Over-runs +```python +trick.exec_set_software_frame(double time) +``` +[Ref: Software Frame](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler#software-frame) + +--- + + +### Under-runs and Over-runs An **under-run** occurs when the Trick executive finishes running all of its scheduled jobs, between synchronizations to the realtime clock. This is a **good thing**. In this case the executive will enter a spin loop, waiting for the next realtime frame to start. - - -![Realtime Under Run](images/RealtimeUnderRun.png) + + +![Realtime Under Run](images/RealtimeUnderRun.png) An **over-run** occurs if the executive does not finish running all of its scheduled jobs. This is a **bad-thing**. In this case, the executive will immediately start the next frame in an attempt to catch up. - - -![Realtime Over Run](images/RealtimeOverRun.png) - ---- - - -### Itimers ( Being Nice to Other Processes On Your System ) - -During real time under runs you may want to release the processor for other tasks to use instead of spinning waiting for the clock. Trick provides a realtime sleep timer based on itimers. You might think of it as a “snooze button”. -To enable itimers call ```trick.itimer_enable()``` from the input file. - + +![Realtime Over Run](images/RealtimeOverRun.png) + +--- + + +### Itimers ( Being Nice to Other Processes On Your System ) + +During real time under runs you may want to release the processor for other tasks to use instead of spinning waiting for the clock. Trick provides a realtime sleep timer based on itimers. You might think of it as a “snooze button”. + +To enable itimers call ```trick.itimer_enable()``` from the input file. + With itimer_enabled, the simulation will sleep() after completing the jobs scheduled for the current frame. The itimer will then wake the sim 2ms before the realtime frame is to expire. The executive will spin for the final 2ms. The 2ms spin is there because an itimer interval is not guaranteed to be perfectly precise. - - -![Realtime with itimer](images/RealtimeWithItimer.png) - -[Ref: Itimer](https://nasa.github.io/trick/documentation/simulation_capabilities/Realtime-Timer) - ---- - - -### Frame-Logging ( Critical For Improving Sim Performance ) - -The failure of a simulation to meet its scheduling requirements can have many causes. To aid in solving these problems, Trick can gather simulation performance data, called **frame-logging** by calling: - -```trick.frame_log_on()``` - -in your sim's input file. - -Note that frame logging will add some overhead to a simulation as each job is timed and recorded. - -[Ref: Frame-Logging](https://nasa.github.io/trick/documentation/simulation_capabilities/Frame-Logging) - - -#### Frame Log Files -Frame logging records the following data files in your sim’s RUN_ directory: - -* [```log_frame.trk```](#log-frame-trk)
-* [```log_frame_trickjobs.trk```](#log-frame-trickjobs-trk) -* [```log_frame_frame_userjobs_main.trk```](#log-frame-userjobs-main-trk) -* [```log_timeline.csv```](#log-timeline-csv) -* [```log_timeline_init.csv```](#log-timeline-csv) - -Note that **main** in this file name refers to the main thread. -If child threads (for example: C1, C2, ...) have been specified in the sim then frame log files for those threads will also be created ( that is:```log_trick_frame_userjobs_C1.trk```, ```log_trick_frame_userjobs_C2.trk```, ```...```). - ---- - - -#### ```log_frame.trk``` -* Number of fields per record : 5 - -|# | Name | Type | Units | Description | -|--:|:---- |:-----|:-----:|-------------| -| 1| ```sys.exec.out.time``` | double | seconds |Simulation Time | -| 2| ```trick_real_time.rt_sync.frame_time``` | double | seconds | This badly named parameter expresses the amount of time that the scheduled jobs in this frame took to execute. See: [figure](#figure-realtime-under-run)| -|3| ```trick_real_time.rt_sync.frame_overrun ``` | double | seconds | The magnitude of the current overrun. See: [figure](#figure-realtime-over-run) | -|4| ```JOB_data_record_group_frame_userjobs.data_record...``` | double | s | How long the write job for the user Jobs data recording group took. | -|5| ```JOB_data_record_group.trickjobs...``` | double | seconds | How long did the write job for the Trick Jobs data recording group take. | - ---- - - -#### ```log_frame_userjobs_main.trk``` -* Number of fields per record : 1 + *#user-jobs* - -|# | Name | Type | Units | Description | -|--:|:---- |:-----|:-----:|-------------| -| 1| ```sys.exec.out.time``` | double | seconds |Simulation Time | -| n| *user-job-name* | double | seconds |How long the user-job took to execute. | - ---- - - -#### ```log_frame_trickjobs.trk``` -* Number of fields per record : 1 + *#trick-jobs* - -|# | Name | Type | Units | Description | -|--:|:---- |:-----|:-----:|-------------| -| 1| ```sys.exec.out.time``` | double | seconds |Simulation Time | -| n| *trick-job-name* | double | seconds |How long the trick-job took to execute. | - - -#### ```log_timeline.csv``` & ```log_timeline_init.csv``` -These files contain start and stop times for each of the jobs executed in a trick sim. -```log_timeline.csv``` contains times for jobs run during run-time. ```log_timeline_init.csv``` contains times for jobs run at initialization time. - -Frankly this format is **weird**, but it contains useful information. -It's weird because of its redundancy, and that each job timing "record" consists of four CSV lines. - -Both files have the same format. They contain three columns, of ```float``` formatted numbers representing (in order, left to right): - -1. time-stamp -2. trick job ID -3. user job ID - -Each record consists of four rows in the CSV file representing the start and stop times of a job. - -|row#|time-stamp|trick-job-id|user-job-id| -|---:|---:|---:|---:| -|4xRecord#+0|start-job-time|0|0| -|4xRecord#+1|start-job-time|trick job id|user-job-id| -|4xRecord#+2|stop-job-time|trick-job-id|user-job-id| -|4xRecord#+3|stop-job-time|0|0| - -If **trick** job ID is non-zero, then the **user** job ID will be zero, and vice versa. -Within any four line record the job-ID will be recorded twice. - -#####Example - -The following is one four-line record from a ```log_timeline.csv``` file. - -``` -... -0.000026,0,0 -0.000026,16.010000,0 -0.000027,16.010000,0 -0.000027,0,0 -... -``` -The first line of the record indicates that **some** job started at time=0.000026 seconds. It's not until the second line of the record that you find that the start time (0.000026) refers to the job with ID=16.01. The third line in the record indicates that the job with ID=16.01 stopped at 0.000027. The fourth line redundantly conveys that **some** job stopped at 0.000027. (I told you it was weird.) - -To match the job ID's with the job names, see the ```S_job_execution``` file. - -### Analyzing the Frame Log Files -There are several ways we can examine/ analyze the data logged in these files. - -#### [trick-DP](https://nasa.github.io/trick/tutorial/ATutPlottingData) -When you build your Trick sim, the following data-product files are created for you to plot your sim's frame log data. - -* ```DP_rt_frame.xml``` -* ```DP_rt_timeline.xml``` -* ```DP_rt_timeline_init.xml``` -* ```DP_rt_trickjobs.xml``` -* ```DP_rt_userjobs.xml``` -#### [koviz](https://github.com/nasa/koviz) -**koviz** Is an open-source project for plotting Trick data-recording files. It's particularly good for Monte Carlo data plotting. It also has a nifty feature for processing frame-log files. Not only can it plot them, but ```% koviz -rt RUN_directory``` will generate a report that will list the top 10 spikes in your frame log. - -**TIP:**`` ```trick_real_time.rt_sync.rt_monitor``` (the Trick realtime monitor) should show the max job time. If not, you might have problems to solve. - ---- - -### Other Useful Files Generated by a Trick Sim Run - -| Name | Desscription| -|:-----|:------------| + +![Realtime with itimer](images/RealtimeWithItimer.png) + +[Ref: Itimer](https://nasa.github.io/trick/documentation/simulation_capabilities/Realtime-Timer) + +--- + + +### Frame-Logging ( Critical For Improving Sim Performance ) + +The failure of a simulation to meet its scheduling requirements can have many causes. To aid in solving these problems, Trick can gather simulation performance data, called **frame-logging** by calling: + +```trick.frame_log_on()``` + +in your sim's input file. + +Note that frame logging will add some overhead to a simulation as each job is timed and recorded. + +[Ref: Frame-Logging](https://nasa.github.io/trick/documentation/simulation_capabilities/Frame-Logging) + + +#### Frame Log Files +Frame logging records the following data files in your sim’s RUN_ directory: + +* [```log_frame.trk```](#log-frame-trk)
+* [```log_frame_trickjobs.trk```](#log-frame-trickjobs-trk) +* [```log_frame_frame_userjobs_main.trk```](#log-frame-userjobs-main-trk) +* [```log_timeline.csv```](#log-timeline-csv) +* [```log_timeline_init.csv```](#log-timeline-csv) + +Note that **main** in this file name refers to the main thread. +If child threads (for example: C1, C2, ...) have been specified in the sim then frame log files for those threads will also be created ( that is:```log_trick_frame_userjobs_C1.trk```, ```log_trick_frame_userjobs_C2.trk```, ```...```). + +--- + + +#### ```log_frame.trk``` +* Number of fields per record : 5 + +|# | Name | Type | Units | Description | +|--:|:---- |:-----|:-----:|-------------| +| 1| ```sys.exec.out.time``` | double | seconds |Simulation Time | +| 2| ```trick_real_time.rt_sync.frame_time``` | double | seconds | This badly named parameter expresses the amount of time that the scheduled jobs in this frame took to execute. See: [figure](#figure-realtime-under-run)| +|3| ```trick_real_time.rt_sync.frame_overrun ``` | double | seconds | The magnitude of the current overrun. See: [figure](#figure-realtime-over-run) | +|4| ```JOB_data_record_group_frame_userjobs.data_record...``` | double | s | How long the write job for the user Jobs data recording group took. | +|5| ```JOB_data_record_group.trickjobs...``` | double | seconds | How long did the write job for the Trick Jobs data recording group take. | + +--- + + +#### ```log_frame_userjobs_main.trk``` +* Number of fields per record : 1 + *#user-jobs* + +|# | Name | Type | Units | Description | +|--:|:---- |:-----|:-----:|-------------| +| 1| ```sys.exec.out.time``` | double | seconds |Simulation Time | +| n| *user-job-name* | double | seconds |How long the user-job took to execute. | + +--- + + +#### ```log_frame_trickjobs.trk``` +* Number of fields per record : 1 + *#trick-jobs* + +|# | Name | Type | Units | Description | +|--:|:---- |:-----|:-----:|-------------| +| 1| ```sys.exec.out.time``` | double | seconds |Simulation Time | +| n| *trick-job-name* | double | seconds |How long the trick-job took to execute. | + + +#### ```log_timeline.csv``` & ```log_timeline_init.csv``` +These files contain start and stop times for each of the jobs executed in a trick sim. +```log_timeline.csv``` contains times for jobs run during run-time. ```log_timeline_init.csv``` contains times for jobs run at initialization time. + +Frankly this format is **weird**, but it contains useful information. +It's weird because of its redundancy, and that each job timing "record" consists of four CSV lines. + +Both files have the same format. They contain three columns, of ```float``` formatted numbers representing (in order, left to right): + +1. time-stamp +2. trick job ID +3. user job ID + +Each record consists of four rows in the CSV file representing the start and stop times of a job. + +|row#|time-stamp|trick-job-id|user-job-id| +|---:|---:|---:|---:| +|4xRecord#+0|start-job-time|0|0| +|4xRecord#+1|start-job-time|trick job id|user-job-id| +|4xRecord#+2|stop-job-time|trick-job-id|user-job-id| +|4xRecord#+3|stop-job-time|0|0| + +If **trick** job ID is non-zero, then the **user** job ID will be zero, and vice versa. +Within any four line record the job-ID will be recorded twice. + +##### Example + +The following is one four-line record from a ```log_timeline.csv``` file. + +``` +... +0.000026,0,0 +0.000026,16.010000,0 +0.000027,16.010000,0 +0.000027,0,0 +... +``` +The first line of the record indicates that **some** job started at time=0.000026 seconds. It's not until the second line of the record that you find that the start time (0.000026) refers to the job with ID=16.01. The third line in the record indicates that the job with ID=16.01 stopped at 0.000027. The fourth line redundantly conveys that **some** job stopped at 0.000027. (I told you it was weird.) + +To match the job ID's with the job names, see the ```S_job_execution``` file. + +### Analyzing the Frame Log Files +There are several ways we can examine/ analyze the data logged in these files. + +#### [trick-DP](https://nasa.github.io/trick/tutorial/ATutPlottingData) +When you build your Trick sim, the following data-product files are created for you to plot your sim's frame log data. + +* ```DP_rt_frame.xml``` +* ```DP_rt_timeline.xml``` +* ```DP_rt_timeline_init.xml``` +* ```DP_rt_trickjobs.xml``` +* ```DP_rt_userjobs.xml``` + +#### [koviz](https://github.com/nasa/koviz) +**koviz** Is an open-source project for plotting Trick data-recording files. It's particularly good for Monte Carlo data plotting. It also has a nifty feature for processing frame-log files. Not only can it plot them, but ```% koviz -rt RUN_directory``` will generate a report that will list the top 10 spikes in your frame log. + +**TIP:**`` ```trick_real_time.rt_sync.rt_monitor``` (the Trick realtime monitor) should show the max job time. If not, you might have problems to solve. + +--- + +### Other Useful Files Generated by a Trick Sim Run + +| Name | Desscription| +|:-----|:------------| |```RUN_*/S_job_execution```| Lists the simulation jobs by Name, Job ID, Trick Thread ID (PID) Job class, Phase, Start time, Stop time, Cycle, and whether the job is enabled.| -|```RUN_*/S_run_summary ```|(Should be called build_summary) - Documents the name and path of the executable and the input file, the build time of the simulation executable, and the Trick version. It also contains the list of environment variables used when the simulation was built and the model versions.| +|```RUN_*/S_run_summary ```|(Should be called build_summary) - Documents the name and path of the executable and the input file, the build time of the simulation executable, and the Trick version. It also contains the list of environment variables used when the simulation was built and the model versions.| |```RUN_*/send_hs ```|the end of this file contains run statistics that may be useful.| - ---- - -### Trick Executive Scheduler - -The - [Executive Scheduler](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler) determines how, when, and where (which CPU) the jobs in your Trick sim are executed. - - -* [Job Control](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler#job-control) - describes the Trick job control interface. -* [Thread Control](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler#thread-control) - describes the attributes and behaviors of different Trick thread types. - -Thread control will in some cases require that you isolate CPUs at boot-time. This is usualy done with the **isolcpus** boot parameter: - -```isolcpus= cpu_number[, cpu_number,...]``` - -Ref: [RedHat: Isolating CPUs Using tuned-profiles-realtime](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_for_real_time/7/html/tuning_guide/isolating_cpus_using_tuned-profiles-realtime) - - - -## Do's, Don'ts, and Wisdom - ---- -### 1 Trick ---- - -#### 1.1 Trick events are computationally expensive. Use them judiciously. - + +--- + +### Trick Executive Scheduler + +The + [Executive Scheduler](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler) determines how, when, and where (which CPU) the jobs in your Trick sim are executed. + + +* [Job Control](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler#job-control) - describes the Trick job control interface. +* [Thread Control](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler#thread-control) - describes the attributes and behaviors of different Trick thread types. + +Thread control will in some cases require that you isolate CPUs at boot-time. This is usualy done with the **isolcpus** boot parameter: + +```isolcpus= cpu_number[, cpu_number,...]``` + +Ref: [RedHat: Isolating CPUs Using tuned-profiles-realtime](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_for_real_time/7/html/tuning_guide/isolating_cpus_using_tuned-profiles-realtime) + + + +## Do's, Don'ts, and Wisdom + +--- +### 1 Trick +--- + +#### 1.1 Trick events are computationally expensive. Use them judiciously. + Trick events can provide a quick and easy way to customize the behavior of a sim, based on some condition. But, because they require Python interpretation, they are slow. They are not intended for implementation of permanent sim functionality. If they are over used, they can seriously degrade simulation performance. So, take it easy with the events. - -See [Event Manager] (https://nasa.github.io/trick/documentation/simulation_capabilities/Event-Manager). - -#### 1.2 Disable Trick run-time components that your sim doesn't need. + +See [Event Manager] (https://nasa.github.io/trick/documentation/simulation_capabilities/Event-Manager). + +#### 1.2 Disable Trick run-time components that your sim doesn't need. ```default_trick_sys.sm```, the file included at the top of any Trick ```S_define``` file defines numerous "modules" that provide functionality to a Trick sim. Whereas some of these modules ( like the Executive, MemoryManager, CommandLineArguments) are required for any Trick Simulation to function, many are optional. If the modules are not needed, then disabling them can improve simulation performance. -Inserting one or more of the ```#define``` statements listed below to the top of the ```S_define```, just before the inclusion of ```default_trick_sys.sm``` will disable those modules. +Inserting one or more of the ```#define``` statements listed below to the top of the ```S_define```, just before the inclusion of ```default_trick_sys.sm``` will disable those modules. -``` +``` #define TRICK_NO_EXECUTIVE #define TRICK_NO_MONTE_CARLO #define TRICK_NO_MEMORY_MANAGER @@ -279,186 +279,186 @@ Inserting one or more of the ```#define``` statements listed below to the top of #define TRICK_NO_REALTIMEINJECTOR #define TRICK_NO_ZEROCONF #define TRICK_NO_UNITTEST -``` -##### Example -Using "SIM_submarine" as an example, the following demonstrates disabling unneeded ```default_trick_sys.sm``` modules. - -``` -/************************************************************ -PURPOSE: - ( Simulate a submarine. ) -LIBRARY DEPENDENCIES: - ((submarine/src/Submarine.cpp)) -*************************************************************/ -#define TRICK_NO_MONTE_CARLO -#define TRICK_NO_MASTERSLAVE -#define TRICK_NO_INSTRUMENTATION -#define TRICK_NO_REALTIMEINJECTOR -#define TRICK_NO_ZEROCONF -#define TRICK_NO_UNITTEST -#include "sim_objects/default_trick_sys.sm" - -##include "submarine/include/Submarine.hh" - -class SubmarineSimObject : public Trick::SimObject { - public: - - ... -``` - -#### 1.3 Consider running Trick variable server clients and Sims on different machines. -Trick variable server clients communicate with a simulation via a TCP/IP connection. -The client process may, but isn't required to, run on the same machine as your simulation process. On the same machine, both will competing for the same resources. This can degrade sim performance, especially when clients are rendering high-definition graphics. - - -#### 1.4 Compile Trick and Trick sims with optimizations turned on - -Example : -In my ```S_overrides.mk``` file, I'll add the "-O2" optimization flag. - -``` -TRICK_CFLAGS += -Imodels -O2 -TRICK_CXXFLAGS += -Imodels -O2 -``` - -See: - -* [GCC Optimization Options](https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html) -* [Clang Optimization Options](https://clang.llvm.org/docs/CommandGuide/clang.html#code-generation-options) - - -#### 1.5 Disable unused jobs in Trick sims - -Jobs can be enabled and disabled from the input file with the following commands: - -``` -trick.exec_get_job(, ).enable() -trick.exec_get_job(, ).disable() -``` - -Alternatively, we can use: - -``` -trick.exec_set_job_onoff(, , True|False) -``` - -If a job isn't necessary for a particular RUN scenario, consider disabling it. But, make sure that it doesn’t impact the rest of the sim. - -##### Example: - -Suppose ```SIM_submarine```'s S_define file contains the job ```submarine.diagnostics```: - -``` -... -(0.1, "scheduled") submarine.diagnostics(); -... -}; -SubmarineSimObject dyn; -... -``` -This job only transmits information. It doesn't affect the simulation, but does degrade realtime performance slightly. To disable it, we'll add the following to our input file: - -```trick.exec_get_job("dyn.submarine.diagnostics", 0).disable()``` - - -#### 1.6 Name the child threads in your Trick sim -Do this for easier identification of time spikes. +``` +##### Example +Using "SIM_submarine" as an example, the following demonstrates disabling unneeded ```default_trick_sys.sm``` modules. -```trick.exec_get_thread().set_name()``` - -##### Example: - -In ```SIM_lander's``` ```S_define```, suppose we specify that ```lander.control()``` job is to run in thread 1 (C1): - -``` C1 (0.1, "scheduled") lander.control() ;``` - -Then in the input file, we add: - -```trick.exec_get_thread(1).set_name("LanderControl")``` - -to name the C1 thread "LanderControl". - - -#### 1.7 Use ```default_data``` jobs to specify the default sim state. Customize it with the input file. - -Prefer ```default_data``` jobs as the **primary** means of initializing your sim. Then, **customize** the default for different scenarios, with an input file. Try to make your sim capable of initializing to a valid state with an empty input file. - -Doing this has several benefits. - -1. The sim will initialize faster because ```default_data``` jobs are compiled rather that interpreted. - -2. If you can test and confirm that your base, default, "empty input file" sim is initialized to a valid state, then it will be easier to identify errors when the sim is customized for different scenarios, via an input file. It saves time and reduces pain. - ---- -### 2. User Simulation Software ---- - -#### 2.1 Don't read from the disk during run-time. -Disk access is slow. If you need to read from disk, do it in a ```default_data```, or ```initialization``` job. - - -#### 2.2 Try to reduce variation in job cycle times. -Realtime performance is largely about minimizing the worst case, rather than the average case. -The most well behaved job takes the same amount of time, every time. - - -#### 2.3 Minimize dynamic memory allocation during run-time -The time to dynamically allocate memory can vary, and in the worst-case is unbounded. This is bad for realtime performance. - - -#### 2.4 Allow the compiler to help you find problems - -Modern compilers have gotten very helpful, and can check for a lot of potential problems. -Many people are familiar with the compiler warning options like ```-Wall```, ```-Wextra```, and ```-Wshadow```. Be aware that there are a lot more, to help you find problems: - -* [GCC Warning Options](https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html) -* [CLANG Warning Options](https://clang.llvm.org/docs/DiagnosticsReference.html) - - -#### 2.5 Fix All Compiler Warnings And Errors -Many a time the necessary clue needed to solve an intractable problem was there all along, in the form of an unheeded warning that scrolled by unseen. - -Don't ignore the messages. - -When Trick builds a sim, it generates the files, ```MAKE_out``` and ```MAKE_err``` in the ```build``` directory. These files contain the makefile output of the sim build. It's a good idea to check these for warnings on a big sim build. - ---- -### 3. Hardware ---- - -#### 3.1 Know Your Simulation Machine Architecture -Getting the best performance from a simulation on a multi-CPU machine requires understanding of the machine's hardware architecture. Particularly important is data transfer delay from memory to the CPU (latency). Depending on the machine architecture, and how data processing is allocated across CPUs, the time used for memory access, and therefore simulation performance can very significantly. - -##### Uniform Memory Access (UMA) +``` +/************************************************************ +PURPOSE: + ( Simulate a submarine. ) +LIBRARY DEPENDENCIES: + ((submarine/src/Submarine.cpp)) +*************************************************************/ +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF +#define TRICK_NO_UNITTEST +#include "sim_objects/default_trick_sys.sm" + +##include "submarine/include/Submarine.hh" + +class SubmarineSimObject : public Trick::SimObject { + public: + + ... +``` + +#### 1.3 Consider running Trick variable server clients and Sims on different machines. +Trick variable server clients communicate with a simulation via a TCP/IP connection. +The client process may, but isn't required to, run on the same machine as your simulation process. On the same machine, both will competing for the same resources. This can degrade sim performance, especially when clients are rendering high-definition graphics. + + +#### 1.4 Compile Trick and Trick sims with optimizations turned on + +Example : +In my ```S_overrides.mk``` file, I'll add the "-O2" optimization flag. + +``` +TRICK_CFLAGS += -Imodels -O2 +TRICK_CXXFLAGS += -Imodels -O2 +``` + +See: + +* [GCC Optimization Options](https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html) +* [Clang Optimization Options](https://clang.llvm.org/docs/CommandGuide/clang.html#code-generation-options) + + +#### 1.5 Disable unused jobs in Trick sims + +Jobs can be enabled and disabled from the input file with the following commands: + +``` +trick.exec_get_job(, ).enable() +trick.exec_get_job(, ).disable() +``` + +Alternatively, we can use: + +``` +trick.exec_set_job_onoff(, , True|False) +``` + +If a job isn't necessary for a particular RUN scenario, consider disabling it. But, make sure that it doesn’t impact the rest of the sim. + +##### Example: + +Suppose ```SIM_submarine```'s S_define file contains the job ```submarine.diagnostics```: + +``` +... +(0.1, "scheduled") submarine.diagnostics(); +... +}; +SubmarineSimObject dyn; +... +``` +This job only transmits information. It doesn't affect the simulation, but does degrade realtime performance slightly. To disable it, we'll add the following to our input file: + +```trick.exec_get_job("dyn.submarine.diagnostics", 0).disable()``` + + +#### 1.6 Name the child threads in your Trick sim +Do this for easier identification of time spikes. + +```trick.exec_get_thread().set_name()``` + +##### Example: + +In ```SIM_lander's``` ```S_define```, suppose we specify that ```lander.control()``` job is to run in thread 1 (C1): + +``` C1 (0.1, "scheduled") lander.control() ;``` + +Then in the input file, we add: + +```trick.exec_get_thread(1).set_name("LanderControl")``` + +to name the C1 thread "LanderControl". + + +#### 1.7 Use ```default_data``` jobs to specify the default sim state. Customize it with the input file. + +Prefer ```default_data``` jobs as the **primary** means of initializing your sim. Then, **customize** the default for different scenarios, with an input file. Try to make your sim capable of initializing to a valid state with an empty input file. + +Doing this has several benefits. + +1. The sim will initialize faster because ```default_data``` jobs are compiled rather that interpreted. + +2. If you can test and confirm that your base, default, "empty input file" sim is initialized to a valid state, then it will be easier to identify errors when the sim is customized for different scenarios, via an input file. It saves time and reduces pain. + +--- +### 2. User Simulation Software +--- + +#### 2.1 Don't read from the disk during run-time. +Disk access is slow. If you need to read from disk, do it in a ```default_data```, or ```initialization``` job. + + +#### 2.2 Try to reduce variation in job cycle times. +Realtime performance is largely about minimizing the worst case, rather than the average case. +The most well behaved job takes the same amount of time, every time. + + +#### 2.3 Minimize dynamic memory allocation during run-time +The time to dynamically allocate memory can vary, and in the worst-case is unbounded. This is bad for realtime performance. + + +#### 2.4 Allow the compiler to help you find problems + +Modern compilers have gotten very helpful, and can check for a lot of potential problems. +Many people are familiar with the compiler warning options like ```-Wall```, ```-Wextra```, and ```-Wshadow```. Be aware that there are a lot more, to help you find problems: + +* [GCC Warning Options](https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html) +* [CLANG Warning Options](https://clang.llvm.org/docs/DiagnosticsReference.html) + + +#### 2.5 Fix All Compiler Warnings And Errors +Many a time the necessary clue needed to solve an intractable problem was there all along, in the form of an unheeded warning that scrolled by unseen. + +Don't ignore the messages. + +When Trick builds a sim, it generates the files, ```MAKE_out``` and ```MAKE_err``` in the ```build``` directory. These files contain the makefile output of the sim build. It's a good idea to check these for warnings on a big sim build. + +--- +### 3. Hardware +--- + +#### 3.1 Know Your Simulation Machine Architecture +Getting the best performance from a simulation on a multi-CPU machine requires understanding of the machine's hardware architecture. Particularly important is data transfer delay from memory to the CPU (latency). Depending on the machine architecture, and how data processing is allocated across CPUs, the time used for memory access, and therefore simulation performance can very significantly. + +##### Uniform Memory Access (UMA) Uniform memory access (UMA) is a multi-processor model in which all processors share the physical memory uniformly. All memory accesses have the same latency. - -![Realtime with itimer](images/UMA_Arch.png) - -In an UMA architecture, as the number of CPUs increases, the higher the chance that the system bus will become a bottle-neck. - -##### Non Uniform Memory Access (NUMA) + +![Realtime with itimer](images/UMA_Arch.png) + +In an UMA architecture, as the number of CPUs increases, the higher the chance that the system bus will become a bottle-neck. + +##### Non Uniform Memory Access (NUMA) Non-Uniform Memory Access (NUMA) is a multiprocessor model in which each processor is connected to dedicated memory but may access memory attached to other processors in the system. A NUMA architecture is one in which accesses to different addresses may have different latencies depending on where the data is stored. NUMA essentially connects UMA elements via a data-transfer interconnect. For best performance, applications should be “NUMA aware”. - -![Realtime with itimer](images/NUMA_Arch.png) - -On a Linux system the following will display the available nodes, CPUs, memory, and a normalized measure of access latency between nodes. - -```% numactl --hardware``` - -##### Example 1 -``` + +![Realtime with itimer](images/NUMA_Arch.png) + +On a Linux system the following will display the available nodes, CPUs, memory, and a normalized measure of access latency between nodes. + +```% numactl --hardware``` + +##### Example 1 +``` available: 1 nodes (0) node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 node 0 size: 63986 MB node 0 free: 54389 MB node distances: node   0 -  0:  10 -``` -This computer has one NUMA node with 20 CPUs, and 64 Gigabytes. - -##### Example 2 -``` +  0:  10 +``` +This computer has one NUMA node with 20 CPUs, and 64 Gigabytes. + +##### Example 2 +``` available: 2 nodes (0-1) node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 24 25 26 27 28 29 30 31 32 33 34 35 node 0 size: 15371 MB @@ -470,72 +470,72 @@ node distances: node   0   1    0:  10  21    1:  21  10  -``` -This computer has two NUMA nodes, each with 24 CPUs, and each with about 16 gigabytes of local memory, for a total of 32 Gigabytes. The "distances" matrix at the bottom tells us that memory access latency between the nodes is (21/10) = 2.1 times the latency within a node. - - -#### 3.2 Turn Off Any Energy-Efficiency Settings +``` +This computer has two NUMA nodes, each with 24 CPUs, and each with about 16 gigabytes of local memory, for a total of 32 Gigabytes. The "distances" matrix at the bottom tells us that memory access latency between the nodes is (21/10) = 2.1 times the latency within a node. + + +#### 3.2 Turn Off Any Energy-Efficiency Settings Energy efficiency and performance are usually trade-offs. Turn off any energy-efficiency settings the computer may have enabled, usually in the BIOS. - - -#### 3.3 Fewer, Faster Cores Are Preferable to More, Slower Cores + + +#### 3.3 Fewer, Faster Cores Are Preferable to More, Slower Cores For simulation hosts, fewer but faster cores is usually preferable to more but slower cores - + * **Server-class** machines are designed for throughput. * **Performance** machines are designed for low latency, high-speed computing. - - -#### 3.4 Buy More Memory -Insufficient random access memory (RAM) leads to virtual memory page swapping, which degrades realtime performance. More RAM is one of the easiest and cheapest ways of boosting machine performance. - -#### 3.5 Avoid Intel “Efficiency” Cores + +#### 3.4 Buy More Memory +Insufficient random access memory (RAM) leads to virtual memory page swapping, which degrades realtime performance. More RAM is one of the easiest and cheapest ways of boosting machine performance. + + +#### 3.5 Avoid Intel “Efficiency” Cores Intel "efficiency" cores aren’t currently recognized by most Linux OS’s and will cause a lot of problems. They are more energy efficient, but slower, the opposite of what hard realtime needs. RHEL8 is unable to determine which cores are “E” (Efficiency) and which are “P” (Performance). Buy more memory. Do it! - ---- -### 4. Network ---- - + +--- +### 4. Network +--- + #### 4.1 Have Multiple Network Interface Jacks On Sim Machines -Isolate all sim-to-sim traffic to one network interface. Leave the other for connections to the box and OS traffic. - - -#### 4.2 Use One Master Clock For All Machines On The Network -All clocks will drift apart unless periodically synchronized. Synchronization means that one of the clocks must be the reference, or "master". Multiple unsynchronized clocks in a realtime system is nightmare fuel. - ---- -### 5. Miscellaneous ---- - -#### 5.1 Maintain a history of simulation performance. - +Isolate all sim-to-sim traffic to one network interface. Leave the other for connections to the box and OS traffic. + + +#### 4.2 Use One Master Clock For All Machines On The Network +All clocks will drift apart unless periodically synchronized. Synchronization means that one of the clocks must be the reference, or "master". Multiple unsynchronized clocks in a realtime system is nightmare fuel. + +--- +### 5. Miscellaneous +--- + +#### 5.1 Maintain a history of simulation performance. + Maintain a performance history of your sim as development procedes. This can be very useful evidence in solving problems. Begin frame logging the sim even before implementing realtime. - - -#### 5.2 Take care when "tuning" operating system behavior -Overriding the OS by isolating CPUs, assigning threads to CPUs, redirecting interrupts, changing priorities, and so forth can be powerful techniques to improve performance, but with the same power they can degrade it. Modern operating systems are pretty good at managing performance. If you decide to "help" the OS, you’ll need to know what you’re doing. Take the time to study up first. - -Some useful learning material: - -* [Challenges Using Linux as a Real-Time Operating System] -(https://ntrs.nasa.gov/api/citations/20200002390/downloads/20200002390.pdf) -* [Optimizing RHEL 8 for Real Time for low latency operation] + + +#### 5.2 Take care when "tuning" operating system behavior +Overriding the OS by isolating CPUs, assigning threads to CPUs, redirecting interrupts, changing priorities, and so forth can be powerful techniques to improve performance, but with the same power they can degrade it. Modern operating systems are pretty good at managing performance. If you decide to "help" the OS, you’ll need to know what you’re doing. Take the time to study up first. + +Some useful learning material: + +* [Challenges Using Linux as a Real-Time Operating System] +(https://ntrs.nasa.gov/api/citations/20200002390/downloads/20200002390.pdf) +* [Optimizing RHEL 8 for Real Time for low latency operation] (https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_for_real_time/8/html-single/optimizing_rhel_8_for_real_time_for_low_latency_operation/index) - -#### 5.3 Don’t isolate CPU 0 + +#### 5.3 Don’t isolate CPU 0 Nothing good can come from this. - - -#### 5.4 Best Performance Requires Root Privileges - -Ways to give root privilege to sim: - + + +#### 5.4 Best Performance Requires Root Privileges + +Ways to give root privilege to sim: + 1. Run as root ( Don't ) -2. Change owner of executable to root and set user id bit +2. Change owner of executable to root and set user id bit Use ```sudo``` command to give root privileges to the simulation executable using ```chown``` and ```chmod``` commands. - -``` + +``` chown root S_main_${TRICK_HOST_CPU}.exe chmod 4775 S_main_${TRICK_HOST_CPU}.exe ``` From 0c8bc45a8410c58db260bdf343057c3a12baef8a Mon Sep 17 00:00:00 2001 From: jmpenn Date: Mon, 20 May 2024 13:16:43 -0500 Subject: [PATCH 21/52] Update Realtime-Best-Practices.md Fix link format --- docs/howto_guides/Realtime-Best-Practices.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/docs/howto_guides/Realtime-Best-Practices.md b/docs/howto_guides/Realtime-Best-Practices.md index 097e0ed1..e793783a 100644 --- a/docs/howto_guides/Realtime-Best-Practices.md +++ b/docs/howto_guides/Realtime-Best-Practices.md @@ -14,7 +14,7 @@ The intention of this document is to compile and share practical knowledge, base ## Prerequisite Knowledge -(Assuming you've completed the [Trick Tutorial] (https://nasa.github.io/trick/tutorial/Tutorial)) +(Assuming you've completed the [Trick Tutorial](https://nasa.github.io/trick/tutorial/Tutorial)) --- @@ -33,7 +33,7 @@ If we want to interact with a simulation as if it were real, we need to synchron * ```clock_gettime(CLOCK_REALTIME,…)``` [Linux] * ```gettimeofday()``` [Mac OS] -* The Trick realtime scheduler can also be configured to synchronize to a [custom realtime clock] (https://nasa.github.io/trick/documentation/simulation_capabilities/Realtime-Clock). +* The Trick realtime scheduler can also be configured to synchronize to a [custom realtime clock](https://nasa.github.io/trick/documentation/simulation_capabilities/Realtime-Clock). --- @@ -71,7 +71,7 @@ An **under-run** occurs when the Trick executive finishes running all of its sch An **over-run** occurs if the executive does not finish running all of its scheduled jobs. This is a **bad-thing**. In this case, the executive will immediately start the next frame in an attempt to catch up. - + ![Realtime Over Run](images/RealtimeOverRun.png) --- @@ -252,7 +252,7 @@ Ref: [RedHat: Isolating CPUs Using tuned-profiles-realtime](https://access.redha Trick events can provide a quick and easy way to customize the behavior of a sim, based on some condition. But, because they require Python interpretation, they are slow. They are not intended for implementation of permanent sim functionality. If they are over used, they can seriously degrade simulation performance. So, take it easy with the events. -See [Event Manager] (https://nasa.github.io/trick/documentation/simulation_capabilities/Event-Manager). +See [Event Manager](https://nasa.github.io/trick/documentation/simulation_capabilities/Event-Manager). #### 1.2 Disable Trick run-time components that your sim doesn't need. @@ -517,10 +517,8 @@ Overriding the OS by isolating CPUs, assigning threads to CPUs, redirecting inte Some useful learning material: -* [Challenges Using Linux as a Real-Time Operating System] -(https://ntrs.nasa.gov/api/citations/20200002390/downloads/20200002390.pdf) -* [Optimizing RHEL 8 for Real Time for low latency operation] -(https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_for_real_time/8/html-single/optimizing_rhel_8_for_real_time_for_low_latency_operation/index) +* [Challenges Using Linux as a Real-Time Operating System](https://ntrs.nasa.gov/api/citations/20200002390/downloads/20200002390.pdf) +* [Optimizing RHEL 8 for Real Time for low latency operation](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_for_real_time/8/html-single/optimizing_rhel_8_for_real_time_for_low_latency_operation/index) #### 5.3 Don’t isolate CPU 0 Nothing good can come from this. From fdb2bb20b98638341f9ca5d27f1d28761fb8ea43 Mon Sep 17 00:00:00 2001 From: jmpenn Date: Tue, 21 May 2024 11:48:48 -0500 Subject: [PATCH 22/52] Update Realtime-Best-Practices.md Add "Did I mention you should buy more memory?" to 3.5 instead of "Buy more memory! Do it!" Makes it clear that it's intentional. --- docs/howto_guides/Realtime-Best-Practices.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/howto_guides/Realtime-Best-Practices.md b/docs/howto_guides/Realtime-Best-Practices.md index e793783a..bf3b0bf7 100644 --- a/docs/howto_guides/Realtime-Best-Practices.md +++ b/docs/howto_guides/Realtime-Best-Practices.md @@ -490,7 +490,7 @@ Insufficient random access memory (RAM) leads to virtual memory page swapping, w #### 3.5 Avoid Intel “Efficiency” Cores -Intel "efficiency" cores aren’t currently recognized by most Linux OS’s and will cause a lot of problems. They are more energy efficient, but slower, the opposite of what hard realtime needs. RHEL8 is unable to determine which cores are “E” (Efficiency) and which are “P” (Performance). Buy more memory. Do it! +Intel "efficiency" cores aren’t currently recognized by most Linux OS’s and will cause a lot of problems. They are more energy efficient, but slower, the opposite of what hard realtime needs. RHEL8 is unable to determine which cores are “E” (Efficiency) and which are “P” (Performance). Did I mention you should buy more memory? --- ### 4. Network From ee2f824550024c099ec45f5b378388ce0b945367 Mon Sep 17 00:00:00 2001 From: jmpenn Date: Thu, 23 May 2024 10:12:27 -0500 Subject: [PATCH 23/52] =?UTF-8?q?Disable=20unneeded=20SimObjects=20from=20?= =?UTF-8?q?default=5Ftrick=5Fsys.sm=20in=20Trick=20exampl=E2=80=A6=20(#171?= =?UTF-8?q?9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Disable unneeded SimObjects from default_trick_sys.sm in Trick example sims. * Take out unit test disable. Add some S_defines I forgot. --- trick_sims/SIM_aircraft/S_define | 6 ++++++ trick_sims/SIM_balloon/S_define | 6 ++++++ trick_sims/SIM_billiards/S_define | 6 ++++++ trick_sims/SIM_contact/S_define | 6 ++++++ trick_sims/SIM_lander/S_define | 6 ++++++ trick_sims/SIM_msd/S_define | 10 ++++++++-- trick_sims/SIM_parachute/S_define | 6 +++++- trick_sims/SIM_robot/S_define | 7 ++++++- trick_sims/SIM_rocket/S_define | 6 ++++++ trick_sims/SIM_sat2d/S_define | 6 ++++++ trick_sims/SIM_satellite/S_define | 7 ++++++- trick_sims/SIM_splashdown/S_define | 6 ++++++ trick_sims/SIM_submarine/S_define | 6 ++++++ trick_sims/SIM_sun/S_define | 7 +++++-- trick_sims/SIM_waterclock/S_define | 7 ++++++- trick_sims/SIM_wheelbot/S_define | 6 +++++- 16 files changed, 95 insertions(+), 9 deletions(-) diff --git a/trick_sims/SIM_aircraft/S_define b/trick_sims/SIM_aircraft/S_define index 727ba4ff..20be236c 100644 --- a/trick_sims/SIM_aircraft/S_define +++ b/trick_sims/SIM_aircraft/S_define @@ -7,7 +7,13 @@ LIBRARY DEPENDENCIES: (Aircraft/src/Waypoint.cpp) ) **************************************************************************/ +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" + ##include "Aircraft/include/Aircraft.hh" ##include "Aircraft/include/Waypoint.hh" diff --git a/trick_sims/SIM_balloon/S_define b/trick_sims/SIM_balloon/S_define index f83826b0..7d2f862c 100644 --- a/trick_sims/SIM_balloon/S_define +++ b/trick_sims/SIM_balloon/S_define @@ -5,7 +5,13 @@ LIBRARY DEPENDENCIES: ((balloon/src/Balloon.cpp) (atmosphere/src/atmosphere.c)) *************************************************************/ +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" + ##include "balloon/include/Balloon.hh" class BalloonSimObject : public Trick::SimObject { diff --git a/trick_sims/SIM_billiards/S_define b/trick_sims/SIM_billiards/S_define index 15dcd6ca..9533f508 100644 --- a/trick_sims/SIM_billiards/S_define +++ b/trick_sims/SIM_billiards/S_define @@ -4,7 +4,13 @@ PURPOSE: LIBRARY DEPENDENCIES: ((pool_table/src/pool_table.cpp)) *************************************************************/ +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" + ##include "pool_table/include/pool_table.hh" class PoolTableSimObject : public Trick::SimObject { diff --git a/trick_sims/SIM_contact/S_define b/trick_sims/SIM_contact/S_define index 2c4130a3..8c5b085b 100644 --- a/trick_sims/SIM_contact/S_define +++ b/trick_sims/SIM_contact/S_define @@ -4,7 +4,13 @@ PURPOSE: LIBRARY DEPENDENCIES: ((contact/src/Contact.cpp)) *************************************************************/ +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" + ##include "contact/include/Contact.hh" class ContactSimObject : public Trick::SimObject { public: diff --git a/trick_sims/SIM_lander/S_define b/trick_sims/SIM_lander/S_define index e99f2057..605d21a6 100644 --- a/trick_sims/SIM_lander/S_define +++ b/trick_sims/SIM_lander/S_define @@ -5,7 +5,13 @@ LIBRARY DEPENDENCIES: ((lander/src/Lander.cpp) (PIDController/src/PIDController.cpp)) *************************************************************/ +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" + ##include "lander/include/Lander.hh" class LanderSimObject : public Trick::SimObject { public: diff --git a/trick_sims/SIM_msd/S_define b/trick_sims/SIM_msd/S_define index dd387473..c885e14a 100644 --- a/trick_sims/SIM_msd/S_define +++ b/trick_sims/SIM_msd/S_define @@ -11,8 +11,13 @@ LIBRARY DEPENDENCIES: (msd/src/msd_shutdown.cpp) ) *************************************************************/ - +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" + // #include "sim_objects/WebServer.sm" ##include "msd/include/msd.hh" @@ -32,4 +37,5 @@ class MSDSimObject : public Trick::SimObject { } ; MSDSimObject dyn ; -IntegLoop dyn_integloop (0.01) dyn ; \ No newline at end of file +IntegLoop dyn_integloop (0.01) dyn ; + diff --git a/trick_sims/SIM_parachute/S_define b/trick_sims/SIM_parachute/S_define index 406be669..933b01c9 100644 --- a/trick_sims/SIM_parachute/S_define +++ b/trick_sims/SIM_parachute/S_define @@ -4,7 +4,11 @@ PURPOSE: LIBRARY DEPENDENCIES: ((parachute/src/Parachutist.cpp)) *************************************************************/ - +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" ##include "parachute/include/Parachutist.hh" diff --git a/trick_sims/SIM_robot/S_define b/trick_sims/SIM_robot/S_define index 3f518795..2ddb216f 100644 --- a/trick_sims/SIM_robot/S_define +++ b/trick_sims/SIM_robot/S_define @@ -6,8 +6,13 @@ LIBRARY DEPENDENCIES: (manipulator/manipulator.cc) ) *************************************************************/ - +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" + ##include "include/trick/exec_proto.h" ##include "manipulator/manipulator.hh" diff --git a/trick_sims/SIM_rocket/S_define b/trick_sims/SIM_rocket/S_define index 89e5943c..a18222f7 100644 --- a/trick_sims/SIM_rocket/S_define +++ b/trick_sims/SIM_rocket/S_define @@ -4,7 +4,13 @@ PURPOSE: LIBRARY DEPENDENCIES: ((rocket/src/Rocket.cpp)) *************************************************************/ +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" + ##include "rocket/include/Rocket.hh" class ModelRocketSimObject : public Trick::SimObject { public: diff --git a/trick_sims/SIM_sat2d/S_define b/trick_sims/SIM_sat2d/S_define index ca58495b..64489999 100644 --- a/trick_sims/SIM_sat2d/S_define +++ b/trick_sims/SIM_sat2d/S_define @@ -4,7 +4,13 @@ PURPOSE: LIBRARY DEPENDENCIES: ((satellite/src/Satellite.cpp)) *************************************************************/ +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" + ##include "satellite/include/Satellite.hh" class SatelliteSimObject : public Trick::SimObject { public: diff --git a/trick_sims/SIM_satellite/S_define b/trick_sims/SIM_satellite/S_define index 029539d9..5be3ef62 100644 --- a/trick_sims/SIM_satellite/S_define +++ b/trick_sims/SIM_satellite/S_define @@ -5,8 +5,13 @@ LIBRARY DEPENDENCIES: ( ) *************************************************************/ - +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" + ##include "Satellite/include/Satellite.hh" ##include "Satellite/include/SatGraphicsComm.hh" diff --git a/trick_sims/SIM_splashdown/S_define b/trick_sims/SIM_splashdown/S_define index 55d9ae38..d7565570 100644 --- a/trick_sims/SIM_splashdown/S_define +++ b/trick_sims/SIM_splashdown/S_define @@ -5,7 +5,13 @@ LIBRARY DEPENDENCIES: ((CrewModule/src/CrewModuleDynamics.o) (CrewModule/src/CrewModuleShape.o)) **************************************************************************/ +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" + ##include "CrewModule/include/CrewModuleDynamics.hh" class CrewModuleSimObject : public Trick::SimObject { diff --git a/trick_sims/SIM_submarine/S_define b/trick_sims/SIM_submarine/S_define index 18e62b73..b83747bd 100644 --- a/trick_sims/SIM_submarine/S_define +++ b/trick_sims/SIM_submarine/S_define @@ -4,7 +4,13 @@ PURPOSE: LIBRARY DEPENDENCIES: ((submarine/src/Submarine.cpp)) *************************************************************/ +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" + ##include "submarine/include/Submarine.hh" class SubmarineSimObject : public Trick::SimObject { diff --git a/trick_sims/SIM_sun/S_define b/trick_sims/SIM_sun/S_define index 20659778..e525055f 100644 --- a/trick_sims/SIM_sun/S_define +++ b/trick_sims/SIM_sun/S_define @@ -15,10 +15,13 @@ LIBRARY DEPENDENCIES: (Sun/src/sun_pred_slow_display.c) ) *************************************************************/ - +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" - ##include "Sun/include/sun_pred.h" ##include "sim_services/MemoryManager/include/wcs_ext.h" diff --git a/trick_sims/SIM_waterclock/S_define b/trick_sims/SIM_waterclock/S_define index c6f593fd..b2f5ff33 100644 --- a/trick_sims/SIM_waterclock/S_define +++ b/trick_sims/SIM_waterclock/S_define @@ -8,8 +8,13 @@ LIBRARY DEPENDENCIES: (waterclock/src/waterclock_shutdown.c) ) *************************************************************/ - +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" + ##include "waterclock/include/waterclock_numeric.h" class WaterClockSimObject : public Trick::SimObject { diff --git a/trick_sims/SIM_wheelbot/S_define b/trick_sims/SIM_wheelbot/S_define index fc625c5e..847254df 100644 --- a/trick_sims/SIM_wheelbot/S_define +++ b/trick_sims/SIM_wheelbot/S_define @@ -5,7 +5,11 @@ LIBRARY DEPENDENCIES: ((Vehicle/src/vehicleOne.cpp) (Control/src/PIDController.cpp)) *************************************************************/ - +#define TRICK_NO_MONTE_CARLO +#define TRICK_NO_MASTERSLAVE +#define TRICK_NO_INSTRUMENTATION +#define TRICK_NO_REALTIMEINJECTOR +#define TRICK_NO_ZEROCONF #include "sim_objects/default_trick_sys.sm" ##include "Vehicle/include/vehicleOne.hh" From 27e4264c2ac46428e6dd79c1c21301bbf4d5744b Mon Sep 17 00:00:00 2001 From: Hong Chen Date: Thu, 23 May 2024 10:13:50 -0500 Subject: [PATCH 24/52] Removed double quotes for port number and added some inline code syntax highlighting with back-ticks. (#1717) * Removed double quotes for port number and added some inline code syntax highlighting with back-ticks. * Added one more inline code syntax highlighting. --- docs/documentation/web/Webserver.md | 30 ++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/documentation/web/Webserver.md b/docs/documentation/web/Webserver.md index f854ac1d..de549525 100644 --- a/docs/documentation/web/Webserver.md +++ b/docs/documentation/web/Webserver.md @@ -12,17 +12,17 @@ adding a web server to your simulation simply requires including the CivetServer ## Configuration of the Web Server -The following (input.py) parameters are available to configure your web server: +The following (`input.py`) parameters are available to configure your web server: -|Parameter Name | Default Value | Description | -|---------------------------|---------------------------|-----------------------------------------------------------------| -|web.server.enable | False |Must be explicitly enabled | -|web.server.port | "8888" |Web servers “listen” port | -|web.server.document_root | "www" |Web servers document root | -|web.server.debug | False |Print Client/Server Communication. | -|web.server.ssl_enable | False |Encrypt traffic. Uses https instead of http. | -|web.server.path_to_ssl_cert|"~/.ssl/server.pem" |Path to your certificate. This is only used if ssl_enable = True| -|web.server.error_log_file | "civet_server_error.log" |CivetWeb error log file. | +|Parameter Name | Default Value | Description | +|---------------------------|---------------------------|-------------------------------------------------------------------| +|web.server.enable | `False` |Must be explicitly enabled | +|web.server.port | `8888` |Web servers “listen” port | +|web.server.document_root | `"www"` |Web servers document root | +|web.server.debug | `False` |Print Client/Server Communication. | +|web.server.ssl_enable | `False` |Encrypt traffic. Uses https instead of http. | +|web.server.path_to_ssl_cert|`"~/.ssl/server.pem"` |Path to your certificate. This is only used if `ssl_enable = True`| +|web.server.error_log_file |`"civet_server_error.log"` |CivetWeb error log file. | For your web server to be active, you must at least specify the following : @@ -31,10 +31,10 @@ web.server.enable = True ``` -To have your web server listen on port 8890, rather than 8888, you would specify: +To have your web server listen on port `8890`, rather than `8888`, you would specify: ```python -web.server.port = "8890" +web.server.port = 8890 ``` To serve files from a directory called ```my_document_root```, rather than ```www```: @@ -50,11 +50,11 @@ web.server.debug = True ``` ## When the Web Server Starts -The web server, if enabled, will start during sim initialization. When it does, it will look for the specified document root directory. By default that’s “www”. If root directory doesn’t exist, one will be created with a simple index.html file , a style sheet, and a couple of directories. +The web server, if enabled, will start during sim initialization. When it does, it will look for the specified document root directory. By default that’s `“www”`. If root directory doesn’t exist, one will be created with a simple `index.html` file , a style sheet, and a couple of directories. ## Connecting to Your Web Server -Assuming that you accepted the default port, connect to ```http://localhost:8888/``` (```https://localhost:8888/``` if ssl_enable=True) from your web browser. This will display the index.html file in your root directory. +Assuming that you accepted the default port, connect to ```http://localhost:8888/``` (```https://localhost:8888/``` if `ssl_enable=True`) from your web browser. This will display the `index.html` file in your root directory. ## The Default Document Root Directory @@ -69,7 +69,7 @@ www/ images/ ``` -**index.html** is the file that’s displayed when you connect to http://localhost:8888/. +**index.html** is the file that’s displayed when you connect to `http://localhost:8888/`. **style.css** is a CSS style-sheet that’s included by index.html to give it some pizzazz. From 5219c1d279c5023417cd83f4fa641a07eca8a96b Mon Sep 17 00:00:00 2001 From: Pherring04 <158035107+Pherring04@users.noreply.github.com> Date: Thu, 23 May 2024 10:29:53 -0500 Subject: [PATCH 25/52] message (#1712) --- include/trick/message_proto.h | 3 ++ .../sim_services/Message/Message_c_intf.cpp | 29 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/include/trick/message_proto.h b/include/trick/message_proto.h index d1458855..d9ca75f8 100644 --- a/include/trick/message_proto.h +++ b/include/trick/message_proto.h @@ -9,6 +9,9 @@ extern "C" { #endif +int message_add_subscriber( void * in_ms ) ; +int message_remove_subscriber( void * in_ms ) ; +void * message_get_subscriber( const char * sub_name) ; int message_publish(int level, const char *format_msg, ...) ; int message_publish_standalone(int level, const char *format_msg, ...) ; int send_hs(FILE * fp, const char *format_msg, ...) ; diff --git a/trick_source/sim_services/Message/Message_c_intf.cpp b/trick_source/sim_services/Message/Message_c_intf.cpp index 0353c9dd..60aec2d2 100644 --- a/trick_source/sim_services/Message/Message_c_intf.cpp +++ b/trick_source/sim_services/Message/Message_c_intf.cpp @@ -24,7 +24,7 @@ int message_subscribe( Trick::MessageSubscriber * in_ms ) { the_message_publisher->subscribe(in_ms) ; return(0) ; } - + /** @relates Trick::MessagePublisher @copydoc Trick::MessagePublisher::unsubscribe @@ -34,6 +34,33 @@ int message_unsubscribe( Trick::MessageSubscriber * in_ms ) { return(0) ; } + +/** + @relates Trick::MessagePublisher + @copydoc Trick::MessagePublisher::subscribe + */ +extern "C" int message_add_subscriber( void * in_ms ) { + the_message_publisher->subscribe((Trick::MessageSubscriber *)in_ms) ; + return(0) ; +} + +/** + @relates Trick::MessagePublisher + @copydoc Trick::MessagePublisher::unsubscribe + */ +extern "C" int message_remove_subscriber( void * in_ms ) { + the_message_publisher->unsubscribe((Trick::MessageSubscriber *)in_ms) ; + return(0) ; +} + +/** + @relates Trick::MessagePublisher + @copydoc Trick::MessagePublisher::getSubscriber + */ +extern "C" void * message_get_subscriber( const char * sub_name ) { + return (void *)the_message_publisher->getSubscriber(sub_name) ; +} + /** @relates Trick::MessagePublisher @userdesc Command to publish a message, which sends the message to all subscribers. From d997759a6d62aeb6a6c4ee22b46e36eee1679316 Mon Sep 17 00:00:00 2001 From: Pherring04 <158035107+Pherring04@users.noreply.github.com> Date: Thu, 23 May 2024 10:30:56 -0500 Subject: [PATCH 26/52] Water Clock Cleanup (#1711) * Cleaned up Water Clock and added C interface support for message subscriptions * Added support for message publishers in C interface * Revert "Added support for message publishers in C interface" This reverts commit e3233891d784f980cbb692ebdca0e978126e535a. --- trick_sims/SIM_waterclock/README.md | 6 +++--- trick_sims/SIM_waterclock/RUN_test/input.py | 2 -- .../models/waterclock/include/waterclock_numeric.h | 10 +++++----- .../models/waterclock/src/waterclock_numeric.c | 3 +++ 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/trick_sims/SIM_waterclock/README.md b/trick_sims/SIM_waterclock/README.md index 6093628d..4470dda2 100644 --- a/trick_sims/SIM_waterclock/README.md +++ b/trick_sims/SIM_waterclock/README.md @@ -14,11 +14,11 @@ Assumptions: * Buckets and spouts are perfectly cylindrical. ### A Brief History -The water clock (or clepsydra to the ancient Greek) is a device used to measure time through the displacement of water. It is not known precisely when the earliest water clocks were developed, but they have been discovered to exist in various parts of the world as early as the 16th century BC. These early designs were relatively simple compared to later designs, consiting of a bowl with markings to indicate time passing as the bowl either filled or drained. +The water clock (or clepsydra to the ancient Greek) is a device used to measure time through the displacement of water. It is not known precisely when the earliest water clocks were developed, but they have been discovered to exist in various parts of the world as early as the 16th century BC. These early designs were relatively simple compared to later designs, consisting of a bowl with markings to indicate time passing as the bowl either filled or drained. -Water clocks remained a prominent timekeeping device until the 17th century when better methods of timekeeping were developed. Over those many centruies, different cultures innovated on the design of the early water clocks. Of particular note were the contributions of the Greek inventor Ctesibius in the 3rd century BC. Ctesibius innovated on the water clock by making it largely automatic. Prior to Ctesibius, water clocks needed to be consistently refilled/emptied by hand. Furthermore, if a water clock had indicators marking the position of the sun, they would need to be manually adjusted for different seasons. Ctesibius automated both these processes. +Water clocks remained a prominent timekeeping device until the 17th century when better methods of timekeeping were developed. Over those many centruies, different cultures innovated on the design of the early water clocks. Of particular note were the contributions of the Greek inventor Κτησιβιος (Ctesibius) in the 3rd century BC. Κτησιβιος innovated on the water clock by making it largely automatic. Prior to Κτησιβιος, water clocks needed to be consistently refilled/emptied by hand. Furthermore, if a water clock had indicators marking the position of the sun, they would need to be manually adjusted for different seasons. Κτησιβιος automated both these processes. -Ctesibius automated the draining process with a siphon akin to a Pythagorean cup. This siphon would empty over a water wheel, which powered a series of gears that would turn a cylinder. The cylinder had a row of irregular rings drawn around it, meant to correlate with the position of the sun throughout the seasons. Each day, as the water clock would fill it would accurately indicate the position of the sun, drain itself at the end of the day, and adjust the cylinder to be accurate for the next day. +Κτησιβιος automated the draining process with a siphon akin to a Pythagorean cup. This siphon would empty over a water wheel, which powered a series of gears that would turn a cylinder. The cylinder had a row of irregular rings drawn around it, meant to correlate with the position of the sun throughout the seasons. Each day, as the water clock would fill it would accurately indicate the position of the sun, drain itself at the end of the day, and adjust the cylinder to be accurate for the next day. ### Building the Simulation After building trick, in the SIM\_waterclock directory run the command **trick-CP** to build the sim. When it's complete, you should see: diff --git a/trick_sims/SIM_waterclock/RUN_test/input.py b/trick_sims/SIM_waterclock/RUN_test/input.py index 0648aca5..b73bf209 100644 --- a/trick_sims/SIM_waterclock/RUN_test/input.py +++ b/trick_sims/SIM_waterclock/RUN_test/input.py @@ -24,8 +24,6 @@ dyn.waterclock.timer_bucket_diam = 45.0 dyn.waterclock.total_ticks = 60 -trick.message_unsubscribe(trick_message.mcout) - # ========================================== # Start the Satellite Graphics Client # ========================================== diff --git a/trick_sims/SIM_waterclock/models/waterclock/include/waterclock_numeric.h b/trick_sims/SIM_waterclock/models/waterclock/include/waterclock_numeric.h index eff39022..9cfa11e5 100644 --- a/trick_sims/SIM_waterclock/models/waterclock/include/waterclock_numeric.h +++ b/trick_sims/SIM_waterclock/models/waterclock/include/waterclock_numeric.h @@ -2,7 +2,7 @@ PURPOSE: ( Water Clock Numeric Model ) **************************************************************************/ -#ifndef WATRERCLOCK_NUMERIC_H +#ifndef WATERCLOCK_NUMERIC_H #define WATERCLOCK_NUMERIC_H #include "waterclock.h" @@ -10,10 +10,10 @@ PURPOSE: ( Water Clock Numeric Model ) #ifdef __cplusplus extern "C" { #endif -int waterclock_integ(WATERCLOCK*); -int waterclock_deriv(WATERCLOCK*); -double waterclock_tick_change(WATERCLOCK*); -double waterclock_overflow_timer(WATERCLOCK*); +int waterclock_integ(WATERCLOCK* WC); +int waterclock_deriv(WATERCLOCK* WC); +double waterclock_tick_change(WATERCLOCK* WC); +double waterclock_overflow_timer(WATERCLOCK* WC); void waterclock_update_water_level(WATERCLOCK* WC); #ifdef __cplusplus } diff --git a/trick_sims/SIM_waterclock/models/waterclock/src/waterclock_numeric.c b/trick_sims/SIM_waterclock/models/waterclock/src/waterclock_numeric.c index f7a2ec7b..0e06fd19 100644 --- a/trick_sims/SIM_waterclock/models/waterclock/src/waterclock_numeric.c +++ b/trick_sims/SIM_waterclock/models/waterclock/src/waterclock_numeric.c @@ -115,7 +115,10 @@ double waterclock_tick_change( WATERCLOCK* WC ) { if( (WC->current_tick < WC->total_ticks) && (WC->current_tick >= 0) ) { WC->current_tick += 1; + void * sub_ptr = message_get_subscriber("cout"); + message_remove_subscriber(sub_ptr); message_publish(MSG_NORMAL, "Tick %d, Sim Time %f, Water Level %f\n", WC->current_tick, exec_get_sim_time(), WC->timer_water_level) ; + message_add_subscriber(sub_ptr); } else fprintf(stderr, "ERROR, SOMETHING WENT VERY WRONG!\n" ) ; From a1d151c4c35c80295e519e50c1dfb76d3d064659 Mon Sep 17 00:00:00 2001 From: Hong Chen Date: Thu, 23 May 2024 10:37:27 -0500 Subject: [PATCH 27/52] Updated not to always pass disown flag for swig pointer conversion instead base on "own" value of the input object. (#1690) --- include/trick/swig/swig_class_typedef.i | 10 +++++++++- test/SIM_test_ip/RUN_test/unit_test.py | 8 ++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/include/trick/swig/swig_class_typedef.i b/include/trick/swig/swig_class_typedef.i index de549175..07a15165 100644 --- a/include/trick/swig/swig_class_typedef.i +++ b/include/trick/swig/swig_class_typedef.i @@ -51,7 +51,15 @@ // TYPE * void * temp_ptr ; - if ( SWIG_IsOK(SWIG_ConvertPtr($input, &temp_ptr,$1_descriptor, SWIG_POINTER_DISOWN)) ) { + SwigPyObject *sobj = SWIG_Python_GetSwigThis($input) ; + // isDisown is set to SWIG_POINTER_DISOWN by default + int isDisown = SWIG_POINTER_DISOWN ; + if (sobj) { + // isDisown is re-set based on whether the Python processor owns the input object + isDisown = !sobj->own ; + } + + if ( SWIG_IsOK(SWIG_ConvertPtr($input, &temp_ptr,$1_descriptor, isDisown)) ) { $1 = reinterpret_cast< $1_ltype >(temp_ptr) ; } else if ( SWIG_IsOK(SWIG_ConvertPtr($input, &temp_ptr,SWIG_TypeQuery("_p_swig_ref"), 0)) ) { // Array to pointer assignment diff --git a/test/SIM_test_ip/RUN_test/unit_test.py b/test/SIM_test_ip/RUN_test/unit_test.py index 35ecab8d..746fdbe3 100644 --- a/test/SIM_test_ip/RUN_test/unit_test.py +++ b/test/SIM_test_ip/RUN_test/unit_test.py @@ -2781,12 +2781,16 @@ def main(): # Polymorphic assignments and access test_suite = "polymorphism" - test_so.a = trick.Cat() + #test_so.a = trick.Cat() + # use MM to allocate memory for a pointer declared in S_define + test_so.a = trick.TMM_declare_var_s("Cat") TRICK_EXPECT_EQ( test_so.a.id , 1, test_suite , "single abstract ptr" ) trick.trick_test_add_parent( test_suite , "single abstract ptr" , "1770735610") #test_so.a.speak() #test_so.a[0].speak() - test_so.a = trick.Dog() + #test_so.a = trick.Dog() + # use MM to allocate memory for a pointer declared in S_define + test_so.a = trick.TMM_declare_var_s("Dog") TRICK_EXPECT_EQ( test_so.a.id , 2, test_suite , "single abstract ptr" ) test_so.aarray[0] = trick.Cat() From 982a4349576651f30a33435586e0d1d9f5c4de76 Mon Sep 17 00:00:00 2001 From: Mrockwell2 <120338765+Mrockwell2@users.noreply.github.com> Date: Wed, 29 May 2024 10:29:58 -0500 Subject: [PATCH 28/52] Update Simulation-Definition-File.md Added an actual link instead of a placeholder --- .../building_a_simulation/Simulation-Definition-File.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/documentation/building_a_simulation/Simulation-Definition-File.md b/docs/documentation/building_a_simulation/Simulation-Definition-File.md index c38868d6..09cd79f4 100644 --- a/docs/documentation/building_a_simulation/Simulation-Definition-File.md +++ b/docs/documentation/building_a_simulation/Simulation-Definition-File.md @@ -187,7 +187,7 @@ to accomodate the highest Child ID specified in the S_define file. Jobs without will be executed by the parent process. Jobs with a C1 child specification will be executed by the first child thread; jobs with a C2 specification will be executed by the second child thread; and so on. -Child Threads have three different scheduling choices. See Section XYZ for child thread scheduling +Child Threads have three different scheduling choices. See [Executive Scheduler](../simulation_capabilities/Executive-Scheduler.md) -> [Thread Control](../simulation_capabilities/Executive-Scheduler.md#thread-control) for child thread scheduling details. ### Job Tagging From e044d1f13a34f1e8c9404eba0b8523a8a553e35b Mon Sep 17 00:00:00 2001 From: Mrockwell2 <120338765+Mrockwell2@users.noreply.github.com> Date: Wed, 29 May 2024 10:41:04 -0500 Subject: [PATCH 29/52] Fixed links --- .../building_a_simulation/Simulation-Definition-File.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/documentation/building_a_simulation/Simulation-Definition-File.md b/docs/documentation/building_a_simulation/Simulation-Definition-File.md index 09cd79f4..a95f51e7 100644 --- a/docs/documentation/building_a_simulation/Simulation-Definition-File.md +++ b/docs/documentation/building_a_simulation/Simulation-Definition-File.md @@ -187,7 +187,7 @@ to accomodate the highest Child ID specified in the S_define file. Jobs without will be executed by the parent process. Jobs with a C1 child specification will be executed by the first child thread; jobs with a C2 specification will be executed by the second child thread; and so on. -Child Threads have three different scheduling choices. See [Executive Scheduler](../simulation_capabilities/Executive-Scheduler.md) -> [Thread Control](../simulation_capabilities/Executive-Scheduler.md#thread-control) for child thread scheduling +Child Threads have three different scheduling choices. See [Executive Scheduler](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler) -> [Thread Control](https://nasa.github.io/trick/documentation/simulation_capabilities/Executive-Scheduler#thread-control) for child thread scheduling details. ### Job Tagging From c2c068a04aca2dd556e5a05d558513f3c0fc2c64 Mon Sep 17 00:00:00 2001 From: Hong Chen Date: Wed, 5 Jun 2024 11:58:03 -0500 Subject: [PATCH 30/52] Made updates for macOS especially for Apple Silicon. (#1721) --- .../install_guide/Install-Guide.md | 208 +++++++++++++++--- 1 file changed, 177 insertions(+), 31 deletions(-) diff --git a/docs/documentation/install_guide/Install-Guide.md b/docs/documentation/install_guide/Install-Guide.md index cd7f74ce..32c7e94d 100644 --- a/docs/documentation/install_guide/Install-Guide.md +++ b/docs/documentation/install_guide/Install-Guide.md @@ -9,16 +9,16 @@ Trick requires various free third party utilities in order to function. All the | Utility | Version | Description | Usage | Notes | |---------------:|:-------:|:-----------------------:|:---------------------------------------------------------:|:------------------------------------------------------| -| [gcc] and g++ | 4.8+ | C/C++ Compiler | Compiles Trick and Trick simulations. | | -| [clang]/[llvm] | <=14 | C/C++ Compiler | Utilized by the interface code generator. | Trick Versions <= 19.3 should use LLVM <= 9 | -| [python] | 2.7+ | Programming Language | Lets the user interact with a simulation. | Trick has been tested up to python 3.11 as of 04/23 | +| [gcc] and `g++` | 4.8+ | C/C++ Compiler | Compiles Trick and Trick simulations. | | +| [clang]/[llvm] | <=18 | C/C++ Compiler | Utilized by the interface code generator. | Trick Versions <= 19.3 should use LLVM <= 9. Please open an issue if you encounter a problem related to newer versions of LLVM. | +| [python] | 2.7+ | Programming Language | Lets the user interact with a simulation. | Trick has been tested up to python 3.12 as of 05/2024. | | [perl] | 5.6+ | Programming Language | Allows executable scripts in the bin directory to run. | | | [java] | 11+ | Programming Language | Necessary for Trick GUIs. | | | [swig] | 3.x-4.x | Language Interfacing | Connects the python input processor with Trick's C code. | 3.0+ is now required for Trick. SWIG 4.x is compatible with Trick, but has some [issues](https://github.com/nasa/trick/issues/1288). Please open an issue if you encounter a problem related to SWIG 4. | | [make] | 3.78+ | Build Automation | Automates the building and cleaning of Trick. | | | [openmotif] | 2.2.0+ | GUI Toolkit | Covers Trick GUIs not made with Java. | | | [udunits] | 2.x+ | C Unit Library/Database | Provides support for units of physical quantities. | | -| [maven] | x.x | Java package manager | Downloads Java dependencies and builds trick GUIs | | +| [maven] | x.x | Java package manager | Downloads Java dependencies and builds Trick GUIs. | | [gcc]: https://gcc.gnu.org/ [clang]: https://clang.llvm.org/ @@ -34,10 +34,11 @@ Trick requires various free third party utilities in order to function. All the ## Notes ### Clang/LLVM compiler and libraries -Clang/LLVM can be installed and located manually should your package manager fail to acquire it. You can tell Trick where to find Clang/LLVM with the "--with-llvm" configuration option specified [below](TODO). +Clang/LLVM can be installed and located manually should your package manager fail to acquire it. You can tell Trick where to find Clang/LLVM with the `"--with-llvm"` configuration option specified. If the version of Clang/LLVM installed by your package manager doesn't work, see [Build Clang and LLVM](#build-clang-and-llvm). + ### Java -Trick needs the javac compiler included in the Java Development Kit (JDK). Trick will work with either the Oracle JDK or OpenJDK. +Trick needs the `javac` compiler included in the Java Development Kit (JDK). Trick will work with either the Oracle JDK or OpenJDK. **Installing both the Oracle JDK and OpenJDK may lead to problems and confusion.** @@ -56,7 +57,10 @@ Trick runs on GNU/Linux and macOS, though any System V/POSIX compatible UNIX wor |[Fedora](#fedora)| |[Ubuntu](#ubuntu)| |[macOS](#macos)| +|[Apple Silicon Mac](#apple_silicon_mac)| |[Windows 10 (Linux Subsystem Only)](#windows10)| +|[Build Clang and LLVM](#build-clang-and-llvm)| +|[Build SWIG](#build-swig)| |[Troubleshooting](#trouble)| --- @@ -68,7 +72,7 @@ Sometimes environment variables affect the Trick build and can cause it to fail. ``` -JAVA_HOME # Trick and Maven will use JAVA_HOME to build the GUIs instead of javac in PATH if it is set. +JAVA_HOME # Trick and Maven will use JAVA_HOME to build the GUIs instead of Javac in PATH if it is set. TRICK_HOME # This variable is optional but may cause a Trick build to fail if it is set to the wrong directory. CFLAGS, CXXFLAGS, LDFLAGS # If these flags are set they may affect flags passed to your compiler and linker ``` @@ -151,6 +155,7 @@ yum install hdf5-devel gsl-devel gtest-devel proceed to [Install Trick](#install) section of the install guide --- + ### Fedora @@ -168,11 +173,12 @@ Trick makes use of several optional packages if they are present on the system. ```bash dnf install hdf5-devel gsl-devel gtest-devel ``` - proceed to [Install Trick](#install) section of the install guide --- + + ### Ubuntu All packages required for Trick may be installed through apt-get. If your package manager cannot find these packages, try searching for alternatives, or your Ubuntu version may be too old. @@ -195,10 +201,13 @@ export PYTHON_VERSION=3 proceed to [Install Trick](#install) section of the install guide --- + -### macOS Monterey, Big Sur, Catalina -#### These instructions are for Intel-based macs. For the latest Apple silicon (M1) instructions see this issue: https://github.com/nasa/trick/issues/1283 -1. Install the latest Xcode. I recommend installing Xcode through the App Store. +### macOS Sonoma, Ventura, Monterey, Big Sur, Catalina +#### These instructions are for both Intel-based and Apple Silicon Macs. Some are only applicable to Apple Silicon. + +1. Install the latest Xcode. we recommend installing Xcode through the App Store. + 2. Download and install Xcode Command Line Tools for macOS. The following command in the terminal should do the job: @@ -206,42 +215,53 @@ proceed to [Install Trick](#install) section of the install guide xcode-select --install ``` -3. Install Homebrew, macOS's unofficial package manager. They typically have a single line that can be executed in your terminal to install brew at their homepage at https://brew.sh/ +3. Install Homebrew, macOS's unofficial package manager. They typically have a single line that can be executed in your terminal to install brew at their homepage at https://brew.sh/. By default, it is installed into `/usr/local` on Intel-based machines and `/opt/homebrew` on Apple Silicon. -4. Install the following dependencies using brew (note, we do not currently support installing llvm through brew. Trick WILL NOT work with brew's llvm. See step 5). +4. Install the following dependencies using brew (See step 5 if `brew install llvm` doesn't work for your Trick build). ```bash -brew install python java xquartz swig maven udunits openmotif +brew install python java xquartz swig maven udunits openmotif llvm ``` -IMPORTANT: Make sure to follow the instructions for adding java and swig to your `PATH` provided by brew. If you missed them, you can see them again by using `brew info java` and `brew info swig`. Remember, you may need to restart your terminal for these `PATH` changes to take effect. Note that `swig@3` is now deprecated on Mac. +IMPORTANT: Make sure to follow the instructions for adding Java and SWIG to your `PATH` provided by brew. If you missed them, you can see them again by using `brew info java` and `brew info swig`. Remember, you may need to restart your terminal for these `PATH` changes to take effect. Note `brew install swig` will install the latest version. If a particular SWIG version is needed instead, see [Build SWIG](#build-swig). -5. Download and un-compress the latest pre-built clang+llvm from llvm-project github. Go to https://github.com/llvm/llvm-project/releases -and download the latest version llvm that matches your Xcode version from the release assets. For example, if your Xcode version is 14 then you will want the latest 14.x.x release of llvm. 13.0.1 is the latest as of the writing of this guide, the link I used is below: -https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.1/clang+llvm-13.0.1-x86_64-apple-darwin.tar.xz -Tip: I suggest renaming the untar'd directory to something simple like llvm13 and putting it in your home directory or development environment. + +5. Skip this step if `brew install llvm` works for your Trick build. Otherwise, download and un-compress a pre-built clang+llvm from llvm-project github. Go to https://github.com/llvm/llvm-project/releases and download the available version llvm from the release assets for your platform. +``` + For example, the latest as of the writing of this guide: + 1. Intel-based: https://github.com/llvm/llvm-project/releases/download/llvmorg-15.0.7/clang+llvm-15.0.7-x86_64-apple-darwin21.0.tar.xz + 2. Apple Silicon: https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.6/clang+llvm-17.0.6-arm64-apple-darwin22.0.tar.xz +``` +Tip: We suggest renaming the untar'd directory to something simple like llvm15 and putting it in your home directory or development environment. If a pre-built clang+llvm for your platform is not available, see [Build Clang and LLVM](#build-clang-and-llvm). 6. Read the following macOS optional steps/caveats and then go to the Install Trick section of this document. IMPORTANT: Your mac might complain during configuration or build that llvm is downloaded from the internet and can not be trusted. You may need to find a safe solution for this on your own. DO THIS AT YOUR OWN RISK: What worked for us was enabling Settings->Security & Privacy->Privacy->Developer Tools->Terminal. -IMPORTANT: when doing the configure step in the install trick section, you need to point trick to llvm. It is also possible that the current iteration of our configure script will not be able to find the udunits package, so you may need to point trick to udunits as well (I believe this is only an issue on M1 macs). +IMPORTANT: when doing the configure step in the [Install Trick](#install) section, you need to point Trick to `llvm`. It is also possible that the current iteration of our configure script will not be able to find the udunits package, so you may need to point Trick to udunits as well (This is only an issue on M1 macs). You can find the path of udunits by executing the following command: -``` +```bash brew info udunits ``` Then enter the path to llvm (and udunits) when you execute the configure command in place of the placeholders: -``` -./configure --with-llvm= --with-udunits= +```bash +./configure --with-llvm= --with-udunits= ``` e.g. -``` -./configure --with-llvm=/Users/trickguy/llvm13 --with-udunits=/usr/local/Cellar/udunits/2.2.28 +```bash +# For Apple Silicon Macs, you may need to configure as following if Trick configure can't find packages: +./configure --with-llvm=/opt/homebrew/opt/llvm --with-udunits=/opt/homebrew --with-hdf5==/opt/homebrew ``` -OPTIONAL: Trick uses google test (gtest) version 1.8 for unit testing. To install gtest: + +OPTIONAL: To install gtest for Trick unit testing: + +`brew install googletest` + +For your reference, a particular googletest release can be installed as following: + ``` brew install cmake wget wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz @@ -256,6 +276,48 @@ proceed to [Install Trick](#install) section of the install guide --- + +### Apple Silicon Mac +### The following is obtained from user notes for fresh Trick installation on macOS Sonoma for your reference. Thanks to Zack Crues! + +```bash +1. Install Xcode + a. Install the Xcode development tools from the Apple App Store. + b. Install command line tools. (xcode-select --install) + +2. Install Homebrew + a. Install the Homebrew package manager (https://brew.sh) + b. brew install swig maven udunits openmotif llvm + c. brew install cmake + d. Optional: brew install gsl hdf5 googletest + +3. Install XQuartz. + a. Option 1: brew install xquartz + b. Option 2: Get XQuartz from www.quartz.org + +4. Install Java from Self Service. + a. Option 1: brew install java + b. Option 2: Get Java from the NASA Self Service app. + +5. Setup environment + + setenv PYTHON_VERSION 3 + setenv TRICK_CXXFLAGS "-g -I/opt/homebrew/include -L/opt/homebrew/lib -Wno-unused-command-line-argument" + setenv TRICK_CFLAGS "-g -I/opt/homebrew/include -L/opt/homebrew/lib -Wno-unused-command-line-argument" + setenv TRICK_LDFLAGS "-L/opt/homebrew/lib" + setenv TRICK_EXCLUDE "/opt/homebrew" + +6. Build Trick + a. Follow the direction in the Trick installation documentation for Mac. + b. I add in support for GSL, HDF5, and Google Test. + +./configure --with-llvm=/opt/homebrew/opt/llvm --with-udunits=/opt/homebrew/opt/udunits --with-gsl=/opt/homebrew --with-hdf5=/opt/homebrew --with-gtest=/opt/homebrew PYTHON_VERSION=3 +``` + +proceed to [Install Trick](#install) section of the install guide + +--- + ### Windows 10 (Linux Subsystem Only) @@ -281,6 +343,90 @@ sudo /etc/hosts proceed to [Install Trick](#install) section of the install guide +--- + + + +### Build Clang and LLVM +#### If you come to this section because Clang+LLVM installed by the package manager on your machine does not work for your environment, you need to manually build Clang and LLVM. Following instructions show steps on building a particular release of Clang and LLVM . `cmake` is required. CMake may support multiple native build systmes on certain platforms. A generator is responsible for generating a particular build system. Below lists two approaches for your reference. The 1st approach uses `Unix Makefiles` (one of Makefile generators) and the 2nd one uses `Ninja` (one of Ninja generators). For Mac Apple Silicon user, may want to go to the 2nd approach direcly. + +#### Note: Remember to add `--with-llvm=` for Trick configure if using the Clang and LLVM built in this section. + +1. Using `Unix Makefiles` generator + +```bash + # Go to a folder to checkout LLVM project + a. cd + + # Clone a particular project version + b. git clone -b llvmorg-17.0.6 https://github.com/llvm/llvm-project.git + + c. cd llvm-project + + e. mkdir build + + f. cmake -S llvm -B build -G "Unix Makefiles" -DLLVM_ENABLE_PROJECTS="clang" -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX= + + # Be patient, this step takes a bit time ... + g. cmake --build build + + h. cd build + + # Install + i. cmake -DCMAKE_INSTALL_PREFIX= -P cmake_install.cmake + + +``` + +2. Using `Ninja` generator + +```bash + a. brew install ninja + + b. cd + + c. git clone -b llvmorg-17.0.6 https://github.com/llvm/llvm-project.git + + d. cd llvm-project + + e. mkdir build + + # Apple Silicon + g cmake -S llvm -B build -G Ninja -DLLVM_ENABLE_PROJECTS=clang -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=AArch64 -DCMAKE_INSTALL_PREFIX= + + # Intel-based + g. cmake -S llvm -B build -G Ninja -DLLVM_ENABLE_PROJECTS=clang -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_INSTALL_PREFIX= + + # Build and install + h. cmake --build build --target install + +``` + +--- + + +### Build SWIG + +```bash + a. Download the desired source code version from https://github.com/swig/swig/tags + + b. Go to the folder with uncompressed files + + c. ./autogen.sh + + # Default to /usr/local, swig command is in /usr/local/bin and swig installation is in /usr/local/share + # Use --prefix for ./configure to install to a different location + d. ./configure + + e. make + + # Uninstall previous installation using "make uninstall" + f. make install + +``` + +--- + # Install Trick @@ -342,17 +488,17 @@ make install ### Offline Mode #### (No maven) (19.1 and up) -Because java is virtual machine code and is portable, you can copy the java applications that have already been built on a different machine into your trick installation on the target machine. If trick is configured in this way, it no longer relies on maven or calls it (in the target environment only). If you know someone trustworthy who has built Trick already, they can provide the built java code to you (you can skip step 1 below). +Because Java is virtual machine code and is portable, you can copy the Java applications that have already been built on a different machine into your Trick installation on the target machine. If Trick is configured in this way, it no longer relies on maven or calls it (in the target environment only). If you know someone trustworthy who has built Trick already, they can provide the built Java code to you (you can skip step 1 below). -Trick jars are all-in-one and contain everything they need to run. You will still need maven on the machine where you build the trick java jars. +Trick jars are all-in-one and contain everything they need to run. You will still need maven on the machine where you build the Trick Java jars. -1. Pre-build your java code on a machine with trick dependencies, including maven and internet access. +1. Pre-build your Java code on a machine with Trick dependencies, including maven and internet access. ``` -# On source machine with trick dependencies, internet, and maven +# On source machine with Trick dependencies, internet, and maven cd prebuiltTrick && ./configure && make java ``` -2. Copy the java jars to the environment that you need to build trick on. They are nested in the libexec directory as specified below. The directory should be at the top level of trick, called trick/trick-offline. +2. Copy the Java jars to the environment that you need to build Trick on. They are nested in the libexec directory as specified below. The directory should be at the top level of Trick, called trick/trick-offline. ``` mkdir trick/trick-offline From b3c825d02687604520319e625900b739481abdaa Mon Sep 17 00:00:00 2001 From: Cody Martin Date: Tue, 18 Jun 2024 13:05:58 -0700 Subject: [PATCH 31/52] Fix typo in Realtime Best Practices (#1732) Remove a duplicate _frame from a plain text version of a filename --- docs/howto_guides/Realtime-Best-Practices.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/howto_guides/Realtime-Best-Practices.md b/docs/howto_guides/Realtime-Best-Practices.md index bf3b0bf7..b451d133 100644 --- a/docs/howto_guides/Realtime-Best-Practices.md +++ b/docs/howto_guides/Realtime-Best-Practices.md @@ -111,7 +111,7 @@ Frame logging records the following data files in your sim’s RUN_ directory: * [```log_frame.trk```](#log-frame-trk)
* [```log_frame_trickjobs.trk```](#log-frame-trickjobs-trk) -* [```log_frame_frame_userjobs_main.trk```](#log-frame-userjobs-main-trk) +* [```log_frame_userjobs_main.trk```](#log-frame-userjobs-main-trk) * [```log_timeline.csv```](#log-timeline-csv) * [```log_timeline_init.csv```](#log-timeline-csv) From 23b1c7d74d93ef24e9419cde57fee5e8e1cc9c1a Mon Sep 17 00:00:00 2001 From: Hong Chen Date: Wed, 19 Jun 2024 10:03:14 -0500 Subject: [PATCH 32/52] Updated the MacOS CI workflow so that bash won't exit with brew upgrade exits with non-zero exit code. --- .github/workflows/test_macos.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test_macos.yml b/.github/workflows/test_macos.yml index e07f4e45..d232eadf 100644 --- a/.github/workflows/test_macos.yml +++ b/.github/workflows/test_macos.yml @@ -23,6 +23,8 @@ jobs: - name: Install dependencies run: | # sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.15.pkg -target / + brew update + brew upgrade || true brew install --cask xquartz brew install udunits openmotif maven brew install swig From abddad8424e53db4b60253dfe90e1b68da9c5ba7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 15:22:52 -0500 Subject: [PATCH 33/52] Bump braces from 3.0.2 to 3.0.3 in /trick_source/web/dashboard (#1734) Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- trick_source/web/dashboard/package-lock.json | 26 +++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/trick_source/web/dashboard/package-lock.json b/trick_source/web/dashboard/package-lock.json index c438667a..f5ac4e85 100644 --- a/trick_source/web/dashboard/package-lock.json +++ b/trick_source/web/dashboard/package-lock.json @@ -5595,11 +5595,21 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" + }, + "dependencies": { + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "requires": { + "to-regex-range": "^5.0.1" + } + } } }, "browser-process-hrtime": { @@ -8104,14 +8114,6 @@ "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, "finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", From 7bc531273cce362d886d24e521bf1302038ab74f Mon Sep 17 00:00:00 2001 From: Mrockwell2 <120338765+Mrockwell2@users.noreply.github.com> Date: Thu, 27 Jun 2024 11:25:22 -0400 Subject: [PATCH 34/52] 1720 websocket freeze issue (#1724) * fixed web server freeze issue * Revert "fixed web server freeze issue" This reverts commit 7883453f6abcd7a13a37c254fc5ebeec2e201385. * Fixed Webserver freeze issue --------- Co-authored-by: Marcus Rockwell --- .../include/VariableServerSession.hh | 3 +++ .../CivetServer/src/VariableServerSession.cpp | 21 +++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/trick_source/web/CivetServer/include/VariableServerSession.hh b/trick_source/web/CivetServer/include/VariableServerSession.hh index 56408413..7ccfdeb6 100644 --- a/trick_source/web/CivetServer/include/VariableServerSession.hh +++ b/trick_source/web/CivetServer/include/VariableServerSession.hh @@ -13,6 +13,7 @@ PURPOSE: (Represent the state of a variable server websocket connection.) #endif #include "trick/WebSocketSession.hh" +#include "trick/Executive.hh" #include "VariableServerVariable.hh" class VariableServerSession : public WebSocketSession { @@ -38,6 +39,7 @@ class VariableServerSession : public WebSocketSession { int sendSieMessage(void); int sendUnitsMessage(const char* vname); REF2* make_error_ref(const char* in_name); + void updateNextTime(long long simTimeTics); double stageTime; bool dataStaged; @@ -45,6 +47,7 @@ class VariableServerSession : public WebSocketSession { bool cyclicSendEnabled; long long nextTime; long long intervalTimeTics; + SIM_MODE mode; }; WebSocketSession* makeVariableServerSession( struct mg_connection *nc ); diff --git a/trick_source/web/CivetServer/src/VariableServerSession.cpp b/trick_source/web/CivetServer/src/VariableServerSession.cpp index f56a8f22..6a498db3 100644 --- a/trick_source/web/CivetServer/src/VariableServerSession.cpp +++ b/trick_source/web/CivetServer/src/VariableServerSession.cpp @@ -24,6 +24,7 @@ VariableServerSession::VariableServerSession( struct mg_connection *nc ) : WebSo intervalTimeTics = exec_get_time_tic_value(); // Default time interval is one second. nextTime = 0; cyclicSendEnabled = false; + mode = Initialization; } // DESTRUCTOR @@ -31,6 +32,10 @@ VariableServerSession::~VariableServerSession() { clear(); } +void VariableServerSession::updateNextTime(long long simTimeTics) { + nextTime = (simTimeTics - (simTimeTics % intervalTimeTics) + intervalTimeTics); +} + /* Base class virtual function: marshallData When HTTP_Server::time_homogeneous is set, WebSocketSession::marshallData() is called from the main sim thread in a "top_of_frame" job, to ensure that all of @@ -41,11 +46,23 @@ VariableServerSession::~VariableServerSession() { (The specified period between messages). */ void VariableServerSession::marshallData() { - long long simulation_time_tics = exec_get_time_tics() + exec_get_freeze_time_tics(); + long long simulation_time_tics = exec_get_time_tics(); + SIM_MODE new_mode = the_exec->get_mode(); + + if(new_mode == Freeze) { + simulation_time_tics += exec_get_freeze_time_tics(); + } + + if(new_mode != mode) { + mode = new_mode; + updateNextTime(simulation_time_tics); + } + if ( cyclicSendEnabled && ( simulation_time_tics >= nextTime )) { stageValues(); - nextTime = (simulation_time_tics - (simulation_time_tics % intervalTimeTics) + intervalTimeTics); + updateNextTime(simulation_time_tics); } + } /* Base class virtual function: sendMessage From 37e273a024af43a4824ce7132f81d1a20c07e2a0 Mon Sep 17 00:00:00 2001 From: Hong Chen Date: Thu, 27 Jun 2024 10:34:44 -0500 Subject: [PATCH 35/52] Corrected .d file path for the clean target in Makefile.input file. (#1735) --- trick_source/sim_services/JITInputFile/JITInputFile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trick_source/sim_services/JITInputFile/JITInputFile.cpp b/trick_source/sim_services/JITInputFile/JITInputFile.cpp index 7447b066..71e82f82 100644 --- a/trick_source/sim_services/JITInputFile/JITInputFile.cpp +++ b/trick_source/sim_services/JITInputFile/JITInputFile.cpp @@ -147,7 +147,7 @@ int Trick::JITInputFile::compile(std::string file_name) { // rule to clean outfile << "clean:" << std::endl ; outfile << "\t rm -f " << object_fullpath_name << " " << library_fullpath_name ; - outfile << " " << command_line_args_get_output_dir() << "/" << dep_file_name << std::endl << std::endl ; + outfile << " " << dep_file_name << std::endl << std::endl ; // dependency file outfile << "-include " << dep_file_name << std::endl ; From 3fb87b8f9ce564129c545b746c8120562b56c954 Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Tue, 2 Jul 2024 09:16:04 -0500 Subject: [PATCH 36/52] ci testing --- .github/workflows/python_tests_linux.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/python_tests_linux.yml b/.github/workflows/python_tests_linux.yml index 712a2b4c..96982006 100644 --- a/.github/workflows/python_tests_linux.yml +++ b/.github/workflows/python_tests_linux.yml @@ -130,7 +130,9 @@ jobs: - cfg: { os: centos, tag: latest } pkg_mgr: dnf conf_pkg: > + grep -Ir mirrorlist /etc/yum.repos.d/CentOS-Linux-* && sed -i -e "s|mirrorlist=|#mirrorlist=|g" -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-Linux-* && + grep -Ir mirrorlist /etc/yum.repos.d/CentOS-Linux-* && dnf -y install epel-release && dnf -y update && dnf install -y 'dnf-command(config-manager)' && From 69326b627969d93d2db2922014609e6d0a382fee Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Tue, 2 Jul 2024 10:51:34 -0500 Subject: [PATCH 37/52] Change CentOS to base url --- .github/workflows/python_tests_linux.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/python_tests_linux.yml b/.github/workflows/python_tests_linux.yml index 96982006..f1bc3a78 100644 --- a/.github/workflows/python_tests_linux.yml +++ b/.github/workflows/python_tests_linux.yml @@ -125,14 +125,13 @@ jobs: python3.8-dev - cfg: { os: centos, tag: 7 } tag_deps: >- + sed -i -e "s|mirrorlist=|#mirrorlist=|g" -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-Linux-* && swig3 python-devel - cfg: { os: centos, tag: latest } pkg_mgr: dnf conf_pkg: > - grep -Ir mirrorlist /etc/yum.repos.d/CentOS-Linux-* && sed -i -e "s|mirrorlist=|#mirrorlist=|g" -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-Linux-* && - grep -Ir mirrorlist /etc/yum.repos.d/CentOS-Linux-* && dnf -y install epel-release && dnf -y update && dnf install -y 'dnf-command(config-manager)' && From 03c6729819fb28ef2d75ff5fdd71433d5a197ad6 Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Tue, 2 Jul 2024 12:18:13 -0500 Subject: [PATCH 38/52] Change CentOS to base url --- .github/workflows/python_tests_linux.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python_tests_linux.yml b/.github/workflows/python_tests_linux.yml index f1bc3a78..3fc2d136 100644 --- a/.github/workflows/python_tests_linux.yml +++ b/.github/workflows/python_tests_linux.yml @@ -105,7 +105,9 @@ jobs: #-------- CentOS Only Dependencies ---------------- - cfg: { os: centos } pkg_mgr: yum - conf_pkg: yum -y install epel-release && yum -y update + conf_pkg: > + sed -i -e "s|mirrorlist=|#mirrorlist=|g" -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-Linux-* && + yum -y install epel-release && yum -y update os_deps: >- libX11-devel libXt-devel @@ -125,7 +127,6 @@ jobs: python3.8-dev - cfg: { os: centos, tag: 7 } tag_deps: >- - sed -i -e "s|mirrorlist=|#mirrorlist=|g" -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-Linux-* && swig3 python-devel - cfg: { os: centos, tag: latest } From 47dad0028b7dc34867fe8ed4b4ec164711aef449 Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Tue, 2 Jul 2024 12:21:24 -0500 Subject: [PATCH 39/52] Change CentOS to base url --- .github/workflows/python_tests_linux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python_tests_linux.yml b/.github/workflows/python_tests_linux.yml index 3fc2d136..3cc75661 100644 --- a/.github/workflows/python_tests_linux.yml +++ b/.github/workflows/python_tests_linux.yml @@ -107,7 +107,7 @@ jobs: pkg_mgr: yum conf_pkg: > sed -i -e "s|mirrorlist=|#mirrorlist=|g" -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-Linux-* && - yum -y install epel-release && yum -y update + yum -y -v install epel-release && yum -y update os_deps: >- libX11-devel libXt-devel From 303060329845154d56a0e3a328ba03b4cf4b8a58 Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Tue, 2 Jul 2024 12:33:43 -0500 Subject: [PATCH 40/52] Change CentOS to base url --- .github/workflows/test_linux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index fbc3f314..ee7b5f19 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -95,7 +95,7 @@ jobs: - cfg: { arch: rhel, arch_ver: 7 } pkg_mgr: yum conf_pkg: | - yum -y install epel-release + yum -v -y install epel-release yum -y update yum -y install wget os_deps: >- From 2b3718e1127da84f425b946f78ab5292d1b745e1 Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Tue, 2 Jul 2024 12:36:06 -0500 Subject: [PATCH 41/52] Change CentOS to base url --- .github/workflows/python_tests_linux.yml | 4 +--- .github/workflows/test_linux.yml | 3 ++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/python_tests_linux.yml b/.github/workflows/python_tests_linux.yml index 3cc75661..712a2b4c 100644 --- a/.github/workflows/python_tests_linux.yml +++ b/.github/workflows/python_tests_linux.yml @@ -105,9 +105,7 @@ jobs: #-------- CentOS Only Dependencies ---------------- - cfg: { os: centos } pkg_mgr: yum - conf_pkg: > - sed -i -e "s|mirrorlist=|#mirrorlist=|g" -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-Linux-* && - yum -y -v install epel-release && yum -y update + conf_pkg: yum -y install epel-release && yum -y update os_deps: >- libX11-devel libXt-devel diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index ee7b5f19..9b69c5d2 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -95,7 +95,8 @@ jobs: - cfg: { arch: rhel, arch_ver: 7 } pkg_mgr: yum conf_pkg: | - yum -v -y install epel-release + sed -i -e "s|mirrorlist=|#mirrorlist=|g" -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-Linux-* && + yum -y install epel-release yum -y update yum -y install wget os_deps: >- From f3c0fbd0a66ec6b7c812c0083fc7fb657e0a3e04 Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Tue, 2 Jul 2024 12:40:53 -0500 Subject: [PATCH 42/52] CI testing --- .github/workflows/test_linux.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index 9b69c5d2..67172180 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -95,6 +95,10 @@ jobs: - cfg: { arch: rhel, arch_ver: 7 } pkg_mgr: yum conf_pkg: | + ls . + ls /etc/ + ls /etc/yum.repos.d/ + ls /etc/yum.repos.d/CentOS-Linux-* sed -i -e "s|mirrorlist=|#mirrorlist=|g" -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-Linux-* && yum -y install epel-release yum -y update From 1f6cebfc3ce9ce6b91383093362fd5668469ad08 Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Tue, 2 Jul 2024 12:42:38 -0500 Subject: [PATCH 43/52] CI testing --- .github/workflows/test_linux.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index 67172180..a177bd52 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -95,10 +95,15 @@ jobs: - cfg: { arch: rhel, arch_ver: 7 } pkg_mgr: yum conf_pkg: | + echo ----- ls . + echo ----- ls /etc/ + echo ----- ls /etc/yum.repos.d/ + echo ----- ls /etc/yum.repos.d/CentOS-Linux-* + echo ----- sed -i -e "s|mirrorlist=|#mirrorlist=|g" -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-Linux-* && yum -y install epel-release yum -y update From 7d663a7f3286651bfa625a38de8a180f4dbbbf19 Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Tue, 2 Jul 2024 12:47:00 -0500 Subject: [PATCH 44/52] CI testing --- .github/workflows/test_linux.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index a177bd52..2b5cc0b9 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -95,15 +95,7 @@ jobs: - cfg: { arch: rhel, arch_ver: 7 } pkg_mgr: yum conf_pkg: | - echo ----- - ls . - echo ----- - ls /etc/ - echo ----- ls /etc/yum.repos.d/ - echo ----- - ls /etc/yum.repos.d/CentOS-Linux-* - echo ----- sed -i -e "s|mirrorlist=|#mirrorlist=|g" -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-Linux-* && yum -y install epel-release yum -y update From 5ff32b162270f0ba2db4744539fabdc01c7acb9a Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Tue, 2 Jul 2024 13:02:36 -0500 Subject: [PATCH 45/52] CI testing --- .github/workflows/test_linux.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index 2b5cc0b9..120af713 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -95,8 +95,7 @@ jobs: - cfg: { arch: rhel, arch_ver: 7 } pkg_mgr: yum conf_pkg: | - ls /etc/yum.repos.d/ - sed -i -e "s|mirrorlist=|#mirrorlist=|g" -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-Linux-* && + sed -i -e "s|mirrorlist=|#mirrorlist=|g" -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-* && yum -y install epel-release yum -y update yum -y install wget From 03246a513710c8f1957c42e96abc52500bfd5751 Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Wed, 10 Jul 2024 09:17:58 -0500 Subject: [PATCH 46/52] CentOS 7 CI Testing --- .github/workflows/test_linux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index 120af713..e84b7d37 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -91,7 +91,7 @@ jobs: zlib-devel python2-devel python3-devel -#-------- RHEL 7-based Only Dependencies ---------------- +#-------- RHEL 7-based Only Dependencies? ---------------- - cfg: { arch: rhel, arch_ver: 7 } pkg_mgr: yum conf_pkg: | From 29cb2ad7d5155f70205ac22a08b3806a2f9b49dc Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Wed, 10 Jul 2024 11:25:58 -0500 Subject: [PATCH 47/52] Changed checkout from v3 to v4 --- .github/workflows/test_linux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index e84b7d37..c58dfbb0 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -150,7 +150,7 @@ jobs: - name: Install GTest run: ${{matrix.install_gtest}} - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Configure Trick run: | export MAKEFLAGS=-j`nproc` From d0a12c885f0d70348f1221aa3b0cb4e76cd8c999 Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Wed, 10 Jul 2024 11:32:35 -0500 Subject: [PATCH 48/52] CentOS 7 CI Testing --- .github/workflows/test_linux.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index c58dfbb0..a26fd9b6 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -150,7 +150,9 @@ jobs: - name: Install GTest run: ${{matrix.install_gtest}} - name: Checkout repository - uses: actions/checkout@v4 + uses: > + node -v + actions/checkout@v3 - name: Configure Trick run: | export MAKEFLAGS=-j`nproc` From 3686191e6ab227cc56aabe228dfbabde2480c7a6 Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Wed, 10 Jul 2024 11:52:33 -0500 Subject: [PATCH 49/52] CentOS 7 CI Testing --- .github/workflows/test_linux.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index a26fd9b6..fe9be280 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -150,9 +150,8 @@ jobs: - name: Install GTest run: ${{matrix.install_gtest}} - name: Checkout repository - uses: > - node -v - actions/checkout@v3 + uses: actions/checkout@v3 + run: node -v - name: Configure Trick run: | export MAKEFLAGS=-j`nproc` From 21458bf30ee848fded31210fac20351703255681 Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Wed, 10 Jul 2024 12:09:56 -0500 Subject: [PATCH 50/52] CentOS 7 CI Testing --- .github/workflows/test_linux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index fe9be280..91ab9510 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -104,6 +104,7 @@ jobs: libXt-devel swig3 install_gtest: | + node -v cd /tmp wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz tar xzvf release-1.8.0.tar.gz @@ -151,7 +152,6 @@ jobs: run: ${{matrix.install_gtest}} - name: Checkout repository uses: actions/checkout@v3 - run: node -v - name: Configure Trick run: | export MAKEFLAGS=-j`nproc` From 928bec15b0525e35a88420463f581fe0caa4006c Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Wed, 10 Jul 2024 14:52:50 -0500 Subject: [PATCH 51/52] CentOS 7 CI Testing --- .github/workflows/test_linux.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index 91ab9510..657ffb6f 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -11,6 +11,10 @@ on: pull_request: workflow_dispatch: +env: + ACTIONS_RUNNER_FORCE_ACTIONS_NODE_VERSION: node16 + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: strategy: @@ -104,7 +108,6 @@ jobs: libXt-devel swig3 install_gtest: | - node -v cd /tmp wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz tar xzvf release-1.8.0.tar.gz From c75a71579c0d0658fd27b9d2a6b935659a4b8644 Mon Sep 17 00:00:00 2001 From: Pherring04 Date: Wed, 10 Jul 2024 15:15:10 -0500 Subject: [PATCH 52/52] Clean up --- .github/workflows/test_linux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index 657ffb6f..135501b7 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -95,7 +95,7 @@ jobs: zlib-devel python2-devel python3-devel -#-------- RHEL 7-based Only Dependencies? ---------------- +#-------- RHEL 7-based Only Dependencies ---------------- - cfg: { arch: rhel, arch_ver: 7 } pkg_mgr: yum conf_pkg: |