Index: chrome/browser/extensions/api/messaging/native_message_process_host.cc |
diff --git a/chrome/browser/extensions/api/messaging/native_message_process_host.cc b/chrome/browser/extensions/api/messaging/native_message_process_host.cc |
index b4993dc5c8c770a607d03c9b9f529b9176e49ce8..15b02ec4489ebcbb5c93e59358973c2963f3f2d9 100644 |
--- a/chrome/browser/extensions/api/messaging/native_message_process_host.cc |
+++ b/chrome/browser/extensions/api/messaging/native_message_process_host.cc |
@@ -7,7 +7,6 @@ |
#include "base/bind.h" |
#include "base/files/file_path.h" |
#include "base/logging.h" |
-#include "base/platform_file.h" |
#include "base/prefs/pref_service.h" |
#include "base/process/kill.h" |
#include "base/threading/sequenced_worker_pool.h" |
@@ -102,13 +101,11 @@ NativeMessageProcessHost::NativeMessageProcessHost( |
native_host_name_(native_host_name), |
destination_port_(destination_port), |
launcher_(launcher.Pass()), |
- closed_(false), |
process_handle_(base::kNullProcessHandle), |
-#if defined(OS_POSIX) |
- read_file_(base::kInvalidPlatformFileValue), |
-#endif |
+ closed_(false), |
read_pending_(false), |
- write_pending_(false) { |
+ write_pending_(false), |
+ direct_read_for_test_(false) { |
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
// It's safe to use base::Unretained() here because NativeMessagePort always |
@@ -188,10 +185,6 @@ void NativeMessageProcessHost::OnHostProcessLaunched( |
} |
process_handle_ = process_handle; |
-#if defined(OS_POSIX) |
- // This object is not the owner of the file so it should not keep an fd. |
- read_file_ = read_file.GetPlatformFile(); |
-#endif |
scoped_refptr<base::TaskRunner> task_runner( |
content::BrowserThread::GetBlockingPool()-> |
@@ -230,19 +223,8 @@ void NativeMessageProcessHost::Send(const std::string& json) { |
DoWrite(); |
} |
-#if defined(OS_POSIX) |
-void NativeMessageProcessHost::OnFileCanReadWithoutBlocking(int fd) { |
- DCHECK_EQ(fd, read_file_); |
- DoRead(); |
-} |
- |
-void NativeMessageProcessHost::OnFileCanWriteWithoutBlocking(int fd) { |
- NOTREACHED(); |
-} |
-#endif // !defined(OS_POSIX) |
- |
-void NativeMessageProcessHost::ReadNowForTesting() { |
- DoRead(); |
+void NativeMessageProcessHost::DontWaitToReadForTesting() { |
+ direct_read_for_test_ = true; |
} |
void NativeMessageProcessHost::WaitRead() { |
@@ -250,18 +232,7 @@ void NativeMessageProcessHost::WaitRead() { |
return; |
DCHECK(!read_pending_); |
- |
- // On POSIX FileStream::Read() uses blocking thread pool, so it's better to |
- // wait for the file to become readable before calling DoRead(). Otherwise it |
- // would always be consuming one thread in the thread pool. On Windows |
- // FileStream uses overlapped IO, so that optimization isn't necessary there. |
-#if defined(OS_POSIX) |
- base::MessageLoopForIO::current()->WatchFileDescriptor( |
- read_file_, false /* persistent */, |
- base::MessageLoopForIO::WATCH_READ, &read_watcher_, this); |
-#else // defined(OS_POSIX) |
DoRead(); |
-#endif // defined(!OS_POSIX) |
} |
void NativeMessageProcessHost::DoRead() { |
@@ -269,10 +240,20 @@ void NativeMessageProcessHost::DoRead() { |
while (!closed_ && !read_pending_) { |
read_buffer_ = new net::IOBuffer(kReadBufferSize); |
- int result = read_stream_->Read( |
- read_buffer_.get(), |
- kReadBufferSize, |
- base::Bind(&NativeMessageProcessHost::OnRead, base::Unretained(this))); |
+ int result; |
+ if (direct_read_for_test_) { |
+ result = read_stream_->Read( |
+ read_buffer_.get(), |
+ kReadBufferSize, |
+ base::Bind(&NativeMessageProcessHost::OnRead, |
+ base::Unretained(this))); |
+ } else { |
+ result = read_stream_->ReadNonBlocking( |
+ read_buffer_.get(), |
+ kReadBufferSize, |
+ base::Bind(&NativeMessageProcessHost::OnRead, |
+ base::Unretained(this))); |
+ } |
HandleReadResult(result); |
} |
} |