diff options
author | sfan5 <sfan5@live.de> | 2021-09-17 18:14:25 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-17 18:14:25 +0200 |
commit | fd8a8501bc26dfca2a93d51000867b8592210040 (patch) | |
tree | 2555456796bc15f7ef0f2bc24c08b9848b874b4e /src/util | |
parent | ea250ff5c57301b6ea3e529c811484c743c1fde1 (diff) | |
download | minetest-fd8a8501bc26dfca2a93d51000867b8592210040.tar.gz minetest-fd8a8501bc26dfca2a93d51000867b8592210040.tar.bz2 minetest-fd8a8501bc26dfca2a93d51000867b8592210040.zip |
Shave off buffer copies in networking code (#11607)
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/container.h | 7 | ||||
-rw-r--r-- | src/util/pointer.h | 34 |
2 files changed, 41 insertions, 0 deletions
diff --git a/src/util/container.h b/src/util/container.h index 1c4a219f0..001066563 100644 --- a/src/util/container.h +++ b/src/util/container.h @@ -140,6 +140,13 @@ public: m_signal.post(); } + void push_back(T &&t) + { + MutexAutoLock lock(m_mutex); + m_queue.push_back(std::move(t)); + m_signal.post(); + } + /* this version of pop_front returns a empty element of T on timeout. * Make sure default constructor of T creates a recognizable "empty" element */ diff --git a/src/util/pointer.h b/src/util/pointer.h index d29ec8739..7fc5de551 100644 --- a/src/util/pointer.h +++ b/src/util/pointer.h @@ -51,6 +51,19 @@ public: else data = NULL; } + Buffer(Buffer &&buffer) + { + m_size = buffer.m_size; + if(m_size != 0) + { + data = buffer.data; + buffer.data = nullptr; + buffer.m_size = 0; + } + else + data = nullptr; + } + // Copies whole buffer Buffer(const T *t, unsigned int size) { m_size = size; @@ -62,10 +75,12 @@ public: else data = NULL; } + ~Buffer() { drop(); } + Buffer& operator=(const Buffer &buffer) { if(this == &buffer) @@ -81,6 +96,23 @@ public: data = NULL; return *this; } + Buffer& operator=(Buffer &&buffer) + { + if(this == &buffer) + return *this; + drop(); + m_size = buffer.m_size; + if(m_size != 0) + { + data = buffer.data; + buffer.data = nullptr; + buffer.m_size = 0; + } + else + data = nullptr; + return *this; + } + T & operator[](unsigned int i) const { return data[i]; @@ -89,10 +121,12 @@ public: { return data; } + unsigned int getSize() const { return m_size; } + private: void drop() { |