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

Side by Side 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, 9 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 unified diff | Download patch
« no previous file with comments | « webrtc/base/asynctcpsocket.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 } 48 }
49 return owned_socket.release(); 49 return owned_socket.release();
50 } 50 }
51 51
52 AsyncTCPSocketBase::AsyncTCPSocketBase(AsyncSocket* socket, bool listen, 52 AsyncTCPSocketBase::AsyncTCPSocketBase(AsyncSocket* socket, bool listen,
53 size_t max_packet_size) 53 size_t max_packet_size)
54 : socket_(socket), 54 : socket_(socket),
55 listen_(listen), 55 listen_(listen),
56 insize_(max_packet_size), 56 insize_(max_packet_size),
57 inpos_(0), 57 inpos_(0),
58 outsize_(max_packet_size), 58 max_outsize_(max_packet_size) {
59 outpos_(0) {
60 if (!listen_) { 59 if (!listen_) {
61 // Listening sockets don't send/receive data, so they don't need buffers. 60 // Listening sockets don't send/receive data, so they don't need buffers.
62 inbuf_.reset(new char[insize_]); 61 inbuf_.reset(new char[insize_]);
63 outbuf_.reset(new char[outsize_]);
64 } 62 }
65 63
66 RTC_DCHECK(socket_.get() != NULL); 64 RTC_DCHECK(socket_.get() != NULL);
67 socket_->SignalConnectEvent.connect( 65 socket_->SignalConnectEvent.connect(
68 this, &AsyncTCPSocketBase::OnConnectEvent); 66 this, &AsyncTCPSocketBase::OnConnectEvent);
69 socket_->SignalReadEvent.connect(this, &AsyncTCPSocketBase::OnReadEvent); 67 socket_->SignalReadEvent.connect(this, &AsyncTCPSocketBase::OnReadEvent);
70 socket_->SignalWriteEvent.connect(this, &AsyncTCPSocketBase::OnWriteEvent); 68 socket_->SignalWriteEvent.connect(this, &AsyncTCPSocketBase::OnWriteEvent);
71 socket_->SignalCloseEvent.connect(this, &AsyncTCPSocketBase::OnCloseEvent); 69 socket_->SignalCloseEvent.connect(this, &AsyncTCPSocketBase::OnCloseEvent);
72 70
73 if (listen_) { 71 if (listen_) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 const SocketAddress& remote_address = GetRemoteAddress(); 129 const SocketAddress& remote_address = GetRemoteAddress();
132 if (addr == remote_address) 130 if (addr == remote_address)
133 return Send(pv, cb, options); 131 return Send(pv, cb, options);
134 // Remote address may be empty if there is a sudden network change. 132 // Remote address may be empty if there is a sudden network change.
135 RTC_DCHECK(remote_address.IsNil()); 133 RTC_DCHECK(remote_address.IsNil());
136 socket_->SetError(ENOTCONN); 134 socket_->SetError(ENOTCONN);
137 return -1; 135 return -1;
138 } 136 }
139 137
140 int AsyncTCPSocketBase::SendRaw(const void * pv, size_t cb) { 138 int AsyncTCPSocketBase::SendRaw(const void * pv, size_t cb) {
141 if (outpos_ + cb > outsize_) { 139 if (outbuf_.size() + cb > max_outsize_) {
142 socket_->SetError(EMSGSIZE); 140 socket_->SetError(EMSGSIZE);
143 return -1; 141 return -1;
144 } 142 }
145 143
146 RTC_DCHECK(outbuf_.get()); 144 RTC_DCHECK(!listen_);
147 memcpy(outbuf_.get() + outpos_, pv, cb); 145 outbuf_.AppendData(static_cast<const uint8_t*>(pv), cb);
148 outpos_ += cb;
149 146
150 return FlushOutBuffer(); 147 return FlushOutBuffer();
151 } 148 }
152 149
153 int AsyncTCPSocketBase::FlushOutBuffer() { 150 int AsyncTCPSocketBase::FlushOutBuffer() {
154 RTC_DCHECK(outbuf_.get()); 151 RTC_DCHECK(!listen_);
155 int res = socket_->Send(outbuf_.get(), outpos_); 152 int res = socket_->Send(outbuf_.data(), outbuf_.size());
156 if (res <= 0) { 153 if (res <= 0) {
157 return res; 154 return res;
158 } 155 }
159 if (static_cast<size_t>(res) <= outpos_) { 156 if (static_cast<size_t>(res) > outbuf_.size()) {
160 outpos_ -= res;
161 } else {
162 RTC_NOTREACHED(); 157 RTC_NOTREACHED();
163 return -1; 158 return -1;
164 } 159 }
165 if (outpos_ > 0) { 160 size_t new_size = outbuf_.size() - res;
166 memmove(outbuf_.get(), outbuf_.get() + res, outpos_); 161 if (new_size > 0) {
162 memmove(outbuf_.data(), outbuf_.data() + res, new_size);
167 } 163 }
164 outbuf_.SetSize(new_size);
168 return res; 165 return res;
169 } 166 }
170 167
171 void AsyncTCPSocketBase::AppendToOutBuffer(const void* pv, size_t cb) { 168 void AsyncTCPSocketBase::AppendToOutBuffer(const void* pv, size_t cb) {
172 RTC_DCHECK(outpos_ + cb < outsize_); 169 RTC_DCHECK(outbuf_.size() + cb <= max_outsize_);
173 RTC_DCHECK(outbuf_.get()); 170 RTC_DCHECK(!listen_);
174 memcpy(outbuf_.get() + outpos_, pv, cb); 171 outbuf_.AppendData(static_cast<const uint8_t*>(pv), cb);
175 outpos_ += cb;
176 } 172 }
177 173
178 void AsyncTCPSocketBase::OnConnectEvent(AsyncSocket* socket) { 174 void AsyncTCPSocketBase::OnConnectEvent(AsyncSocket* socket) {
179 SignalConnect(this); 175 SignalConnect(this);
180 } 176 }
181 177
182 void AsyncTCPSocketBase::OnReadEvent(AsyncSocket* socket) { 178 void AsyncTCPSocketBase::OnReadEvent(AsyncSocket* socket) {
183 RTC_DCHECK(socket_.get() == socket); 179 RTC_DCHECK(socket_.get() == socket);
184 180
185 if (listen_) { 181 if (listen_) {
(...skipping 29 matching lines...) Expand all
215 LOG(LS_ERROR) << "input buffer overflow"; 211 LOG(LS_ERROR) << "input buffer overflow";
216 RTC_NOTREACHED(); 212 RTC_NOTREACHED();
217 inpos_ = 0; 213 inpos_ = 0;
218 } 214 }
219 } 215 }
220 } 216 }
221 217
222 void AsyncTCPSocketBase::OnWriteEvent(AsyncSocket* socket) { 218 void AsyncTCPSocketBase::OnWriteEvent(AsyncSocket* socket) {
223 RTC_DCHECK(socket_.get() == socket); 219 RTC_DCHECK(socket_.get() == socket);
224 220
225 if (outpos_ > 0) { 221 if (outbuf_.size() > 0) {
226 FlushOutBuffer(); 222 FlushOutBuffer();
227 } 223 }
228 224
229 if (outpos_ == 0) { 225 if (outbuf_.size() == 0) {
230 SignalReadyToSend(this); 226 SignalReadyToSend(this);
231 } 227 }
232 } 228 }
233 229
234 void AsyncTCPSocketBase::OnCloseEvent(AsyncSocket* socket, int error) { 230 void AsyncTCPSocketBase::OnCloseEvent(AsyncSocket* socket, int error) {
235 SignalClose(this, error); 231 SignalClose(this, error);
236 } 232 }
237 233
238 // AsyncTCPSocket 234 // AsyncTCPSocket
239 // Binds and connects |socket| and creates AsyncTCPSocket for 235 // Binds and connects |socket| and creates AsyncTCPSocket for
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 memmove(data, data + kPacketLenSize + pkt_len, *len); 295 memmove(data, data + kPacketLenSize + pkt_len, *len);
300 } 296 }
301 } 297 }
302 } 298 }
303 299
304 void AsyncTCPSocket::HandleIncomingConnection(AsyncSocket* socket) { 300 void AsyncTCPSocket::HandleIncomingConnection(AsyncSocket* socket) {
305 SignalNewConnection(this, new AsyncTCPSocket(socket, false)); 301 SignalNewConnection(this, new AsyncTCPSocket(socket, false));
306 } 302 }
307 303
308 } // namespace rtc 304 } // namespace rtc
OLDNEW
« 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