diff --git a/src/execute_packet_callback.c b/src/execute_packet_callback.c index 89131f5..0019b6a 100644 --- a/src/execute_packet_callback.c +++ b/src/execute_packet_callback.c @@ -36,7 +36,7 @@ static struct PacketCallbackQueueNode* const wait_for_next_packet_callback(struc return node_to_process; } -void execute_packet_callback(struct PacketCallbackQueue* const queue, void (* const _Atomic * const packet_handler) (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) { +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) { while (1) { if (atomic_load_explicit(closing, memory_order_acquire) == true) { break; @@ -67,7 +67,7 @@ void execute_packet_callback(struct PacketCallbackQueue* const queue, void (* co vector_unlock(pending_messages); } - void (*const packet_handler_loaded)(void*) = atomic_load(packet_handler); + void (*const packet_handler_loaded)(void* const, void* const) = atomic_load(packet_handler); if (unlikely(packet_handler_loaded == NULL)) { if (connection_type == CONNECTION_TYPE_CLIENT) { swiftnet_client_destroy_packet_data(node->packet_data, connection); @@ -80,7 +80,7 @@ void execute_packet_callback(struct PacketCallbackQueue* const queue, void (* co continue; } - (*packet_handler_loaded)(node->packet_data); + (*packet_handler_loaded)(node->packet_data, atomic_load_explicit(user_data, memory_order_acquire)); allocator_free(&packet_callback_queue_node_memory_allocator, (void*)node); } @@ -89,7 +89,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); + 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); return NULL; } @@ -97,7 +97,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); + 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); return NULL; } diff --git a/src/generic_functions.c b/src/generic_functions.c index 478fe70..0940204 100644 --- a/src/generic_functions.c +++ b/src/generic_functions.c @@ -1,5 +1,6 @@ #include "internal/internal.h" #include "swift_net.h" +#include #include #include #include @@ -15,16 +16,18 @@ static inline void swiftnet_validate_new_handler(const void* const new_handler, #endif } -void swiftnet_client_set_message_handler(struct SwiftNetClientConnection* const client, void (* const new_handler)(struct SwiftNetClientPacketData* const)) { +void swiftnet_client_set_message_handler(struct SwiftNetClientConnection* const client, void (* const new_handler)(struct SwiftNetClientPacketData* const, void* const), void* const user_arg) { swiftnet_validate_new_handler(new_handler, __func__); - atomic_store(&client->packet_handler, new_handler); + atomic_store_explicit(&client->packet_handler, new_handler, memory_order_release); + atomic_store_explicit(&client->packet_handler_user_arg, user_arg, memory_order_release); } -void swiftnet_server_set_message_handler(struct SwiftNetServer* const server, void (* const new_handler)(struct SwiftNetServerPacketData* const)) { +void swiftnet_server_set_message_handler(struct SwiftNetServer* const server, void (* const new_handler)(struct SwiftNetServerPacketData* const, void* const), void* const user_arg) { swiftnet_validate_new_handler(new_handler, __func__); - atomic_store(&server->packet_handler, new_handler); + atomic_store_explicit(&server->packet_handler, new_handler, memory_order_release); + atomic_store_explicit(&server->packet_handler_user_arg, user_arg, memory_order_release); } // Read packet data into buffers diff --git a/src/initialize_client_socket.c b/src/initialize_client_socket.c index f054d3a..6422f37 100644 --- a/src/initialize_client_socket.c +++ b/src/initialize_client_socket.c @@ -106,6 +106,8 @@ struct SwiftNetClientConnection* swiftnet_create_client(const char* const ip_add new_connection->server_addr.s_addr = inet_addr(ip_address); + atomic_store_explicit(&new_connection->packet_handler_user_arg, NULL, memory_order_release); + // Request the server information, and proccess it const struct SwiftNetPacketInfo request_server_information_packet_info = construct_packet_info( 0x00, diff --git a/src/initialize_server_socket.c b/src/initialize_server_socket.c index b432126..52e8847 100644 --- a/src/initialize_server_socket.c +++ b/src/initialize_server_socket.c @@ -54,9 +54,10 @@ struct SwiftNetServer* swiftnet_create_server(const uint16_t port, const bool lo atomic_store(&new_server->packet_queue.owner, PACKET_QUEUE_OWNER_NONE); memset(&new_server->packet_callback_queue, 0x00, sizeof(struct PacketCallbackQueue)); - atomic_store(&new_server->packet_callback_queue.owner, PACKET_CALLBACK_QUEUE_OWNER_NONE); + atomic_store_explicit(&new_server->packet_callback_queue.owner, PACKET_CALLBACK_QUEUE_OWNER_NONE, memory_order_release); - atomic_store(&new_server->packet_handler, NULL); + atomic_store_explicit(&new_server->packet_handler, NULL, memory_order_release); + atomic_store_explicit(&new_server->packet_handler_user_arg, NULL, memory_order_release); new_server->pending_messages_memory_allocator = allocator_create(sizeof(struct SwiftNetPendingMessage), 100); new_server->pending_messages = vector_create(100); diff --git a/src/swift_net.h b/src/swift_net.h index 402d158..3fb381b 100644 --- a/src/swift_net.h +++ b/src/swift_net.h @@ -217,7 +217,8 @@ struct SwiftNetClientConnection { struct SwiftNetPortInfo port_info; struct in_addr server_addr; socklen_t server_addr_len; - _Atomic(void (*)(struct SwiftNetClientPacketData* const)) packet_handler; + _Atomic(void (*)(struct SwiftNetClientPacketData* const, void* const user)) packet_handler; + _Atomic(void*) packet_handler_user_arg; _Atomic bool closing; _Atomic bool initialized; uint16_t addr_type; @@ -240,7 +241,8 @@ struct SwiftNetServer { pcap_t* pcap; struct ether_header eth_header; uint16_t server_port; - _Atomic(void (*)(struct SwiftNetServerPacketData* const)) packet_handler; + _Atomic(void (*)(struct SwiftNetServerPacketData* const, void* const user)) packet_handler; + _Atomic(void*) packet_handler_user_arg; _Atomic bool closing; uint16_t addr_type; bool loopback; @@ -265,7 +267,8 @@ struct SwiftNetServer { */ extern void swiftnet_server_set_message_handler( struct SwiftNetServer* const server, - void (* const new_handler)(struct SwiftNetServerPacketData* const) + void (* const new_handler)(struct SwiftNetServerPacketData* const, void* const), + void* const user_arg ); /** @@ -275,7 +278,8 @@ extern void swiftnet_server_set_message_handler( */ extern void swiftnet_client_set_message_handler( struct SwiftNetClientConnection* const client, - void (* const new_handler)(struct SwiftNetClientPacketData* const) + void (* const new_handler)(struct SwiftNetClientPacketData* const, void* const), + void* const user_arg ); /** diff --git a/tests/src/making_request.c b/tests/src/making_request.c index 0d6f5a7..0ac1fb8 100644 --- a/tests/src/making_request.c +++ b/tests/src/making_request.c @@ -53,7 +53,7 @@ static void reset_test_state() { atomic_store_explicit(&g_test_result, INT_MAX, memory_order_release); } -static void on_client_packet(struct SwiftNetClientPacketData* packet) { +static void on_client_packet(struct SwiftNetClientPacketData* packet, void* const user) { struct SwiftNetClientConnection* const client_conn = atomic_load_explicit(&g_client_conn, memory_order_acquire); if (packet->metadata.data_length != atomic_load_explicit(&g_request_data_len, memory_order_acquire)) { @@ -99,7 +99,7 @@ static void on_client_packet(struct SwiftNetClientPacketData* packet) { atomic_store_explicit(&g_sent_response, true, memory_order_release); } -static void on_server_packet(struct SwiftNetServerPacketData* packet) { +static void on_server_packet(struct SwiftNetServerPacketData* packet, void* const user) { struct SwiftNetServer* const server = atomic_load_explicit(&g_server, memory_order_acquire); if (packet->metadata.expecting_response) { @@ -241,7 +241,7 @@ int test_making_request(const union Args* args_ptr) { return -1; } - swiftnet_server_set_message_handler(server, on_server_packet); + swiftnet_server_set_message_handler(server, on_server_packet, NULL); struct SwiftNetClientConnection* const client_conn = swiftnet_create_client(args.ip_address, 8080, 1000); if (client_conn == NULL) { @@ -249,7 +249,7 @@ int test_making_request(const union Args* args_ptr) { return -1; } - swiftnet_client_set_message_handler(client_conn, on_client_packet); + swiftnet_client_set_message_handler(client_conn, on_client_packet, NULL); atomic_store_explicit(&g_client_conn, client_conn, memory_order_release); atomic_store_explicit(&g_server, server, memory_order_release); diff --git a/tests/src/sending_packet.c b/tests/src/sending_packet.c index ccfaf54..a277282 100644 --- a/tests/src/sending_packet.c +++ b/tests/src/sending_packet.c @@ -46,7 +46,7 @@ static void reset_test_state() { atomic_store_explicit(&g_test_result, INT_MAX, memory_order_release); } -static void on_client_packet(struct SwiftNetClientPacketData* packet) { +static void on_client_packet(struct SwiftNetClientPacketData* packet, void* const user) { struct SwiftNetClientConnection* const client_conn = atomic_load_explicit(&g_client_conn, memory_order_acquire); while (!atomic_load_explicit(&g_client_send_done, memory_order_acquire)) usleep(1000); @@ -84,7 +84,7 @@ static void on_client_packet(struct SwiftNetClientPacketData* packet) { swiftnet_client_destroy_packet_data(packet, client_conn); } -static void on_server_packet(struct SwiftNetServerPacketData* packet) { +static void on_server_packet(struct SwiftNetServerPacketData* packet, void* const user) { struct SwiftNetServer* const server = atomic_load_explicit(&g_server, memory_order_acquire); while (!atomic_load_explicit(&g_server_send_done, memory_order_acquire)) usleep(1000); @@ -143,7 +143,7 @@ int test_sending_packet(const union Args* args_ptr) { return -1; } - swiftnet_server_set_message_handler(server, on_server_packet); + swiftnet_server_set_message_handler(server, on_server_packet, NULL); struct SwiftNetClientConnection* const client_conn = swiftnet_create_client(args.ip_address, 8080, 1000); if (client_conn == NULL) { @@ -151,7 +151,7 @@ int test_sending_packet(const union Args* args_ptr) { return -1; } - swiftnet_client_set_message_handler(client_conn, on_client_packet); + swiftnet_client_set_message_handler(client_conn, on_client_packet, NULL); atomic_store_explicit(&g_client_conn, client_conn, memory_order_release); atomic_store_explicit(&g_server, server, memory_order_release);