Skip to content

Commit 880ca0a

Browse files
authored
Optimized LockFreeQueue by Reducing Object Construction
1 parent 1be32c5 commit 880ca0a

File tree

5 files changed

+22
-33
lines changed

5 files changed

+22
-33
lines changed

trantor/net/InetAddress.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@
1414
#ifdef _WIN32
1515
struct in6_addr_uint
1616
{
17-
union
18-
{
17+
union {
1918
u_char Byte[16];
2019
u_short Word[8];
2120
uint32_t __s6_addr32[4];

trantor/net/InetAddress.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,7 @@ class InetAddress
100100
}
101101

102102
private:
103-
union
104-
{
103+
union {
105104
struct sockaddr_in addr_;
106105
struct sockaddr_in6 addr6_;
107106
};

trantor/net/inner/AresResolver.cc

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -234,9 +234,7 @@ void AresResolver::ares_hostcallback_(void* data,
234234
}
235235

236236
#ifdef _WIN32
237-
int AresResolver::ares_sock_createcallback_(SOCKET sockfd,
238-
int type,
239-
void* data)
237+
int AresResolver::ares_sock_createcallback_(SOCKET sockfd, int type, void* data)
240238
#else
241239
int AresResolver::ares_sock_createcallback_(int sockfd, int type, void* data)
242240
#endif

trantor/net/inner/AresResolver.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,7 @@ class AresResolver : public Resolver,
126126
int timeouts,
127127
struct hostent* hostent);
128128
#ifdef _WIN32
129-
static int ares_sock_createcallback_(SOCKET sockfd,
130-
int type,
131-
void* data);
129+
static int ares_sock_createcallback_(SOCKET sockfd, int type, void* data);
132130
#else
133131
static int ares_sock_createcallback_(int sockfd, int type, void* data);
134132
#endif

trantor/utils/LockFreeQueue.h

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <trantor/utils/NonCopyable.h>
1717
#include <atomic>
1818
#include <type_traits>
19+
#include <memory>
1920
#include <assert.h>
2021
namespace trantor
2122
{
@@ -27,8 +28,6 @@ class MpscQueue : public NonCopyable
2728
MpscQueue()
2829
: head_(new BufferNode), tail_(head_.load(std::memory_order_relaxed))
2930
{
30-
BufferNode *front = head_.load(std::memory_order_relaxed);
31-
front->next.store(NULL, std::memory_order_relaxed);
3231
}
3332

3433
~MpscQueue()
@@ -43,40 +42,29 @@ class MpscQueue : public NonCopyable
4342

4443
void enqueue(T &&input)
4544
{
46-
BufferNode *node{new BufferNode};
47-
node->data = std::move(input);
48-
node->next.store(NULL, std::memory_order_relaxed);
49-
45+
BufferNode *node{new BufferNode(std::move(input))};
5046
BufferNode *prevhead{head_.exchange(node, std::memory_order_acq_rel)};
51-
prevhead->next.store(node, std::memory_order_release);
47+
prevhead->next_.store(node, std::memory_order_release);
5248
}
5349

5450
void enqueue(const T &input)
5551
{
56-
BufferNode *node{new BufferNode};
57-
node->data = input;
58-
node->next.store(NULL, std::memory_order_relaxed);
59-
52+
BufferNode *node{new BufferNode(input)};
6053
BufferNode *prevhead{head_.exchange(node, std::memory_order_acq_rel)};
61-
prevhead->next.store(node, std::memory_order_release);
54+
prevhead->next_.store(node, std::memory_order_release);
6255
}
6356

6457
bool dequeue(T &output)
6558
{
6659
BufferNode *tail = tail_.load(std::memory_order_relaxed);
67-
BufferNode *next = tail->next.load(std::memory_order_acquire);
60+
BufferNode *next = tail->next_.load(std::memory_order_acquire);
6861

69-
if (next == NULL)
62+
if (next == nullptr)
7063
{
7164
return false;
7265
}
73-
#ifdef __linux__
74-
output = std::move(next->data);
75-
#else
76-
output = next->data;
77-
/// Immediately destroy some RAII objects in the next->data
78-
next->data = T();
79-
#endif
66+
output = std::move(*(next->dataPtr_));
67+
delete next->dataPtr_;
8068
tail_.store(next, std::memory_order_release);
8169
delete tail;
8270
return true;
@@ -85,8 +73,15 @@ class MpscQueue : public NonCopyable
8573
private:
8674
struct BufferNode
8775
{
88-
T data;
89-
std::atomic<BufferNode *> next;
76+
BufferNode() = default;
77+
BufferNode(const T &data) : dataPtr_(new T(data))
78+
{
79+
}
80+
BufferNode(T &&data) : dataPtr_(new T(std::move(data)))
81+
{
82+
}
83+
T *dataPtr_;
84+
std::atomic<BufferNode *> next_{nullptr};
9085
};
9186

9287
std::atomic<BufferNode *> head_;

0 commit comments

Comments
 (0)