Skip to content

Commit 50cd56d

Browse files
tcp: Passing ReadBuffer as rvalue and other optimizations
* Catching exceptions by reference * Replaced asserts with Ensures/Expects
1 parent 812ea7d commit 50cd56d

6 files changed

Lines changed: 40 additions & 37 deletions

File tree

api/net/tcp/connection.hpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ class Connection : public std::enable_shared_from_this<Connection> {
283283
virtual size_t send(Connection&, WriteBuffer&);
284284

285285
/** Read from a Connection [RECEIVE] */
286-
virtual void receive(Connection&, ReadBuffer&);
286+
virtual void receive(Connection&, ReadBuffer&&);
287287

288288
/** Close a Connection [CLOSE] */
289289
virtual void close(Connection&);
@@ -542,8 +542,7 @@ class Connection : public std::enable_shared_from_this<Connection> {
542542
Buffer is cleared for data after every reset.
543543
*/
544544
void read(size_t n, ReadCallback callback) {
545-
ReadBuffer buffer = {new_shared_buffer(n), n};
546-
read(buffer, callback);
545+
read({new_shared_buffer(n), n}, callback);
547546
}
548547

549548
/*
@@ -553,13 +552,13 @@ class Connection : public std::enable_shared_from_this<Connection> {
553552
void read(buffer_t buffer, size_t n, ReadCallback callback)
554553
{ read({buffer, n}, callback); }
555554

556-
void read(ReadBuffer buffer, ReadCallback callback);
555+
void read(ReadBuffer&& buffer, ReadCallback callback);
557556

558557
/*
559558
Assign the read request (read buffer)
560559
*/
561-
void receive(ReadBuffer& buffer)
562-
{ read_request.buffer = {buffer}; }
560+
void receive(ReadBuffer&& buffer)
561+
{ read_request = {buffer}; }
563562

564563
/*
565564
Receive data into the current read requests buffer.

api/net/tcp/connection_states.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ class Connection::Established : public State {
169169

170170
virtual size_t send(Connection&, WriteBuffer&) override;
171171

172-
virtual void receive(Connection&, ReadBuffer&) override;
172+
virtual void receive(Connection&, ReadBuffer&&) override;
173173

174174
virtual void close(Connection&) override;
175175

@@ -207,7 +207,7 @@ class Connection::FinWait1 : public State {
207207
return instance;
208208
}
209209

210-
virtual void receive(Connection&, ReadBuffer&) override;
210+
virtual void receive(Connection&, ReadBuffer&&) override;
211211

212212
virtual void close(Connection&) override;
213213

@@ -246,7 +246,7 @@ class Connection::FinWait2 : public State {
246246
return instance;
247247
}
248248

249-
virtual void receive(Connection&, ReadBuffer&) override;
249+
virtual void receive(Connection&, ReadBuffer&&) override;
250250

251251
virtual void close(Connection&) override;
252252

@@ -284,7 +284,7 @@ class Connection::CloseWait : public State {
284284

285285
virtual size_t send(Connection&, WriteBuffer&) override;
286286

287-
virtual void receive(Connection&, ReadBuffer&) override;
287+
virtual void receive(Connection&, ReadBuffer&&) override;
288288

289289
virtual void close(Connection&) override;
290290

api/net/tcp/read_buffer.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ struct ReadBuffer {
7979
void renew() {
8080
remaining = capacity();
8181
offset = 0;
82-
buffer = buffer_t(new uint8_t[remaining], std::default_delete<uint8_t[]>());
82+
buffer = new_shared_buffer(remaining);
8383
push = false;
8484
}
8585
}; // < ReadBuffer

api/net/tcp/read_request.hpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,22 @@ struct ReadRequest {
3131
ReadBuffer buffer;
3232
ReadCallback callback;
3333

34-
/*ReadRequest()
35-
: buffer(nullptr, 0),
36-
callback({this, &ReadRequest::default_read_callback})
37-
{}*/
34+
ReadRequest()
35+
: buffer{nullptr, 0},
36+
callback{nullptr}
37+
{}
38+
39+
ReadRequest(ReadBuffer buf)
40+
: ReadRequest(buf, nullptr)
41+
{}
3842

3943
ReadRequest(ReadBuffer buf, ReadCallback cb)
4044
: buffer(buf),
4145
callback(cb)
4246
{}
4347

44-
ReadRequest(size_t n = 0)
45-
: buffer(buffer_t(new uint8_t[n], std::default_delete<uint8_t[]>()), n),
48+
ReadRequest(size_t n)
49+
: buffer({new_shared_buffer(n), n}),
4650
callback({this, &ReadRequest::default_read_callback})
4751
{}
4852

src/net/tcp/connection.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -82,29 +82,29 @@ Socket Connection::local() const {
8282
return {host_.address(), local_port_};
8383
}
8484

85-
void Connection::read(ReadBuffer buffer, ReadCallback callback) {
85+
void Connection::read(ReadBuffer&& buffer, ReadCallback callback) {
8686
try {
87-
state_->receive(*this, buffer);
87+
state_->receive(*this, std::forward<ReadBuffer>(buffer));
8888
read_request.callback = callback;
8989
}
90-
catch (TCPException err) {
90+
catch (const TCPException&) {
9191
callback(buffer.buffer, buffer.size());
9292
}
9393
}
9494

9595
size_t Connection::receive(const uint8_t* data, size_t n, bool PUSH) {
9696
//printf("<Connection::receive> len=%u\n", n);
9797
// should not be called without an read request
98-
assert(read_request.buffer.capacity());
99-
assert(n);
98+
Ensures(read_request.buffer.capacity());
99+
Ensures(n);
100100
auto& buf = read_request.buffer;
101101
size_t received{0};
102102
while(n) {
103103
auto read = receive(buf, data+received, n);
104104
// nothing was read to buffer
105105
if(!buf.advance(read)) {
106106
// buffer should be full
107-
assert(buf.full());
107+
Expects(buf.full());
108108
// signal the user
109109
debug2("<Connection::receive> Buffer full - signal user\n");
110110
read_request.callback(buf.buffer, buf.size());
@@ -115,7 +115,7 @@ size_t Connection::receive(const uint8_t* data, size_t n, bool PUSH) {
115115
received += read;
116116
}
117117
// n shouldnt be negative
118-
assert(n == 0);
118+
Expects(n == 0);
119119

120120
// end of data, signal the user
121121
if(PUSH) {
@@ -145,7 +145,7 @@ void Connection::write(WriteBuffer buffer, WriteCallback callback) {
145145
writeq.advance(written);
146146
}
147147
}
148-
catch(TCPException err) {
148+
catch(const TCPException&) {
149149
callback(0);
150150
}
151151
}
@@ -302,7 +302,7 @@ void Connection::open(bool active) {
302302
state_->open(*this, active);
303303
}
304304
// No remote host, or state isnt valid for opening.
305-
catch (TCPException e) {
305+
catch (const TCPException& e) {
306306
debug("<TCP::Connection::open> Cannot open Connection. \n");
307307
signal_error(e);
308308
}
@@ -314,7 +314,7 @@ void Connection::close() {
314314
state_->close(*this);
315315
if(is_state(Closed::instance()))
316316
signal_close();
317-
} catch(TCPException err) {
317+
} catch(const TCPException& err) {
318318
Ensures(on_error_);
319319
signal_error(err);
320320
}
@@ -342,7 +342,7 @@ void Connection::segment_arrived(Packet_ptr incoming) {
342342
try {
343343
parse_options(incoming);
344344
}
345-
catch(TCPBadOptionException err) {
345+
catch(const TCPBadOptionException& err) {
346346
debug("<TCP::Connection::receive> %s \n", err.what());
347347
drop(incoming, err.what());
348348
return;

src/net/tcp/connection_states.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -621,24 +621,24 @@ size_t Connection::CloseWait::send(Connection& tcp, WriteBuffer& buffer) {
621621
*/
622622
/////////////////////////////////////////////////////////////////////
623623

624-
void Connection::State::receive(Connection&, ReadBuffer&) {
624+
void Connection::State::receive(Connection&, ReadBuffer&&) {
625625
throw TCPException{"Connection closing."};
626626
}
627627

628-
void Connection::Established::receive(Connection& tcp, ReadBuffer& buffer) {
629-
tcp.receive(buffer);
628+
void Connection::Established::receive(Connection& tcp, ReadBuffer&& buffer) {
629+
tcp.receive(std::forward<ReadBuffer>(buffer));
630630
}
631631

632-
void Connection::FinWait1::receive(Connection& tcp, ReadBuffer& buffer) {
633-
tcp.receive(buffer);
632+
void Connection::FinWait1::receive(Connection& tcp, ReadBuffer&& buffer) {
633+
tcp.receive(std::forward<ReadBuffer>(buffer));
634634
}
635635

636-
void Connection::FinWait2::receive(Connection& tcp, ReadBuffer& buffer) {
637-
tcp.receive(buffer);
636+
void Connection::FinWait2::receive(Connection& tcp, ReadBuffer&& buffer) {
637+
tcp.receive(std::forward<ReadBuffer>(buffer));
638638
}
639639

640-
void Connection::CloseWait::receive(Connection& tcp, ReadBuffer& buffer) {
641-
tcp.receive(buffer);
640+
void Connection::CloseWait::receive(Connection& tcp, ReadBuffer&& buffer) {
641+
tcp.receive(std::forward<ReadBuffer>(buffer));
642642
}
643643

644644
/////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)