diff --git a/include/hxcomm/common/execute_messages.h b/include/hxcomm/common/execute_messages.h index cba23dfb5e2cac4184080a5e11fd29308766592e..6ae0aea32e2bb9d4dfce6afcd7cf2fa66b145ef7 100644 --- a/include/hxcomm/common/execute_messages.h +++ b/include/hxcomm/common/execute_messages.h @@ -41,7 +41,8 @@ struct ExecutorMessages hate::is_detected_v<ConnectionConcept, connection_type>, "Connection does not adhere to ConnectionConcept."); - return_type operator()(connection_type& conn, messages_type const& messages) + return_type operator()( + connection_type& conn, messages_type const& messages, bool const keep_responses) { Stream<connection_type> stream(conn); auto const time_begin = conn.get_time_info(); @@ -52,9 +53,14 @@ struct ExecutorMessages stream.run_until_halt(); - auto const responses = stream.receive_all(); - auto const time_difference = conn.get_time_info() - time_begin; - return {responses, time_difference}; + if (keep_responses) { + auto const time_difference = conn.get_time_info() - time_begin; + return {{}, time_difference}; + } else { + auto const responses = stream.receive_all(); + auto const time_difference = conn.get_time_info() - time_begin; + return {responses, time_difference}; + } } }; @@ -74,9 +80,12 @@ struct ExecutorMessages */ template <typename Connection, ConnectionIsPlainGuard<Connection> = 0> detail::execute_messages_return_t<Connection> execute_messages( - Connection& connection, detail::execute_messages_argument_t<Connection> const& messages) + Connection& connection, + detail::execute_messages_argument_t<Connection> const& messages, + bool const keep_responses = false) { - auto const [res, time] = detail::ExecutorMessages<Connection>()(connection, messages); + auto const [res, time] = + detail::ExecutorMessages<Connection>()(connection, messages, keep_responses); [[maybe_unused]] log4cxx::LoggerPtr log = log4cxx::Logger::getLogger("hxcomm.execute_messages"); HXCOMM_LOG_INFO( log, "Executed messages(" << messages.size() << ") and got responses(" << res.size() @@ -87,10 +96,14 @@ detail::execute_messages_return_t<Connection> execute_messages( template <typename Connection, ConnectionIsWrappedGuard<Connection> = 0> detail::execute_messages_return_t<Connection> execute_messages( - Connection&& connection, detail::execute_messages_argument_t<Connection> const& messages) + Connection&& connection, + detail::execute_messages_argument_t<Connection> const& messages, + bool const keep_responses = false) { return hxcomm::visit_connection( - [&messages](auto& conn) -> decltype(auto) { return execute_messages(conn, messages); }, + [&messages, keep_responses](auto& conn) -> decltype(auto) { + return execute_messages(conn, messages, keep_responses); + }, std::forward<Connection>(connection)); } diff --git a/include/hxcomm/common/quiggeldy_connection.tcc b/include/hxcomm/common/quiggeldy_connection.tcc index 654c1e24e755ad011795cd50f5a55e9fc09addd7..06befaa617ae410094e8f97d179ba6a3df19a3f5 100644 --- a/include/hxcomm/common/quiggeldy_connection.tcc +++ b/include/hxcomm/common/quiggeldy_connection.tcc @@ -65,8 +65,12 @@ struct ExecutorMessages<hxcomm::QuiggeldyConnection<ConnectionParameters, RcfCli using response_type = typename connection_type::interface_types::response_type; using request_type = typename connection_type::interface_types::request_type; - response_type operator()(connection_type& conn, request_type const& messages) + response_type operator()( + connection_type& conn, request_type const& messages, bool const keep_responses) { + if (keep_responses) { + throw std::logic_error("Keeping responses not supported for QuiggeldyConnection."); + } StreamRC<connection_type> stream(conn); return stream.submit_blocking(messages); } diff --git a/include/hxcomm/common/quiggeldy_worker.tcc b/include/hxcomm/common/quiggeldy_worker.tcc index fba7423ce7f98e66e2f0430b617ffb10f60a529f..0efc48eef7d5ade543e368f3e971f88da7b2739d 100644 --- a/include/hxcomm/common/quiggeldy_worker.tcc +++ b/include/hxcomm/common/quiggeldy_worker.tcc @@ -267,7 +267,7 @@ void QuiggeldyWorker<Connection>::perform_reinit(reinit_type& reinit, bool force try { for (auto& entry : reinit) { if (entry.reinit_pending || force) { - execute_messages(*m_connection, entry.request); + execute_messages(*m_connection, entry.request, true); entry.reinit_pending = false; } } diff --git a/include/hxcomm/common/reinit_stack_entry_impl.tcc b/include/hxcomm/common/reinit_stack_entry_impl.tcc index 3dc3f720efd18b6f43dbac9d5d811fac4d03f4d0..7bbb76d757bb69a0b42f055cbca426f272d77f68 100644 --- a/include/hxcomm/common/reinit_stack_entry_impl.tcc +++ b/include/hxcomm/common/reinit_stack_entry_impl.tcc @@ -118,7 +118,7 @@ void ReinitStackEntry<QuiggeldyConnection, ConnectionVariant>::handle_unsupporte m_logger, "Connection does not support upload of reinit program, treating enforced " "reinit-like regular program to execute."); std::visit( - [&entry](auto& conn) { execute_messages(conn.get(), entry.request); }, + [&entry](auto& conn) { execute_messages(conn.get(), entry.request, true); }, m_connection_ref); } else { HXCOMM_LOG_TRACE( diff --git a/pyhxcomm/tests/sw/test-managed_connection.cpp b/pyhxcomm/tests/sw/test-managed_connection.cpp index f7b3e911626a7b08dd2e30152564319ba26a8991..b8c688422e1ece9b896eee182039d1b15362673b 100644 --- a/pyhxcomm/tests/sw/test-managed_connection.cpp +++ b/pyhxcomm/tests/sw/test-managed_connection.cpp @@ -55,7 +55,7 @@ struct ExecutorMessages<RefCounter> using return_type = execute_messages_return_t<connection_type>; using messages_type = execute_messages_argument_t<connection_type>; - return_type operator()(RefCounter&, messages_type const&) + return_type operator()(RefCounter&, messages_type const&, bool const) { return return_type(); }