Cogs.Core
Message.cpp
1#include "Message.h"
2
3Cogs::Network::Message::Pool Cogs::Network::Message::messagePool; // List of free messages that can be reused.
4Cogs::Mutex Cogs::Network::Message::mutex;
5
9Cogs::Network::Message::Ptr Cogs::Network::Message::allocate(uint32_t id) {
10 Message* message = nullptr;
11 std::unique_lock lock(mutex);
12
13 if (!messagePool.empty()) {
14 message = messagePool.back();
15 messagePool.pop_back();
16 }
17 else {
18 message = new Message();
19 }
20
21 message->identifier = id;
22 return Ptr(message, &deleteMessage);
23}
24
28Cogs::Network::Message::Ptr Cogs::Network::Message::duplicate(const Message& src) {
29 Ptr msg = allocate(src.getID());
30
31 msg->write(src.data(), src.size());
32 return msg;
33}
34
39 std::unique_lock lock(mutex);
40
41 for (Message* message : messagePool) {
42 delete message;
43 }
44 messagePool.clear();
45}
46
51Cogs::Network::Message::Message() : MemoryBuffer(1024, true) {
52}
53
59Cogs::Network::Message::Message(uint32_t id, const Message& message) : MemoryBuffer(message.data(), message.size()) {
60 identifier = id;
61}
62
69 std::unique_lock lock(mutex);
70
71 message->resize(0);
72 messagePool.push_back(message);
73}
static void flush()
Flushes any messages pooled for reuse.
Definition: Message.cpp:38
static void deleteMessage(Message *msg)
Deleter function called by shared_ptr when the last reference to message is destroyed.
Definition: Message.cpp:68
Message()
Constructs a new Message instance.
Definition: Message.cpp:51
static Ptr duplicate(const Message &src)
Duplicates the provided message.
Definition: Message.cpp:28
static Ptr allocate(uint32_t id)
Retrieves an existing message from the pool, or creates a new one if the pool is empty.
Definition: Message.cpp:9