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

Unified Diff: net/socket/socket_posix.cc

Issue 2593063003: Add Socket::ReadIfReady() (Closed)
Patch Set: Fix tests for real Created 3 years, 11 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
Index: net/socket/socket_posix.cc
diff --git a/net/socket/socket_posix.cc b/net/socket/socket_posix.cc
index 09d9baec87e0139e41226b8a1b8b5a8de5c6a6c6..aac5fbabc103e8fc1b660da10912bc197c19789b 100644
--- a/net/socket/socket_posix.cc
+++ b/net/socket/socket_posix.cc
@@ -275,6 +275,16 @@ int SocketPosix::Read(IOBuffer* buf,
return ERR_IO_PENDING;
}
+int SocketPosix::ReadIfReady(IOBuffer* buf,
+ int buf_len,
+ const CompletionCallback& callback) {
+ // Reuse Read() but do not hold on to |buf| and |buf_len|.
+ int rv = Read(buf, buf_len, callback);
+ read_buf_ = nullptr;
+ read_buf_len_ = 0;
+ return rv;
+}
davidben 2017/02/01 22:25:57 Nit: It might be a little clearer to make lines 25
xunjieli 2017/02/03 16:35:33 Done. I like your approach better. It's easier to
+
int SocketPosix::Write(IOBuffer* buf,
int buf_len,
const CompletionCallback& callback) {
@@ -451,6 +461,14 @@ int SocketPosix::DoRead(IOBuffer* buf, int buf_len) {
}
void SocketPosix::ReadCompleted() {
+ // If |read_buf_| is nullptr, ReadIfReady() is used instead of Read(), so
+ // do not continue reading but wait for the caller to retry.
+ if (read_buf_ == nullptr) {
+ bool ok = read_socket_watcher_.StopWatchingFileDescriptor();
+ DCHECK(ok);
+ base::ResetAndReturn(&read_callback_).Run(OK);
+ return;
+ }
int rv = DoRead(read_buf_.get(), read_buf_len_);
if (rv == ERR_IO_PENDING)
return;

Powered by Google App Engine
This is Rietveld 408576698