Skip to content

Commit 851f533

Browse files
deadlightrealMorcules
authored andcommitted
Updated code for readability and reusability
1 parent d06f93c commit 851f533

10 files changed

+343
-282
lines changed

src/cleanup.c

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,7 @@
33
#include <stdint.h>
44
#include <stdio.h>
55

6-
void swiftnet_cleanup() {
7-
allocator_destroy(&packet_queue_node_memory_allocator);
8-
allocator_destroy(&packet_callback_queue_node_memory_allocator);
9-
allocator_destroy(&server_packet_data_memory_allocator);
10-
allocator_destroy(&client_packet_data_memory_allocator);
11-
allocator_destroy(&packet_buffer_memory_allocator);
12-
13-
#ifdef SWIFT_NET_REQUESTS
14-
allocator_destroy(&requests_sent_memory_allocator);
15-
16-
vector_destroy(&requests_sent);
17-
#endif
18-
6+
static inline void close_listeners() {
197
vector_lock(&listeners);
208

219
for (uint16_t i = 0; i < listeners.size; i++) {
@@ -32,7 +20,23 @@ void swiftnet_cleanup() {
3220
}
3321

3422
vector_destroy(&listeners);
23+
}
24+
25+
void swiftnet_cleanup() {
26+
allocator_destroy(&packet_queue_node_memory_allocator);
27+
allocator_destroy(&packet_callback_queue_node_memory_allocator);
28+
allocator_destroy(&server_packet_data_memory_allocator);
29+
allocator_destroy(&client_packet_data_memory_allocator);
30+
allocator_destroy(&packet_buffer_memory_allocator);
31+
32+
#ifdef SWIFT_NET_REQUESTS
33+
allocator_destroy(&requests_sent_memory_allocator);
34+
35+
vector_destroy(&requests_sent);
36+
#endif
3537

38+
close_listeners();
39+
3640
allocator_destroy(&server_memory_allocator);
3741
allocator_destroy(&client_connection_memory_allocator);
3842

src/cleanup_connection.c

Lines changed: 81 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -4,94 +4,119 @@
44
#include <stdint.h>
55
#include <unistd.h>
66

7-
void swiftnet_client_cleanup(struct SwiftNetClientConnection* const client) {
8-
allocator_destroy(&client->packets_sending_memory_allocator);
9-
allocator_destroy(&client->pending_messages_memory_allocator);
10-
allocator_destroy(&client->packets_completed_memory_allocator);
11-
12-
vector_destroy(&client->packets_sending);
13-
vector_destroy(&client->pending_messages);
14-
vector_destroy(&client->packets_completed);
15-
16-
const char* interface_name = client->loopback ? LOOPBACK_INTERFACE_NAME : default_network_interface;
7+
static inline void cleanup_connection_resources(const enum ConnectionType connection_type, void* const connection) {
8+
if (connection_type == CONNECTION_TYPE_CLIENT) {
9+
struct SwiftNetClientConnection* const client = (struct SwiftNetClientConnection*)connection;
10+
11+
allocator_destroy(&client->packets_sending_memory_allocator);
12+
allocator_destroy(&client->pending_messages_memory_allocator);
13+
allocator_destroy(&client->packets_completed_memory_allocator);
14+
15+
vector_destroy(&client->packets_sending);
16+
vector_destroy(&client->pending_messages);
17+
vector_destroy(&client->packets_completed);
18+
} else {
19+
struct SwiftNetServer* const server = (struct SwiftNetServer*)connection;
20+
21+
allocator_destroy(&server->packets_sending_memory_allocator);
22+
allocator_destroy(&server->pending_messages_memory_allocator);
23+
allocator_destroy(&server->packets_completed_memory_allocator);
24+
25+
vector_destroy(&server->packets_sending);
26+
vector_destroy(&server->pending_messages);
27+
vector_destroy(&server->packets_completed);
28+
}
29+
}
1730

31+
static inline void remove_listener(const enum ConnectionType connection_type, const char* interface_name, void* const connection) {
1832
vector_lock(&listeners);
1933

2034
for (uint16_t i = 0; i < listeners.size; i++) {
2135
struct Listener* const current_listener = vector_get(&listeners, i);
2236
if (strcmp(interface_name, current_listener->interface_name) == 0) {
23-
vector_lock(&current_listener->client_connections);
37+
if (connection_type == CONNECTION_TYPE_CLIENT) {
38+
vector_lock(&current_listener->client_connections);
2439

25-
for (uint16_t inx = 0; inx < current_listener->client_connections.size; inx++) {
26-
struct SwiftNetClientConnection* const current_client_conn = vector_get(&current_listener->client_connections, i);
27-
if (current_client_conn != client) {
28-
continue;
40+
for (uint16_t inx = 0; inx < current_listener->client_connections.size; inx++) {
41+
struct SwiftNetClientConnection* const current_connection = vector_get(&current_listener->client_connections, i);
42+
if (current_connection != connection) {
43+
continue;
44+
}
45+
46+
vector_remove(&current_listener->client_connections, inx);
47+
48+
break;
2949
}
3050

31-
vector_remove(&current_listener->client_connections, inx);
51+
vector_unlock(&current_listener->client_connections);
52+
} else {
53+
vector_lock(&current_listener->servers);
3254

33-
break;
34-
}
55+
for (uint16_t inx = 0; inx < current_listener->servers.size; inx++) {
56+
struct SwiftNetClientConnection* const current_connection = vector_get(&current_listener->servers, i);
57+
if (current_connection != connection) {
58+
continue;
59+
}
60+
61+
vector_remove(&current_listener->servers, inx);
3562

36-
vector_unlock(&current_listener->client_connections);
63+
break;
64+
}
65+
66+
vector_unlock(&current_listener->servers);
67+
}
3768

3869
break;
3970
}
4071
}
4172

4273
vector_unlock(&listeners);
74+
}
4375

44-
atomic_store_explicit(&client->closing, true, memory_order_release);
45-
46-
pthread_join(client->process_packets_thread, NULL);
47-
pthread_join(client->execute_callback_thread, NULL);
48-
49-
pcap_close(client->pcap);
50-
51-
allocator_free(&client_connection_memory_allocator, client);
76+
static inline const char* get_interface_name(const bool loopback) {
77+
return loopback ? LOOPBACK_INTERFACE_NAME : default_network_interface;
5278
}
5379

54-
void swiftnet_server_cleanup(struct SwiftNetServer* const server) {
55-
allocator_destroy(&server->packets_sending_memory_allocator);
56-
allocator_destroy(&server->pending_messages_memory_allocator);
57-
allocator_destroy(&server->packets_completed_memory_allocator);
80+
static inline void close_threads(const enum ConnectionType connection_type, void* const connection) {
81+
if (connection_type == CONNECTION_TYPE_CLIENT) {
82+
struct SwiftNetClientConnection* const client = connection;
5883

59-
vector_destroy(&server->packets_sending);
60-
vector_destroy(&server->pending_messages);
61-
vector_destroy(&server->packets_completed);
84+
atomic_store_explicit(&client->closing, true, memory_order_release);
6285

63-
const char* interface_name = server->loopback ? LOOPBACK_INTERFACE_NAME : default_network_interface;
86+
pthread_join(client->process_packets_thread, NULL);
87+
pthread_join(client->execute_callback_thread, NULL);
88+
} else {
89+
struct SwiftNetServer* const server = connection;
6490

65-
vector_lock(&listeners);
91+
atomic_store_explicit(&server->closing, true, memory_order_release);
6692

67-
for (uint16_t i = 0; i < listeners.size; i++) {
68-
struct Listener* const current_listener = vector_get(&listeners, i);
69-
if (strcmp(interface_name, current_listener->interface_name) == 0) {
70-
vector_lock(&current_listener->servers);
93+
pthread_join(server->process_packets_thread, NULL);
94+
pthread_join(server->execute_callback_thread, NULL);
95+
}
96+
}
7197

72-
for (uint16_t inx = 0; inx < current_listener->servers.size; inx++) {
73-
struct SwiftNetServer* const current_server = vector_get(&current_listener->servers, i);
74-
if (current_server != server) {
75-
continue;
76-
}
98+
void swiftnet_client_cleanup(struct SwiftNetClientConnection* const client) {
99+
cleanup_connection_resources(CONNECTION_TYPE_CLIENT, client);
100+
101+
const char* interface_name = get_interface_name(client->loopback);
77102

78-
vector_remove(&current_listener->servers, inx);
103+
remove_listener(CONNECTION_TYPE_CLIENT, interface_name, client);
79104

80-
break;
81-
}
105+
close_threads(CONNECTION_TYPE_CLIENT, client);
82106

83-
vector_unlock(&current_listener->servers);
107+
pcap_close(client->pcap);
84108

85-
break;
86-
}
87-
}
109+
allocator_free(&client_connection_memory_allocator, client);
110+
}
88111

89-
vector_unlock(&listeners);
112+
void swiftnet_server_cleanup(struct SwiftNetServer* const server) {
113+
cleanup_connection_resources(CONNECTION_TYPE_SERVER, server);
114+
115+
const char* interface_name = get_interface_name(server->loopback);
90116

91-
atomic_store_explicit(&server->closing, true, memory_order_release);
117+
remove_listener(CONNECTION_TYPE_SERVER, interface_name, server);
92118

93-
pthread_join(server->process_packets_thread, NULL);
94-
pthread_join(server->execute_callback_thread, NULL);
119+
close_threads(CONNECTION_TYPE_SERVER, server);
95120

96121
pcap_close(server->pcap);
97122

src/execute_packet_callback.c

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@
77
#include <unistd.h>
88
#include <pthread.h>
99

10-
static struct PacketCallbackQueueNode* const wait_for_next_packet_callback(struct PacketCallbackQueue* const packet_queue) {
10+
static inline void lock_packet_queue(struct PacketCallbackQueue* const packet_queue) {
1111
uint32_t owner_none = PACKET_CALLBACK_QUEUE_OWNER_NONE;
1212
while(!atomic_compare_exchange_strong_explicit(&packet_queue->owner, &owner_none, PACKET_CALLBACK_QUEUE_OWNER_EXECUTE_PACKET_CALLBACK, memory_order_acquire, memory_order_relaxed)) {
1313
owner_none = PACKET_CALLBACK_QUEUE_OWNER_NONE;
1414
}
15+
}
16+
17+
static struct PacketCallbackQueueNode* const wait_for_next_packet_callback(struct PacketCallbackQueue* const packet_queue) {
18+
lock_packet_queue(packet_queue);
1519

1620
if(packet_queue->first_node == NULL) {
1721
atomic_store_explicit(&packet_queue->owner, PACKET_CALLBACK_QUEUE_OWNER_NONE, memory_order_release);
@@ -36,6 +40,19 @@ static struct PacketCallbackQueueNode* const wait_for_next_packet_callback(struc
3640
return node_to_process;
3741
}
3842

43+
static inline void remove_pending_message_from_vector(struct SwiftNetVector* const pending_messages, struct SwiftNetPendingMessage* const pending_message) {
44+
vector_lock(pending_messages);
45+
46+
for (uint32_t i = 0; i < pending_messages->size; i++) {
47+
const struct SwiftNetPendingMessage* const current_pending_message = vector_get(pending_messages, i);
48+
if (current_pending_message == pending_message) {
49+
vector_remove(pending_messages, i);
50+
}
51+
}
52+
53+
vector_unlock(pending_messages);
54+
}
55+
3956
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) {
4057
while (1) {
4158
if (atomic_load_explicit(closing, memory_order_acquire) == true) {
@@ -55,16 +72,7 @@ void execute_packet_callback(struct PacketCallbackQueue* const queue, void (* co
5572
}
5673

5774
if(node->pending_message != NULL) {
58-
vector_lock(pending_messages);
59-
60-
for (uint32_t i = 0; i < pending_messages->size; i++) {
61-
const struct SwiftNetPendingMessage* const pending_message = vector_get(pending_messages, i);
62-
if (pending_message == node->pending_message) {
63-
vector_remove(pending_messages, i);
64-
}
65-
}
66-
67-
vector_unlock(pending_messages);
75+
remove_pending_message_from_vector(pending_messages, node->pending_message);
6876
}
6977

7078
void (*const packet_handler_loaded)(void* const, void* const) = atomic_load(packet_handler);

0 commit comments

Comments
 (0)