Skip to content

Commit

Permalink
Network: Delete copy constructor and use std::move instead (#11642)
Browse files Browse the repository at this point in the history
This is a follow-up change which disables class copies where possible to avoid unnecessary memory movements.
SmallJoker authored Dec 1, 2021
1 parent 1dc1305 commit 57a59ae
Showing 7 changed files with 600 additions and 552 deletions.
2 changes: 1 addition & 1 deletion src/client/client.cpp
Original file line number Diff line number Diff line change
@@ -877,7 +877,7 @@ void Client::ProcessData(NetworkPacket *pkt)
*/
if(sender_peer_id != PEER_ID_SERVER) {
infostream << "Client::ProcessData(): Discarding data not "
"coming from server: peer_id=" << sender_peer_id
"coming from server: peer_id=" << sender_peer_id << " command=" << pkt->getCommand()
<< std::endl;
return;
}
445 changes: 263 additions & 182 deletions src/network/connection.cpp

Large diffs are not rendered by default.

416 changes: 182 additions & 234 deletions src/network/connection.h

Large diffs are not rendered by default.

190 changes: 92 additions & 98 deletions src/network/connectionthreads.cpp

Large diffs are not rendered by default.

31 changes: 25 additions & 6 deletions src/network/connectionthreads.h
Original file line number Diff line number Diff line change
@@ -29,6 +29,25 @@ namespace con

class Connection;

struct OutgoingPacket
{
session_t peer_id;
u8 channelnum;
SharedBuffer<u8> data;
bool reliable;
bool ack;

OutgoingPacket(session_t peer_id_, u8 channelnum_, const SharedBuffer<u8> &data_,
bool reliable_,bool ack_=false):
peer_id(peer_id_),
channelnum(channelnum_),
data(data_),
reliable(reliable_),
ack(ack_)
{
}
};

class ConnectionSendThread : public Thread
{

@@ -51,27 +70,27 @@ class ConnectionSendThread : public Thread

private:
void runTimeouts(float dtime);
void rawSend(const BufferedPacket &packet);
void rawSend(const BufferedPacket *p);
bool rawSendAsPacket(session_t peer_id, u8 channelnum,
const SharedBuffer<u8> &data, bool reliable);

void processReliableCommand(ConnectionCommand &c);
void processNonReliableCommand(ConnectionCommand &c);
void processReliableCommand(ConnectionCommandPtr &c);
void processNonReliableCommand(ConnectionCommandPtr &c);
void serve(Address bind_address);
void connect(Address address);
void disconnect();
void disconnect_peer(session_t peer_id);
void send(session_t peer_id, u8 channelnum, const SharedBuffer<u8> &data);
void sendReliable(ConnectionCommand &c);
void sendReliable(ConnectionCommandPtr &c);
void sendToAll(u8 channelnum, const SharedBuffer<u8> &data);
void sendToAllReliable(ConnectionCommand &c);
void sendToAllReliable(ConnectionCommandPtr &c);

void sendPackets(float dtime);

void sendAsPacket(session_t peer_id, u8 channelnum, const SharedBuffer<u8> &data,
bool ack = false);

void sendAsPacketReliable(BufferedPacket &p, Channel *channel);
void sendAsPacketReliable(BufferedPacketPtr &p, Channel *channel);

bool packetsQueued();

10 changes: 5 additions & 5 deletions src/unittest/test_connection.cpp
Original file line number Diff line number Diff line change
@@ -124,7 +124,7 @@ void TestConnection::testHelpers()
Address a(127,0,0,1, 10);
const u16 seqnum = 34352;

con::BufferedPacket p1 = con::makePacket(a, data1,
con::BufferedPacketPtr p1 = con::makePacket(a, data1,
proto_id, peer_id, channel);
/*
We should now have a packet with this data:
@@ -135,10 +135,10 @@ void TestConnection::testHelpers()
Data:
[7] u8 data1[0]
*/
UASSERT(readU32(&p1.data[0]) == proto_id);
UASSERT(readU16(&p1.data[4]) == peer_id);
UASSERT(readU8(&p1.data[6]) == channel);
UASSERT(readU8(&p1.data[7]) == data1[0]);
UASSERT(readU32(&p1->data[0]) == proto_id);
UASSERT(readU16(&p1->data[4]) == peer_id);
UASSERT(readU8(&p1->data[6]) == channel);
UASSERT(readU8(&p1->data[7]) == data1[0]);

//infostream<<"initial data1[0]="<<((u32)data1[0]&0xff)<<std::endl;

58 changes: 32 additions & 26 deletions src/util/pointer.h
Original file line number Diff line number Diff line change
@@ -22,6 +22,21 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "irrlichttypes.h"
#include "debug.h" // For assert()
#include <cstring>
#include <memory> // std::shared_ptr


template<typename T> class ConstSharedPtr {
public:
ConstSharedPtr(T *ptr) : ptr(ptr) {}
ConstSharedPtr(const std::shared_ptr<T> &ptr) : ptr(ptr) {}

const T* get() const noexcept { return ptr.get(); }
const T& operator*() const noexcept { return *ptr.get(); }
const T* operator->() const noexcept { return ptr.get(); }

private:
std::shared_ptr<T> ptr;
};

template <typename T>
class Buffer
@@ -40,17 +55,11 @@ class Buffer
else
data = NULL;
}
Buffer(const Buffer &buffer)
{
m_size = buffer.m_size;
if(m_size != 0)
{
data = new T[buffer.m_size];
memcpy(data, buffer.data, buffer.m_size);
}
else
data = NULL;
}

// Disable class copy
Buffer(const Buffer &) = delete;
Buffer &operator=(const Buffer &) = delete;

Buffer(Buffer &&buffer)
{
m_size = buffer.m_size;
@@ -81,21 +90,6 @@ class Buffer
drop();
}

Buffer& operator=(const Buffer &buffer)
{
if(this == &buffer)
return *this;
drop();
m_size = buffer.m_size;
if(m_size != 0)
{
data = new T[buffer.m_size];
memcpy(data, buffer.data, buffer.m_size);
}
else
data = NULL;
return *this;
}
Buffer& operator=(Buffer &&buffer)
{
if(this == &buffer)
@@ -113,6 +107,18 @@ class Buffer
return *this;
}

void copyTo(Buffer &buffer) const
{
buffer.drop();
buffer.m_size = m_size;
if (m_size != 0) {
buffer.data = new T[m_size];
memcpy(buffer.data, data, m_size);
} else {
buffer.data = nullptr;
}
}

T & operator[](unsigned int i) const
{
return data[i];

0 comments on commit 57a59ae

Please sign in to comment.