Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(322)

Unified Diff: webrtc/base/asynctcpsocket.cc

Issue 1741413002: Lazily allocate output buffer for AsyncTCPSocket. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/base/asynctcpsocket.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/base/asynctcpsocket.cc
diff --git a/webrtc/base/asynctcpsocket.cc b/webrtc/base/asynctcpsocket.cc
index 7ec6dc8bc284053bab81782c0c7d235504c57f2f..31dec92367fc1c876e1b1c4fba1c92eb49b8c91f 100644
--- a/webrtc/base/asynctcpsocket.cc
+++ b/webrtc/base/asynctcpsocket.cc
@@ -55,12 +55,10 @@ AsyncTCPSocketBase::AsyncTCPSocketBase(AsyncSocket* socket, bool listen,
listen_(listen),
insize_(max_packet_size),
inpos_(0),
- outsize_(max_packet_size),
- outpos_(0) {
+ max_outsize_(max_packet_size) {
if (!listen_) {
// Listening sockets don't send/receive data, so they don't need buffers.
inbuf_.reset(new char[insize_]);
- outbuf_.reset(new char[outsize_]);
}
RTC_DCHECK(socket_.get() != NULL);
@@ -138,41 +136,39 @@ int AsyncTCPSocketBase::SendTo(const void *pv, size_t cb,
}
int AsyncTCPSocketBase::SendRaw(const void * pv, size_t cb) {
- if (outpos_ + cb > outsize_) {
+ if (outbuf_.size() + cb > max_outsize_) {
socket_->SetError(EMSGSIZE);
return -1;
}
- RTC_DCHECK(outbuf_.get());
- memcpy(outbuf_.get() + outpos_, pv, cb);
- outpos_ += cb;
+ RTC_DCHECK(!listen_);
+ outbuf_.AppendData(static_cast<const uint8_t*>(pv), cb);
return FlushOutBuffer();
}
int AsyncTCPSocketBase::FlushOutBuffer() {
- RTC_DCHECK(outbuf_.get());
- int res = socket_->Send(outbuf_.get(), outpos_);
+ RTC_DCHECK(!listen_);
+ int res = socket_->Send(outbuf_.data(), outbuf_.size());
if (res <= 0) {
return res;
}
- if (static_cast<size_t>(res) <= outpos_) {
- outpos_ -= res;
- } else {
+ if (static_cast<size_t>(res) > outbuf_.size()) {
RTC_NOTREACHED();
return -1;
}
- if (outpos_ > 0) {
- memmove(outbuf_.get(), outbuf_.get() + res, outpos_);
+ size_t new_size = outbuf_.size() - res;
+ if (new_size > 0) {
+ memmove(outbuf_.data(), outbuf_.data() + res, new_size);
}
+ outbuf_.SetSize(new_size);
return res;
}
void AsyncTCPSocketBase::AppendToOutBuffer(const void* pv, size_t cb) {
- RTC_DCHECK(outpos_ + cb < outsize_);
- RTC_DCHECK(outbuf_.get());
- memcpy(outbuf_.get() + outpos_, pv, cb);
- outpos_ += cb;
+ RTC_DCHECK(outbuf_.size() + cb <= max_outsize_);
+ RTC_DCHECK(!listen_);
+ outbuf_.AppendData(static_cast<const uint8_t*>(pv), cb);
}
void AsyncTCPSocketBase::OnConnectEvent(AsyncSocket* socket) {
@@ -222,11 +218,11 @@ void AsyncTCPSocketBase::OnReadEvent(AsyncSocket* socket) {
void AsyncTCPSocketBase::OnWriteEvent(AsyncSocket* socket) {
RTC_DCHECK(socket_.get() == socket);
- if (outpos_ > 0) {
+ if (outbuf_.size() > 0) {
FlushOutBuffer();
}
- if (outpos_ == 0) {
+ if (outbuf_.size() == 0) {
SignalReadyToSend(this);
}
}
« no previous file with comments | « webrtc/base/asynctcpsocket.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698