diff --git a/.github/workflows/python-bindings.yml b/.github/workflows/python-bindings.yml index 55d5dd3..8b1f866 100644 --- a/.github/workflows/python-bindings.yml +++ b/.github/workflows/python-bindings.yml @@ -108,7 +108,7 @@ jobs: uses: uraimo/run-on-arch-action@v3 with: arch: riscv64 - distro: ubuntu_latest + distro: ubuntu22.04 githubToken: ${{ github.token }} install: | @@ -121,7 +121,7 @@ jobs: set -eux echo "Building for RISC-V on Ubuntu 22.04" - python3 -m pip install -r build-requirements.txt --break-system-packages + python3 -m pip install -r build-requirements.txt #--break-system-packages mkdir -p /tmp/capio_cl_jsons mkdir -p /tmp/capio_cl_tomls @@ -133,7 +133,9 @@ jobs: -Ccmake.build-type=Release \ -Ccmake.define.CAPIO_CL_BUILD_TESTS=OFF - pip install dist/*.whl --break-system-packages - python3 -m pip install -r test-requirements.txt --break-system-packages + pip install dist/*.whl #--break-system-packages + python3 -m pip install -r test-requirements.txt #--break-system-packages - pytest -v tests/python/test_* | tee pytest-riscv.log + export PYTHONUNBUFFERED=1 + pytest -vvv -s --timeout=120 --timeout-method=thread \ + tests/python/test_bindings.py tests/python/test_parser_serializer.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d4c2f9..fb5cdd4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,7 +54,7 @@ FetchContent_Declare( FetchContent_Declare( jsoncons GIT_REPOSITORY https://github.com/danielaparker/jsoncons.git - GIT_TAG v1.4.3 + GIT_TAG v1.8.1 ) set(JSONCONS_BUILD_TESTS OFF CACHE BOOL "" FORCE) diff --git a/capiocl/monitor.h b/capiocl/monitor.h index 04d6f4d..662ab89 100644 --- a/capiocl/monitor.h +++ b/capiocl/monitor.h @@ -1,6 +1,7 @@ #ifndef CAPIO_CL_MONITOR_H #define CAPIO_CL_MONITOR_H +#include #include #include #include @@ -147,7 +148,7 @@ class MulticastMonitor final : public MonitorInterface { std::string MULTICAST_HOME_NODE_ADDR; /// @brief variable to terminate execution - bool terminate = false; + std::atomic terminate = false; /// @brief Multicast poll timeout interval static constexpr int MULTICAST_THREAD_POLL_INTERVAL = 250; @@ -189,10 +190,11 @@ class MulticastMonitor final : public MonitorInterface { * @param lock Mutex protecting shared access to committed_files. * @param ip_addr Multicast commit listen address. * @param ip_port Multicast commit listen port. - * @param terminate Boolean flag to terminate thread + * @param terminate Atomic Boolean flag to terminate thread */ static void commit_listener(std::vector &committed_files, std::mutex &lock, - const std::string &ip_addr, int ip_port, const bool *terminate); + const std::string &ip_addr, int ip_port, + const std::atomic *terminate); /** * @brief Background thread function to listen for commit messages. @@ -205,10 +207,11 @@ class MulticastMonitor final : public MonitorInterface { * @param lock Mutex protecting shared access to committed_files. * @param ip_addr Multicast home node listen address. * @param ip_port Multicast home node listen port. + * @param terminate Atomic Boolean flag to terminate thread */ static void home_node_listener(std::unordered_map &home_nodes, std::mutex &lock, const std::string &ip_addr, int ip_port, - const bool *terminate); + const std::atomic *terminate); public: /** diff --git a/src/Parser.cpp b/src/Parser.cpp index 291f0f6..cc612ea 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -36,7 +36,7 @@ void capiocl::parser::Parser::validate_json(const jsoncons::json &doc, const cha jsoncons::jsonschema::json_schema schema = loadSchema(str_schema); try { // throws jsoncons::jsonschema::validation_error on failure - [[maybe_unused]] auto status = schema.validate(doc); + schema.validate(doc); } catch (const jsoncons::jsonschema::validation_error &e) { printer::print(printer::CLI_LEVEL_ERROR, e.what()); throw ParserException("JSON validation failed!"); diff --git a/src/monitors/Multicast.cpp b/src/monitors/Multicast.cpp index 29c05b3..1f82fc3 100644 --- a/src/monitors/Multicast.cpp +++ b/src/monitors/Multicast.cpp @@ -78,7 +78,8 @@ static int incoming_socket_multicast(const std::string &address_ip, const int po void capiocl::monitor::MulticastMonitor::commit_listener(std::vector &committed_files, std::mutex &lock, const std::string &ip_addr, - const int ip_port, const bool *terminate) { + const int ip_port, + const std::atomic *terminate) { pthread_setcancelstate(PTHREAD_CANCEL_ASYNCHRONOUS, nullptr); sockaddr_in addr_in = {}; socklen_t addr_len = {}; @@ -134,7 +135,7 @@ void capiocl::monitor::MulticastMonitor::commit_listener(std::vector &home_nodes, std::mutex &lock, - const std::string &ip_addr, int ip_port, const bool *terminate) { + const std::string &ip_addr, int ip_port, const std::atomic *terminate) { pthread_setcancelstate(PTHREAD_CANCEL_ASYNCHRONOUS, nullptr); char this_hostname[HOST_NAME_MAX] = {}; @@ -168,7 +169,7 @@ void capiocl::monitor::MulticastMonitor::home_node_listener( } // LCOV_EXCL_START - if (recvfrom(socket, incoming_message, MESSAGE_SIZE, 0, addr, &addr_len) < 0) { + if (recvfrom(socket, incoming_message, MESSAGE_SIZE, MSG_DONTWAIT, addr, &addr_len) < 0) { continue; } // LCOV_EXCL_STOP @@ -244,11 +245,12 @@ capiocl::monitor::MulticastMonitor::~MulticastMonitor() { terminate = true; - pthread_cancel(commit_thread.native_handle()); - commit_thread.join(); - - pthread_cancel(home_node_thread.native_handle()); - home_node_thread.join(); + if (commit_thread.joinable()) { + commit_thread.join(); + } + if (home_node_thread.joinable()) { + home_node_thread.join(); + } } bool capiocl::monitor::MulticastMonitor::isCommitted(const std::filesystem::path &path) const { diff --git a/test-requirements.txt b/test-requirements.txt index ca2a549..e525ef5 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1 +1,2 @@ -pytest==8.4.2 \ No newline at end of file +pytest==8.4.2 +pytest-timeout==2.4.0 \ No newline at end of file