From 48924d585a981113e5ddaef3dfdf92fd7c1e1744 Mon Sep 17 00:00:00 2001 From: Thomas Brain Date: Wed, 27 Mar 2024 14:20:58 -0500 Subject: [PATCH 1/2] python3 GIL locking solution (#1675) * Implemented use of the python GIL API to replace the less portable mutex solution. * Replaced nullptr with NULL --------- Co-authored-by: Thomas Brain --- include/trick/IPPython.hh | 4 --- .../sim_services/InputProcessor/IPPython.cpp | 31 ++++++++++++------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/include/trick/IPPython.hh b/include/trick/IPPython.hh index 6174049a3..5e9a84672 100644 --- a/include/trick/IPPython.hh +++ b/include/trick/IPPython.hh @@ -17,7 +17,6 @@ #define IPPYTHON_HH #include -#include #include "trick/InputProcessor.hh" namespace Trick { @@ -36,9 +35,6 @@ namespace Trick { /** Returned value from event condition evaluation.\n */ int return_val ; /**< trick_io(**) trick_units(--) */ - /** Input processor mutex for protection for var server and event processing.\n */ - pthread_mutex_t ip_mutex; /**< trick_io(**) trick_units(--) */ - /** @brief Constructor. */ diff --git a/trick_source/sim_services/InputProcessor/IPPython.cpp b/trick_source/sim_services/InputProcessor/IPPython.cpp index ce0b1c280..0ecafeea7 100644 --- a/trick_source/sim_services/InputProcessor/IPPython.cpp +++ b/trick_source/sim_services/InputProcessor/IPPython.cpp @@ -12,10 +12,10 @@ #include #include #include -#include #include #include #include +#include #include "trick/IPPython.hh" #include "trick/MemoryManager.hh" @@ -31,6 +31,10 @@ Trick::IPPython::IPPython() : Trick::InputProcessor::InputProcessor() , units_co return ; } + +// Need to save the state of the main thread to allow child threads to run PyRun variants. +static PyThreadState *_save = NULL; + /** @details -# Loops through all of the memorymanager allocations testing if a name handle was given. @@ -62,7 +66,9 @@ void Trick::IPPython::get_TMM_named_variables() { ss << "trick.castAs" << user_type_name << "(int(" << alloc_info->start << "))" << std::endl ; ss << "except AttributeError:" << std::endl ; ss << " pass" << std::endl ; + PyGILState_STATE gstate = PyGILState_Ensure(); PyRun_SimpleString(ss.str().c_str()) ; + PyGILState_Release(gstate); } } } @@ -84,12 +90,6 @@ int Trick::IPPython::init() { FILE *input_fp ; int ret ; std::string error_message ; - pthread_mutexattr_t m_attr ; - - /* Initialize a mutex to protect python processing for var server and events. */ - pthread_mutexattr_init(&m_attr) ; - pthread_mutexattr_settype(&m_attr, PTHREAD_MUTEX_RECURSIVE) ; - pthread_mutex_init(&ip_mutex , &m_attr) ; // Run Py_Initialze first for python 2.x #if PY_VERSION_HEX < 0x03000000 @@ -104,6 +104,7 @@ int Trick::IPPython::init() { Py_Initialize(); #endif + // The following PyRun_ calls do not require the PyGILState guards because no threads are launched /* Import simulation specific routines into interpreter. */ PyRun_SimpleString( "import sys\n" @@ -149,18 +150,21 @@ int Trick::IPPython::init() { } fclose(input_fp) ; - return(0) ; + // Release the GIL from the main thread. + Py_UNBLOCK_THREADS + + return(0) ; } //Command to parse the given string. int Trick::IPPython::parse(std::string in_string) { int ret ; - pthread_mutex_lock(&ip_mutex); in_string += "\n" ; + PyGILState_STATE gstate = PyGILState_Ensure(); ret = PyRun_SimpleString(in_string.c_str()) ; - pthread_mutex_unlock(&ip_mutex); + PyGILState_Release(gstate); return ret ; @@ -181,12 +185,12 @@ int Trick::IPPython::parse(std::string in_string) { */ int Trick::IPPython::parse_condition(std::string in_string, int & cond_return_val ) { - pthread_mutex_lock(&ip_mutex); in_string = std::string("trick_ip.ip.return_val = ") + in_string + "\n" ; // Running the simple string will set return_val. + PyGILState_STATE gstate = PyGILState_Ensure(); int py_ret = PyRun_SimpleString(in_string.c_str()) ; + PyGILState_Release(gstate); cond_return_val = return_val ; - pthread_mutex_unlock(&ip_mutex); return py_ret ; @@ -200,7 +204,10 @@ int Trick::IPPython::restart() { } int Trick::IPPython::shutdown() { + if ( Py_IsInitialized() ) { + // Obtain the GIL so that we can shut down properly + Py_BLOCK_THREADS Py_Finalize(); } return(0) ; From 209984255ec0c96fe646633a2d2a471a60ac08c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 14:32:56 -0500 Subject: [PATCH 2/2] Bump express from 4.18.2 to 4.19.2 in /trick_source/web/dashboard (#1678) Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express 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 | 112 ++++++++----------- 1 file changed, 45 insertions(+), 67 deletions(-) diff --git a/trick_source/web/dashboard/package-lock.json b/trick_source/web/dashboard/package-lock.json index 0f365799a..588d82899 100644 --- a/trick_source/web/dashboard/package-lock.json +++ b/trick_source/web/dashboard/package-lock.json @@ -5569,45 +5569,6 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, "bonjour-service": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", @@ -6082,11 +6043,6 @@ "safe-buffer": "~5.1.1" } }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -7898,16 +7854,16 @@ } }, "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -7940,6 +7896,35 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -7953,6 +7938,17 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -14186,24 +14182,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - } - } - }, "react": { "version": "16.8.6", "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz",