11#include "internal/internal.h"
22#include "swift_net.h"
33#include <stdatomic.h>
4+ #include <stdint.h>
45#include <stdio.h>
56#include <stdlib.h>
67#include <unistd.h>
@@ -35,7 +36,7 @@ static struct PacketCallbackQueueNode* const wait_for_next_packet_callback(struc
3536 return node_to_process ;
3637}
3738
38- void execute_packet_callback (struct PacketCallbackQueue * const queue , void (* const _Atomic * const packet_handler ) (void * const ), const uint8_t connection_type , struct SwiftNetMemoryAllocator * const pending_message_memory_allocator , _Atomic bool * closing , const void * const connection , struct SwiftNetVector * const pending_messages ) {
39+ 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 ) {
3940 while (1 ) {
4041 if (atomic_load_explicit (closing , memory_order_acquire ) == true) {
4142 break ;
@@ -67,6 +68,17 @@ void execute_packet_callback(struct PacketCallbackQueue* const queue, void (* co
6768 }
6869
6970 void (* const packet_handler_loaded )(void * ) = atomic_load (packet_handler );
71+ if (unlikely (packet_handler_loaded == NULL )) {
72+ if (connection_type == CONNECTION_TYPE_CLIENT ) {
73+ swiftnet_client_destroy_packet_data (node -> packet_data , connection );
74+ } else {
75+ swiftnet_client_destroy_packet_data (node -> packet_data , connection );
76+ }
77+
78+ allocator_free (& packet_callback_queue_node_memory_allocator , (void * )node );
79+
80+ continue ;
81+ }
7082
7183 (* packet_handler_loaded )(node -> packet_data );
7284
@@ -77,15 +89,15 @@ void execute_packet_callback(struct PacketCallbackQueue* const queue, void (* co
7789void * execute_packet_callback_client (void * const void_client ) {
7890 struct SwiftNetClientConnection * const client = void_client ;
7991
80- execute_packet_callback (& client -> packet_callback_queue , (void * )& client -> packet_handler , 0 , & client -> pending_messages_memory_allocator , & client -> closing , void_client , & client -> pending_messages );
92+ 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 );
8193
8294 return NULL ;
8395}
8496
8597void * execute_packet_callback_server (void * const void_server ) {
8698 struct SwiftNetServer * const server = void_server ;
8799
88- execute_packet_callback (& server -> packet_callback_queue , (void * )& server -> packet_handler , 1 , & server -> pending_messages_memory_allocator , & server -> closing , void_server , & server -> pending_messages );
100+ 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 );
89101
90102 return NULL ;
91103}
0 commit comments