diff --git a/src/modes/tester.cpp b/src/modes/tester.cpp index 04ad836..3bcfc74 100644 --- a/src/modes/tester.cpp +++ b/src/modes/tester.cpp @@ -105,8 +105,9 @@ void test_mode::data_sender(kcp_mappings *kcp_mappings_ptr, std::unique_ptr egress_forwarder = std::atomic_load(&(kcp_mappings_ptr->egress_forwarder)); if (egress_forwarder == nullptr || !error_message.empty() || cipher_size == 0) return; - std::shared_ptr egress_target_endpoint = std::atomic_load(&(kcp_mappings_ptr->egress_target_endpoint)); - egress_forwarder->async_send_out(std::move(new_buffer), cipher_size, *egress_target_endpoint); + //std::shared_ptr egress_target_endpoint_ptr = std::atomic_load(&(kcp_mappings_ptr->egress_target_endpoint)); + udp::endpoint egress_target_endpoint = *std::atomic_load(&(kcp_mappings_ptr->egress_target_endpoint)); + egress_forwarder->async_send_out(std::move(new_buffer), cipher_size, egress_target_endpoint); } std::unique_ptr test_mode::get_udp_target(std::shared_ptr target_connector, size_t index) @@ -262,16 +263,21 @@ void test_mode::handshake_test_failure(kcp_mappings *handshake_ptr) void test_mode::handshake_test_cleanup(kcp_mappings *handshake_ptr) { std::shared_ptr egress_forwarder = std::atomic_load(&(handshake_ptr->egress_forwarder)); +#if __GNUC__ == 12 && __GNUC_MINOR__ < 3 + handshake_ptr->egress_forwarder.store(nullptr); +#else + handshake_ptr->egress_forwarder = nullptr; +#endif egress_forwarder->remove_callback(); egress_forwarder->stop(); - - std::scoped_lock lock_handshake{ mutex_handshakes }; + std::unique_lock lock_handshake{ mutex_handshakes }; auto session_iter = handshakes.find(handshake_ptr); if (session_iter == handshakes.end()) return; if (session_iter->second != nullptr) kcp_updater.remove(handshake_ptr->egress_kcp); handshakes.erase(session_iter); + lock_handshake.unlock(); } void test_mode::handle_handshake(std::shared_ptr kcp_ptr, std::unique_ptr data, size_t data_size, udp::endpoint peer, asio::ip::port_type local_port_number) diff --git a/src/networks/connections.hpp b/src/networks/connections.hpp index f1b433a..4bdf417 100644 --- a/src/networks/connections.hpp +++ b/src/networks/connections.hpp @@ -639,25 +639,25 @@ struct kcp_mappings : public std::enable_shared_from_this { protocol_type connection_protocol; #ifdef __cpp_lib_atomic_shared_ptr - std::atomic> ingress_source_endpoint; - std::atomic> egress_target_endpoint; - std::atomic> egress_previous_target_endpoint; + alignas(64) std::atomic> ingress_source_endpoint; + alignas(64) std::atomic> egress_target_endpoint; + alignas(64) std::atomic> egress_previous_target_endpoint; #else - std::shared_ptr ingress_source_endpoint; - std::shared_ptr egress_target_endpoint; - std::shared_ptr egress_previous_target_endpoint; + alignas(64) std::shared_ptr ingress_source_endpoint; + alignas(64) std::shared_ptr egress_target_endpoint; + alignas(64) std::shared_ptr egress_previous_target_endpoint; #endif - std::atomic egress_endpoint_index; - std::shared_ptr ingress_kcp; - std::shared_ptr egress_kcp; + alignas(64) std::atomic egress_endpoint_index; + alignas(64) std::shared_ptr ingress_kcp; + alignas(64) std::shared_ptr egress_kcp; alignas(64) std::atomic ingress_listener; #ifdef __cpp_lib_atomic_shared_ptr - std::atomic> egress_forwarder; + alignas(64) std::atomic> egress_forwarder; #else - std::shared_ptr egress_forwarder; + alignas(64) std::shared_ptr egress_forwarder; #endif - std::shared_ptr local_tcp; - std::shared_ptr local_udp; + alignas(64) std::shared_ptr local_tcp; + alignas(64) std::shared_ptr local_udp; alignas(64) std::atomic handshake_setup_time; alignas(64) std::atomic last_data_transfer_time; alignas(64) std::atomic hopping_timestamp;