Skip to content

Commit 4b8c5fa

Browse files
committed
add CPU affinity
1 parent 543c256 commit 4b8c5fa

File tree

6 files changed

+80
-0
lines changed

6 files changed

+80
-0
lines changed

include/slick_socket/tcp_client.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ struct TCPClientConfig
1717
uint16_t server_port = 5000;
1818
int receive_buffer_size = 4096;
1919
std::chrono::milliseconds connection_timeout{30000};
20+
int cpu_affinity = -1; // -1 means no affinity, otherwise specify CPU core index
2021
};
2122

2223
template<typename DerivedT, typename LoggerT = ConsoleLogger>

include/slick_socket/tcp_client_unix.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <fcntl.h>
1111
#include <csignal>
1212
#include <cstring>
13+
#include <pthread.h>
1314

1415
namespace slick_socket
1516
{
@@ -145,6 +146,26 @@ inline void TCPClientBase<DerivedT, LoggerT>::client_loop()
145146
{
146147
logger_.logInfo("Client loop started");
147148

149+
// Set CPU affinity if specified
150+
if (config_.cpu_affinity >= 0)
151+
{
152+
cpu_set_t cpuset;
153+
CPU_ZERO(&cpuset);
154+
CPU_SET(config_.cpu_affinity, &cpuset);
155+
156+
pthread_t thread = pthread_self();
157+
int result = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
158+
if (result != 0)
159+
{
160+
logger_.logWarning("Failed to set CPU affinity to core {}: {}",
161+
config_.cpu_affinity, std::strerror(result));
162+
}
163+
else
164+
{
165+
logger_.logInfo("Client thread pinned to CPU core {}", config_.cpu_affinity);
166+
}
167+
}
168+
148169
// Connection established - handle server communication
149170
std::vector<uint8_t> buffer(config_.receive_buffer_size);
150171

include/slick_socket/tcp_client_win32.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include "tcp_client.h"
66
#include <ws2tcpip.h>
7+
#include <windows.h>
78

89
#pragma comment(lib, "ws2_32.lib")
910
namespace slick_socket
@@ -142,6 +143,23 @@ inline void TCPClientBase<DerivedT, LoggerT>::client_loop()
142143
{
143144
logger_.logDebug("Client loop started");
144145

146+
// Set CPU affinity if specified
147+
if (config_.cpu_affinity >= 0)
148+
{
149+
DWORD_PTR mask = 1ULL << config_.cpu_affinity;
150+
HANDLE thread = GetCurrentThread();
151+
DWORD_PTR result = SetThreadAffinityMask(thread, mask);
152+
if (result == 0)
153+
{
154+
logger_.logWarning("Failed to set CPU affinity to core {}: error {}",
155+
config_.cpu_affinity, GetLastError());
156+
}
157+
else
158+
{
159+
logger_.logInfo("Client thread pinned to CPU core {}", config_.cpu_affinity);
160+
}
161+
}
162+
145163
// Connection established - handle server communication
146164
std::vector<uint8_t> buffer(config_.receive_buffer_size);
147165

include/slick_socket/tcp_server.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ struct TCPServerConfig
2424
bool reuse_address = true;
2525
int receive_buffer_size = 4096;
2626
std::chrono::milliseconds connection_timeout{30000};
27+
int cpu_affinity = -1; // -1 means no affinity, otherwise specify CPU core index
2728
};
2829

2930
template<typename DrivedT, typename LoggerT = ConsoleLogger>

include/slick_socket/tcp_server_unix.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <csignal>
1313
#include <algorithm>
1414
#include <cstring>
15+
#include <pthread.h>
1516

1617
namespace slick_socket
1718
{
@@ -194,6 +195,26 @@ inline void TCPServerBase<DrivedT, LoggerT>::disconnect_client(int client_id)
194195
template<typename DrivedT, typename LoggerT>
195196
void TCPServerBase<DrivedT, LoggerT>::server_loop()
196197
{
198+
// Set CPU affinity if specified
199+
if (config_.cpu_affinity >= 0)
200+
{
201+
cpu_set_t cpuset;
202+
CPU_ZERO(&cpuset);
203+
CPU_SET(config_.cpu_affinity, &cpuset);
204+
205+
pthread_t thread = pthread_self();
206+
int result = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
207+
if (result != 0)
208+
{
209+
logger_.logWarning("Failed to set CPU affinity to core {}: {}",
210+
config_.cpu_affinity, std::strerror(result));
211+
}
212+
else
213+
{
214+
logger_.logInfo("Server thread pinned to CPU core {}", config_.cpu_affinity);
215+
}
216+
}
217+
197218
fd_set read_fds;
198219
struct timeval timeout;
199220
std::vector<uint8_t> buffer(config_.receive_buffer_size);

include/slick_socket/tcp_server_win32.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include "tcp_server.h"
66
#include <ws2tcpip.h>
7+
#include <windows.h>
78
#include <queue>
89
#include <algorithm>
910

@@ -194,6 +195,23 @@ inline void TCPServerBase<DrivedT, LoggerT>::disconnect_client(int client_id)
194195
template<typename DrivedT, typename LoggerT>
195196
void TCPServerBase<DrivedT, LoggerT>::server_loop()
196197
{
198+
// Set CPU affinity if specified
199+
if (config_.cpu_affinity >= 0)
200+
{
201+
DWORD_PTR mask = 1ULL << config_.cpu_affinity;
202+
HANDLE thread = GetCurrentThread();
203+
DWORD_PTR result = SetThreadAffinityMask(thread, mask);
204+
if (result == 0)
205+
{
206+
logger_.logWarning("Failed to set CPU affinity to core {}: error {}",
207+
config_.cpu_affinity, GetLastError());
208+
}
209+
else
210+
{
211+
logger_.logInfo("Server thread pinned to CPU core {}", config_.cpu_affinity);
212+
}
213+
}
214+
197215
fd_set read_fds;
198216
struct timeval timeout;
199217
std::vector<uint8_t> buffer(config_.receive_buffer_size);

0 commit comments

Comments
 (0)