From 36e64cbcb32eaf0241e16d8271078969186914ba Mon Sep 17 00:00:00 2001 From: Morcules Date: Fri, 23 Jan 2026 22:20:14 +0100 Subject: [PATCH 1/2] Added conditional thread sleeping to process_packets.c --- src/3 | 83 +++++++++++++++++++++++ src/cleanup_connection.c | 29 ++++++++ src/handle_packets.c | 33 +++++++-- src/initialize_client_socket.c | 6 ++ src/initialize_server_socket.c | 6 ++ src/initialize_swift_net.c | 2 + src/internal/internal.h | 2 + src/process_packets.c | 16 ++++- src/swift_net.h | 9 +++ tests/integration_tests/output/run_tests | Bin 163528 -> 164280 bytes 10 files changed, 179 insertions(+), 7 deletions(-) create mode 100644 src/3 diff --git a/src/3 b/src/3 new file mode 100644 index 0000000..de8d478 --- /dev/null +++ b/src/3 @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "internal/internal.h" +#include "swift_net.h" + +static inline struct SwiftNetServer* const construct_server(const bool loopback, const uint16_t server_port, pcap_t* const pcap) { + struct SwiftNetServer* const new_server = allocator_allocate(&server_memory_allocator); + + struct ether_header eth_header = { + .ether_dhost = {0xff,0xff,0xff,0xff,0xff,0xff}, + .ether_type = htons(0x0800) + }; + + memcpy(eth_header.ether_shost, mac_address, sizeof(eth_header.ether_shost)); + + new_server->eth_header = eth_header; + new_server->server_port = server_port; + new_server->loopback = loopback; + new_server->pcap = pcap; + new_server->addr_type = pcap_datalink(pcap); + new_server->prepend_size = PACKET_PREPEND_SIZE(new_server->addr_type); + new_server->packet_queue = (struct PacketQueue){ + .first_node = NULL, + .last_node = NULL + }; + + memset(&new_server->packet_callback_queue, 0x00, sizeof(struct PacketCallbackQueue)); + + atomic_store_explicit(&new_server->packet_queue.owner, NONE, memory_order_release); + atomic_store_explicit(&new_server->packet_callback_queue.owner, NONE, memory_order_release); + atomic_store_explicit(&new_server->packet_handler, NULL, memory_order_release); + atomic_store_explicit(&new_server->packet_handler_user_arg, NULL, memory_order_release); + atomic_store_explicit(&new_server->closing, false, memory_order_release); + + new_server->pending_messages_memory_allocator = allocator_create(sizeof(struct SwiftNetPendingMessage), 100); + new_server->pending_messages = vector_create(100); + new_server->packets_sending_memory_allocator = allocator_create(sizeof(struct SwiftNetPacketSending), 100); + new_server->packets_sending = vector_create(100); + new_server->packets_completed_memory_allocator = allocator_create(sizeof(struct SwiftNetPacketCompleted), 100); + new_server->packets_completed = vector_create(100); + + return new_server; +} + +struct SwiftNetServer* swiftnet_create_server(const uint16_t port, const bool loopback) { + // Init pcap device + pcap_t* const pcap = swiftnet_pcap_open(loopback ? LOOPBACK_INTERFACE_NAME : default_network_interface); + if (unlikely(pcap == NULL)) { + PRINT_ERROR("Failed to open bpf"); + return NULL; + } + + struct SwiftNetServer* const new_server = construct_server(loopback, port, pcap); + + // Create a new thread that will handle all packets received + check_existing_listener(loopback ? LOOPBACK_INTERFACE_NAME : default_network_interface, new_server, CONNECTION_TYPE_SERVER, loopback); + + pthread_create(&new_server->process_packets_thread, NULL, swiftnet_server_process_packets, new_server); + pthread_create(&new_server->execute_callback_thread, NULL, execute_packet_callback_server, new_server); + + pthread_mutex_init(&new_server->process_packets_mtx, NULL); + pthread_mutex_init(&new_server->execute_callback_mtx, NULL); + + pthread_cond_init(&new_server->process_packets_cond, NULL); + + #ifdef SWIFT_NET_DEBUG + if (check_debug_flag(INITIALIZATION)) { + send_debug_message("Successfully initialized server\n"); + } + #endif + + return new_server; +} diff --git a/src/cleanup_connection.c b/src/cleanup_connection.c index fc52b3d..ea1eff8 100644 --- a/src/cleanup_connection.c +++ b/src/cleanup_connection.c @@ -2,6 +2,7 @@ #include "swift_net.h" #include #include +#include #include static inline void cleanup_connection_resources(const enum ConnectionType connection_type, void* const connection) { @@ -83,15 +84,43 @@ static inline void close_threads(const enum ConnectionType connection_type, void atomic_store_explicit(&client->closing, true, memory_order_release); + pthread_mutex_lock(&client->process_packets_mtx); + pthread_cond_signal(&client->process_packets_cond); + pthread_mutex_unlock(&client->process_packets_mtx); + + pthread_mutex_lock(&client->execute_callback_mtx); + pthread_cond_signal(&client->execute_callback_cond); + pthread_mutex_unlock(&client->execute_callback_mtx); + pthread_join(client->process_packets_thread, NULL); pthread_join(client->execute_callback_thread, NULL); + + pthread_mutex_destroy(&client->process_packets_mtx); + pthread_mutex_destroy(&client->execute_callback_mtx); + + pthread_cond_destroy(&client->process_packets_cond); + pthread_cond_destroy(&client->execute_callback_cond); } else { struct SwiftNetServer* const server = connection; atomic_store_explicit(&server->closing, true, memory_order_release); + pthread_mutex_lock(&server->process_packets_mtx); + pthread_cond_signal(&server->process_packets_cond); + pthread_mutex_unlock(&server->process_packets_mtx); + + pthread_mutex_lock(&server->execute_callback_mtx); + pthread_cond_signal(&server->execute_callback_cond); + pthread_mutex_unlock(&server->execute_callback_mtx); + pthread_join(server->process_packets_thread, NULL); pthread_join(server->execute_callback_thread, NULL); + + pthread_mutex_destroy(&server->process_packets_mtx); + pthread_mutex_destroy(&server->execute_callback_mtx); + + pthread_cond_destroy(&server->process_packets_cond); + pthread_cond_destroy(&server->execute_callback_cond); } } diff --git a/src/handle_packets.c b/src/handle_packets.c index 9771c65..440b94d 100644 --- a/src/handle_packets.c +++ b/src/handle_packets.c @@ -21,7 +21,12 @@ static inline void unlock_packet_queue(struct PacketQueue* const packet_queue) { atomic_store_explicit(&packet_queue->owner, NONE, memory_order_release); } -static inline void insert_queue_node(struct PacketQueueNode* const new_node, struct PacketQueue* const packet_queue, const enum ConnectionType contype) { +static inline void insert_queue_node( + struct PacketQueueNode* const new_node, + struct PacketQueue* const packet_queue, + const enum ConnectionType contype + +) { if(new_node == NULL) { return; } @@ -60,7 +65,21 @@ static inline struct PacketQueueNode* construct_node(const uint32_t data_read, v return node; } -static inline void swiftnet_handle_packets(const uint16_t source_port, pthread_t* const process_packets_thread, void* connection, const enum ConnectionType connection_type, struct PacketQueue* const packet_queue, const _Atomic bool* closing, const bool loopback, const uint16_t addr_type, const struct pcap_pkthdr* hdr, const uint8_t* packet) { +static inline void swiftnet_handle_packets( + const uint16_t source_port, + pthread_t* const process_packets_thread, + void* connection, + const enum ConnectionType connection_type, + struct PacketQueue* const packet_queue, + const _Atomic bool* closing, + const bool loopback, + const uint16_t addr_type, + const struct pcap_pkthdr* hdr, + const uint8_t* packet, + pthread_mutex_t* const process_packets_mtx, + pthread_cond_t* const process_packets_cond + +) { uint8_t* const packet_buffer = allocator_allocate(&packet_buffer_memory_allocator); if (unlikely(packet_buffer == NULL)) { return; @@ -94,7 +113,13 @@ static inline void swiftnet_handle_packets(const uint16_t source_port, pthread_t atomic_thread_fence(memory_order_release); + pthread_mutex_lock(process_packets_mtx); + insert_queue_node(node, packet_queue, connection_type); + + pthread_cond_signal(process_packets_cond); + + pthread_mutex_unlock(process_packets_mtx); } static void handle_client_init(struct SwiftNetClientConnection* user, const struct pcap_pkthdr* hdr, const uint8_t* buffer) { @@ -161,7 +186,7 @@ static inline void handle_correct_receiver(const enum ConnectionType connection_ if (client_connection->initialized == false) { handle_client_init(client_connection, hdr, packet); } else { - swiftnet_handle_packets(client_connection->port_info.source_port, &client_connection->process_packets_thread, client_connection, CONNECTION_TYPE_CLIENT, &client_connection->packet_queue, &client_connection->closing, client_connection->loopback, client_connection->addr_type, hdr, packet); + swiftnet_handle_packets(client_connection->port_info.source_port, &client_connection->process_packets_thread, client_connection, CONNECTION_TYPE_CLIENT, &client_connection->packet_queue, &client_connection->closing, client_connection->loopback, client_connection->addr_type, hdr, packet, &client_connection->process_packets_mtx, &client_connection->process_packets_cond); } return; @@ -177,7 +202,7 @@ static inline void handle_correct_receiver(const enum ConnectionType connection_ if (server->server_port == port_info->destination_port) { vector_unlock(&listener->servers); - swiftnet_handle_packets(server->server_port, &server->process_packets_thread, server, CONNECTION_TYPE_SERVER, &server->packet_queue, &server->closing, server->loopback, server->addr_type, hdr, packet); + swiftnet_handle_packets(server->server_port, &server->process_packets_thread, server, CONNECTION_TYPE_SERVER, &server->packet_queue, &server->closing, server->loopback, server->addr_type, hdr, packet, &server->process_packets_mtx, &server->process_packets_cond); return; } diff --git a/src/initialize_client_socket.c b/src/initialize_client_socket.c index 908ac89..c8ed22f 100644 --- a/src/initialize_client_socket.c +++ b/src/initialize_client_socket.c @@ -179,6 +179,12 @@ struct SwiftNetClientConnection* swiftnet_create_client(const char* const ip_add pthread_create(&new_connection->process_packets_thread, NULL, swiftnet_client_process_packets, new_connection); pthread_create(&new_connection->execute_callback_thread, NULL, execute_packet_callback_client, new_connection); + pthread_mutex_init(&new_connection->process_packets_mtx, NULL); + pthread_mutex_init(&new_connection->execute_callback_mtx, NULL); + + pthread_cond_init(&new_connection->process_packets_cond, NULL); + pthread_cond_init(&new_connection->execute_callback_cond, NULL); + #ifdef SWIFT_NET_DEBUG if (check_debug_flag(INITIALIZATION)) { send_debug_message("Successfully initialized client\n"); diff --git a/src/initialize_server_socket.c b/src/initialize_server_socket.c index 5b571d3..8540ef6 100644 --- a/src/initialize_server_socket.c +++ b/src/initialize_server_socket.c @@ -68,6 +68,12 @@ struct SwiftNetServer* swiftnet_create_server(const uint16_t port, const bool lo pthread_create(&new_server->process_packets_thread, NULL, swiftnet_server_process_packets, new_server); pthread_create(&new_server->execute_callback_thread, NULL, execute_packet_callback_server, new_server); + pthread_mutex_init(&new_server->process_packets_mtx, NULL); + pthread_mutex_init(&new_server->execute_callback_mtx, NULL); + + pthread_cond_init(&new_server->process_packets_cond, NULL); + pthread_cond_init(&new_server->execute_callback_cond, NULL); + #ifdef SWIFT_NET_DEBUG if (check_debug_flag(INITIALIZATION)) { send_debug_message("Successfully initialized server\n"); diff --git a/src/initialize_swift_net.c b/src/initialize_swift_net.c index 7fe8fef..5daf8eb 100644 --- a/src/initialize_swift_net.c +++ b/src/initialize_swift_net.c @@ -18,6 +18,8 @@ uint32_t items_leaked = 0; #endif +uint32_t semaphore_counter = 0x00; + uint32_t maximum_transmission_unit = 0x00; struct in_addr private_ip_address; uint8_t mac_address[6]; diff --git a/src/internal/internal.h b/src/internal/internal.h index 9787591..0410220 100644 --- a/src/internal/internal.h +++ b/src/internal/internal.h @@ -184,6 +184,8 @@ extern void* check_existing_listener(const char* interface_name, void* const con #define ALLOCATOR_STACK_OCCUPIED 1 #define ALLOCATOR_STACK_FREE 0 +extern uint32_t semaphore_counter; + extern struct SwiftNetMemoryAllocator allocator_create(const uint32_t item_size, const uint32_t chunk_item_amount); extern void* allocator_allocate(struct SwiftNetMemoryAllocator* const memory_allocator); extern void allocator_free(struct SwiftNetMemoryAllocator* const memory_allocator, void* const memory_location); diff --git a/src/process_packets.c b/src/process_packets.c index 265ac43..541b25d 100644 --- a/src/process_packets.c +++ b/src/process_packets.c @@ -325,18 +325,28 @@ static inline void swiftnet_process_packets( struct PacketCallbackQueue* const packet_callback_queue, void* const connection, _Atomic bool* closing, - const uint8_t prepend_size + const uint8_t prepend_size, + pthread_mutex_t* const process_packets_mtx, + pthread_cond_t* const process_packets_cond ) { while(1) { if (atomic_load(closing) == true) { break; } + pthread_mutex_lock(process_packets_mtx); + struct PacketQueueNode* const node = wait_for_next_packet(packet_queue); if(node == NULL) { + pthread_cond_wait(process_packets_cond, process_packets_mtx); + + pthread_mutex_unlock(process_packets_mtx); + continue; } + pthread_mutex_unlock(process_packets_mtx); + atomic_thread_fence(memory_order_acquire); uint8_t* const packet_buffer = node->data; @@ -738,7 +748,7 @@ static inline void swiftnet_process_packets( void* swiftnet_server_process_packets(void* const void_server) { struct SwiftNetServer* const server = (struct SwiftNetServer*)void_server; - swiftnet_process_packets((void*)&server->packet_handler, server->pcap, server->eth_header, server->server_port, server->loopback, server->addr_type, &server->packets_sending, &server->packets_sending_memory_allocator, &server->pending_messages, &server->pending_messages_memory_allocator, &server->packets_completed, &server->packets_completed_memory_allocator, CONNECTION_TYPE_SERVER, &server->packet_queue, &server->packet_callback_queue, server, &server->closing, server->prepend_size); + swiftnet_process_packets((void*)&server->packet_handler, server->pcap, server->eth_header, server->server_port, server->loopback, server->addr_type, &server->packets_sending, &server->packets_sending_memory_allocator, &server->pending_messages, &server->pending_messages_memory_allocator, &server->packets_completed, &server->packets_completed_memory_allocator, CONNECTION_TYPE_SERVER, &server->packet_queue, &server->packet_callback_queue, server, &server->closing, server->prepend_size, &server->process_packets_mtx, &server->process_packets_cond); return NULL; } @@ -746,7 +756,7 @@ void* swiftnet_server_process_packets(void* const void_server) { void* swiftnet_client_process_packets(void* const void_client) { struct SwiftNetClientConnection* const client = (struct SwiftNetClientConnection*)void_client; - swiftnet_process_packets((void*)&client->packet_handler, client->pcap, client->eth_header, client->port_info.source_port, client->loopback, client->addr_type, &client->packets_sending, &client->packets_sending_memory_allocator, &client->pending_messages, &client->pending_messages_memory_allocator, &client->packets_completed, &client->packets_completed_memory_allocator, CONNECTION_TYPE_CLIENT, &client->packet_queue, &client->packet_callback_queue, client, &client->closing, client->prepend_size); + swiftnet_process_packets((void*)&client->packet_handler, client->pcap, client->eth_header, client->port_info.source_port, client->loopback, client->addr_type, &client->packets_sending, &client->packets_sending_memory_allocator, &client->pending_messages, &client->pending_messages_memory_allocator, &client->packets_completed, &client->packets_completed_memory_allocator, CONNECTION_TYPE_CLIENT, &client->packet_queue, &client->packet_callback_queue, client, &client->closing, client->prepend_size, &client->process_packets_mtx, &client->process_packets_cond); return NULL; } diff --git a/src/swift_net.h b/src/swift_net.h index d650cf6..d4d3fbd 100644 --- a/src/swift_net.h +++ b/src/swift_net.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -235,7 +236,11 @@ struct SwiftNetClientConnection { uint16_t addr_type; bool loopback; pthread_t process_packets_thread; + pthread_mutex_t process_packets_mtx; + pthread_cond_t process_packets_cond; pthread_t execute_callback_thread; + pthread_mutex_t execute_callback_mtx; + pthread_cond_t execute_callback_cond; uint32_t maximum_transmission_unit; struct SwiftNetVector pending_messages; struct SwiftNetMemoryAllocator pending_messages_memory_allocator; @@ -258,7 +263,11 @@ struct SwiftNetServer { uint16_t addr_type; bool loopback; pthread_t process_packets_thread; + pthread_mutex_t process_packets_mtx; + pthread_cond_t process_packets_cond; pthread_t execute_callback_thread; + pthread_mutex_t execute_callback_mtx; + pthread_cond_t execute_callback_cond; struct SwiftNetVector pending_messages; struct SwiftNetMemoryAllocator pending_messages_memory_allocator; struct SwiftNetVector packets_sending; diff --git a/tests/integration_tests/output/run_tests b/tests/integration_tests/output/run_tests index 18adf12e1cc87b5de28f4d2be43ed58ddb72c42d..7c1d6e0e6bde79f8484dd6a4ab135faa730f6ce3 100755 GIT binary patch delta 49111 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 J_r9?FJIo+H$rm=m3# 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 From 6c8a4d7815c095486068779db5f35179e057eaec Mon Sep 17 00:00:00 2001 From: Morcules Date: Fri, 23 Jan 2026 22:30:31 +0100 Subject: [PATCH 2/2] Added thread signaling to execute_callback --- src/execute_packet_callback.c | 26 +++++++++++++++--- src/process_packets.c | 32 ++++++++++++++--------- tests/integration_tests/output/run_tests | Bin 164280 -> 164280 bytes 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/src/execute_packet_callback.c b/src/execute_packet_callback.c index bbe216b..28e2a16 100644 --- a/src/execute_packet_callback.c +++ b/src/execute_packet_callback.c @@ -53,17 +53,37 @@ static inline void remove_pending_message_from_vector(struct SwiftNetVector* con vector_unlock(pending_messages); } -void execute_packet_callback(struct PacketCallbackQueue* const queue, void (* const _Atomic * const packet_handler) (void* const, void* const), const enum ConnectionType connection_type, struct SwiftNetMemoryAllocator* const pending_message_memory_allocator, _Atomic bool* closing, void* const connection, struct SwiftNetVector* const pending_messages, _Atomic(void*)* user_data) { +void execute_packet_callback( + struct PacketCallbackQueue* const queue, + void (* const _Atomic * const packet_handler) (void* const, + void* const), + const enum ConnectionType connection_type, + struct SwiftNetMemoryAllocator* const pending_message_memory_allocator, + _Atomic bool* closing, + void* const connection, + struct SwiftNetVector* const pending_messages, + _Atomic(void*)* user_data, + pthread_mutex_t* const execute_callback_mtx, + pthread_cond_t* const execute_callback_cond +) { while (1) { if (atomic_load_explicit(closing, memory_order_acquire) == true) { break; } + pthread_mutex_lock(execute_callback_mtx); + const struct PacketCallbackQueueNode* const node = wait_for_next_packet_callback(queue); if(node == NULL) { + pthread_cond_wait(execute_callback_cond, execute_callback_mtx); + + pthread_mutex_unlock(execute_callback_mtx); + continue; } + pthread_mutex_unlock(execute_callback_mtx); + atomic_thread_fence(memory_order_acquire); if(node->packet_data == NULL) { @@ -97,7 +117,7 @@ void execute_packet_callback(struct PacketCallbackQueue* const queue, void (* co void* execute_packet_callback_client(void* const void_client) { struct SwiftNetClientConnection* const client = void_client; - execute_packet_callback(&client->packet_callback_queue, (void*)&client->packet_handler, CONNECTION_TYPE_CLIENT, &client->pending_messages_memory_allocator, &client->closing, void_client, &client->pending_messages, &client->packet_handler_user_arg); + execute_packet_callback(&client->packet_callback_queue, (void*)&client->packet_handler, CONNECTION_TYPE_CLIENT, &client->pending_messages_memory_allocator, &client->closing, void_client, &client->pending_messages, &client->packet_handler_user_arg, &client->execute_callback_mtx, &client->execute_callback_cond); return NULL; } @@ -105,7 +125,7 @@ void* execute_packet_callback_client(void* const void_client) { void* execute_packet_callback_server(void* const void_server) { struct SwiftNetServer* const server = void_server; - execute_packet_callback(&server->packet_callback_queue, (void*)&server->packet_handler, CONNECTION_TYPE_SERVER, &server->pending_messages_memory_allocator, &server->closing, void_server, &server->pending_messages, &server->packet_handler_user_arg); + execute_packet_callback(&server->packet_callback_queue, (void*)&server->packet_handler, CONNECTION_TYPE_SERVER, &server->pending_messages_memory_allocator, &server->closing, void_server, &server->pending_messages, &server->packet_handler_user_arg, &server->execute_callback_mtx, &server->execute_callback_cond); return NULL; } diff --git a/src/process_packets.c b/src/process_packets.c index 541b25d..28f1586 100644 --- a/src/process_packets.c +++ b/src/process_packets.c @@ -204,7 +204,7 @@ static inline void handle_request_response(const uint16_t packet_id, struct Swif #endif -static inline void pass_callback_execution(void* const packet_data, struct PacketCallbackQueue* const queue, struct SwiftNetPendingMessage* const pending_message, const uint16_t packet_id) { +static inline void pass_callback_execution(void* const packet_data, struct PacketCallbackQueue* const queue, struct SwiftNetPendingMessage* const pending_message, const uint16_t packet_id, pthread_mutex_t* const execute_callback_mtx, pthread_cond_t* const execute_callback_cond) { struct PacketCallbackQueueNode* const node = allocator_allocate(&packet_callback_queue_node_memory_allocator); node->packet_data = packet_data; node->next = NULL; @@ -213,7 +213,13 @@ static inline void pass_callback_execution(void* const packet_data, struct Packe atomic_thread_fence(memory_order_release); + pthread_mutex_lock(execute_callback_mtx); + insert_callback_queue_node(node, queue); + + pthread_cond_signal(execute_callback_cond); + + pthread_mutex_unlock(execute_callback_mtx); } static inline bool chunk_already_received(uint8_t* const chunks_received, const uint32_t index) { @@ -327,7 +333,9 @@ static inline void swiftnet_process_packets( _Atomic bool* closing, const uint8_t prepend_size, pthread_mutex_t* const process_packets_mtx, - pthread_cond_t* const process_packets_cond + pthread_cond_t* const process_packets_cond, + pthread_mutex_t* const execute_callback_mtx, + pthread_cond_t* const execute_callback_cond ) { while(1) { if (atomic_load(closing) == true) { @@ -602,10 +610,10 @@ static inline void swiftnet_process_packets( if (packet_info.packet_type == RESPONSE) { handle_request_response(ip_header.ip_id, NULL, new_packet_data, pending_messages, pending_messages_memory_allocator, connection_type, loopback); } else { - pass_callback_execution(new_packet_data, packet_callback_queue, NULL, ip_header.ip_id); + pass_callback_execution(new_packet_data, packet_callback_queue, NULL, ip_header.ip_id, execute_callback_mtx, execute_callback_cond); } #else - pass_callback_execution(new_packet_data, packet_callback_queue, NULL, ip_header.ip_id); + pass_callback_execution(new_packet_data, packet_callback_queue, NULL, ip_header.ip_id, execute_callback_mtx, execute_callback_cond); #endif } else { struct SwiftNetClientPacketData* const new_packet_data = allocator_allocate(&client_packet_data_memory_allocator) ; @@ -625,10 +633,10 @@ static inline void swiftnet_process_packets( if (packet_info.packet_type == RESPONSE) { handle_request_response(ip_header.ip_id, NULL, new_packet_data, pending_messages, pending_messages_memory_allocator, connection_type, loopback); } else { - pass_callback_execution(new_packet_data, packet_callback_queue, NULL, ip_header.ip_id); + pass_callback_execution(new_packet_data, packet_callback_queue, NULL, ip_header.ip_id, execute_callback_mtx, execute_callback_cond); } #else - pass_callback_execution(new_packet_data, packet_callback_queue, NULL, ip_header.ip_id); + pass_callback_execution(new_packet_data, packet_callback_queue, NULL, ip_header.ip_id, execute_callback_mtx, execute_callback_cond); #endif } @@ -686,10 +694,10 @@ static inline void swiftnet_process_packets( if (packet_info.packet_type == RESPONSE) { handle_request_response(ip_header.ip_id, pending_message, packet_data, pending_messages, pending_messages_memory_allocator, connection_type, loopback); } else { - pass_callback_execution(packet_data, packet_callback_queue, pending_message, ip_header.ip_id); + pass_callback_execution(packet_data, packet_callback_queue, pending_message, ip_header.ip_id, execute_callback_mtx, execute_callback_cond); } #else - pass_callback_execution(packet_data, packet_callback_queue, pending_message, ip_header.ip_id); + pass_callback_execution(packet_data, packet_callback_queue, pending_message, ip_header.ip_id, execute_callback_mtx, execute_callback_cond); #endif } else { uint8_t* const ptr = pending_message->packet_data_start; @@ -711,10 +719,10 @@ static inline void swiftnet_process_packets( if (packet_info.packet_type == RESPONSE) { handle_request_response(ip_header.ip_id, pending_message, packet_data, pending_messages, pending_messages_memory_allocator, connection_type, loopback); } else { - pass_callback_execution(packet_data, packet_callback_queue, pending_message, ip_header.ip_id); + pass_callback_execution(packet_data, packet_callback_queue, pending_message, ip_header.ip_id, execute_callback_mtx, execute_callback_cond); } #else - pass_callback_execution(packet_data, packet_callback_queue, pending_message, ip_header.ip_id); + pass_callback_execution(packet_data, packet_callback_queue, pending_message, ip_header.ip_id, execute_callback_mtx, execute_callback_cond); #endif } @@ -748,7 +756,7 @@ static inline void swiftnet_process_packets( void* swiftnet_server_process_packets(void* const void_server) { struct SwiftNetServer* const server = (struct SwiftNetServer*)void_server; - swiftnet_process_packets((void*)&server->packet_handler, server->pcap, server->eth_header, server->server_port, server->loopback, server->addr_type, &server->packets_sending, &server->packets_sending_memory_allocator, &server->pending_messages, &server->pending_messages_memory_allocator, &server->packets_completed, &server->packets_completed_memory_allocator, CONNECTION_TYPE_SERVER, &server->packet_queue, &server->packet_callback_queue, server, &server->closing, server->prepend_size, &server->process_packets_mtx, &server->process_packets_cond); + swiftnet_process_packets((void*)&server->packet_handler, server->pcap, server->eth_header, server->server_port, server->loopback, server->addr_type, &server->packets_sending, &server->packets_sending_memory_allocator, &server->pending_messages, &server->pending_messages_memory_allocator, &server->packets_completed, &server->packets_completed_memory_allocator, CONNECTION_TYPE_SERVER, &server->packet_queue, &server->packet_callback_queue, server, &server->closing, server->prepend_size, &server->process_packets_mtx, &server->process_packets_cond, &server->execute_callback_mtx, &server->execute_callback_cond); return NULL; } @@ -756,7 +764,7 @@ void* swiftnet_server_process_packets(void* const void_server) { void* swiftnet_client_process_packets(void* const void_client) { struct SwiftNetClientConnection* const client = (struct SwiftNetClientConnection*)void_client; - swiftnet_process_packets((void*)&client->packet_handler, client->pcap, client->eth_header, client->port_info.source_port, client->loopback, client->addr_type, &client->packets_sending, &client->packets_sending_memory_allocator, &client->pending_messages, &client->pending_messages_memory_allocator, &client->packets_completed, &client->packets_completed_memory_allocator, CONNECTION_TYPE_CLIENT, &client->packet_queue, &client->packet_callback_queue, client, &client->closing, client->prepend_size, &client->process_packets_mtx, &client->process_packets_cond); + swiftnet_process_packets((void*)&client->packet_handler, client->pcap, client->eth_header, client->port_info.source_port, client->loopback, client->addr_type, &client->packets_sending, &client->packets_sending_memory_allocator, &client->pending_messages, &client->pending_messages_memory_allocator, &client->packets_completed, &client->packets_completed_memory_allocator, CONNECTION_TYPE_CLIENT, &client->packet_queue, &client->packet_callback_queue, client, &client->closing, client->prepend_size, &client->process_packets_mtx, &client->process_packets_cond, &client->execute_callback_mtx, &client->execute_callback_cond); return NULL; } diff --git a/tests/integration_tests/output/run_tests b/tests/integration_tests/output/run_tests index 7c1d6e0e6bde79f8484dd6a4ab135faa730f6ce3..6f7240eb60bfe1f714b2ffeed729f7d2ba4cc6c6 100755 GIT binary patch delta 27426 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 delta 26975 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