| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "mojo/edk/system/channel.h" | 5 #include "mojo/edk/system/channel.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <sys/socket.h> | 8 #include <sys/socket.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 io_task_runner_(io_task_runner) | 96 io_task_runner_(io_task_runner) |
| 97 #if defined(OS_MACOSX) | 97 #if defined(OS_MACOSX) |
| 98 , | 98 , |
| 99 handles_to_close_(new PlatformHandleVector) | 99 handles_to_close_(new PlatformHandleVector) |
| 100 #endif | 100 #endif |
| 101 { | 101 { |
| 102 CHECK(handle_.is_valid()); | 102 CHECK(handle_.is_valid()); |
| 103 } | 103 } |
| 104 | 104 |
| 105 void Start() override { | 105 void Start() override { |
| 106 if (io_task_runner_->RunsTasksOnCurrentThread()) { | 106 if (io_task_runner_->RunsTasksInCurrentSequence()) { |
| 107 StartOnIOThread(); | 107 StartOnIOThread(); |
| 108 } else { | 108 } else { |
| 109 io_task_runner_->PostTask( | 109 io_task_runner_->PostTask( |
| 110 FROM_HERE, base::Bind(&ChannelPosix::StartOnIOThread, this)); | 110 FROM_HERE, base::Bind(&ChannelPosix::StartOnIOThread, this)); |
| 111 } | 111 } |
| 112 } | 112 } |
| 113 | 113 |
| 114 void ShutDownImpl() override { | 114 void ShutDownImpl() override { |
| 115 // Always shut down asynchronously when called through the public interface. | 115 // Always shut down asynchronously when called through the public interface. |
| 116 io_task_runner_->PostTask( | 116 io_task_runner_->PostTask( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 132 } | 132 } |
| 133 if (write_error) { | 133 if (write_error) { |
| 134 // Do not synchronously invoke OnError(). Write() may have been called by | 134 // Do not synchronously invoke OnError(). Write() may have been called by |
| 135 // the delegate and we don't want to re-enter it. | 135 // the delegate and we don't want to re-enter it. |
| 136 io_task_runner_->PostTask(FROM_HERE, | 136 io_task_runner_->PostTask(FROM_HERE, |
| 137 base::Bind(&ChannelPosix::OnError, this)); | 137 base::Bind(&ChannelPosix::OnError, this)); |
| 138 } | 138 } |
| 139 } | 139 } |
| 140 | 140 |
| 141 void LeakHandle() override { | 141 void LeakHandle() override { |
| 142 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 142 DCHECK(io_task_runner_->RunsTasksInCurrentSequence()); |
| 143 leak_handle_ = true; | 143 leak_handle_ = true; |
| 144 } | 144 } |
| 145 | 145 |
| 146 bool GetReadPlatformHandles( | 146 bool GetReadPlatformHandles( |
| 147 size_t num_handles, | 147 size_t num_handles, |
| 148 const void* extra_header, | 148 const void* extra_header, |
| 149 size_t extra_header_size, | 149 size_t extra_header_size, |
| 150 ScopedPlatformHandleVectorPtr* handles) override { | 150 ScopedPlatformHandleVectorPtr* handles) override { |
| 151 if (num_handles > std::numeric_limits<uint16_t>::max()) | 151 if (num_handles > std::numeric_limits<uint16_t>::max()) |
| 152 return false; | 152 return false; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 void WaitForWriteOnIOThread() { | 232 void WaitForWriteOnIOThread() { |
| 233 base::AutoLock lock(write_lock_); | 233 base::AutoLock lock(write_lock_); |
| 234 WaitForWriteOnIOThreadNoLock(); | 234 WaitForWriteOnIOThreadNoLock(); |
| 235 } | 235 } |
| 236 | 236 |
| 237 void WaitForWriteOnIOThreadNoLock() { | 237 void WaitForWriteOnIOThreadNoLock() { |
| 238 if (pending_write_) | 238 if (pending_write_) |
| 239 return; | 239 return; |
| 240 if (!write_watcher_) | 240 if (!write_watcher_) |
| 241 return; | 241 return; |
| 242 if (io_task_runner_->RunsTasksOnCurrentThread()) { | 242 if (io_task_runner_->RunsTasksInCurrentSequence()) { |
| 243 pending_write_ = true; | 243 pending_write_ = true; |
| 244 base::MessageLoopForIO::current()->WatchFileDescriptor( | 244 base::MessageLoopForIO::current()->WatchFileDescriptor( |
| 245 handle_.get().handle, false /* persistent */, | 245 handle_.get().handle, false /* persistent */, |
| 246 base::MessageLoopForIO::WATCH_WRITE, write_watcher_.get(), this); | 246 base::MessageLoopForIO::WATCH_WRITE, write_watcher_.get(), this); |
| 247 } else { | 247 } else { |
| 248 io_task_runner_->PostTask( | 248 io_task_runner_->PostTask( |
| 249 FROM_HERE, base::Bind(&ChannelPosix::WaitForWriteOnIOThread, this)); | 249 FROM_HERE, base::Bind(&ChannelPosix::WaitForWriteOnIOThread, this)); |
| 250 } | 250 } |
| 251 } | 251 } |
| 252 | 252 |
| 253 void ShutDownOnIOThread() { | 253 void ShutDownOnIOThread() { |
| 254 base::MessageLoop::current()->RemoveDestructionObserver(this); | 254 base::MessageLoop::current()->RemoveDestructionObserver(this); |
| 255 | 255 |
| 256 read_watcher_.reset(); | 256 read_watcher_.reset(); |
| 257 write_watcher_.reset(); | 257 write_watcher_.reset(); |
| 258 if (leak_handle_) | 258 if (leak_handle_) |
| 259 ignore_result(handle_.release()); | 259 ignore_result(handle_.release()); |
| 260 handle_.reset(); | 260 handle_.reset(); |
| 261 #if defined(OS_MACOSX) | 261 #if defined(OS_MACOSX) |
| 262 handles_to_close_.reset(); | 262 handles_to_close_.reset(); |
| 263 #endif | 263 #endif |
| 264 | 264 |
| 265 // May destroy the |this| if it was the last reference. | 265 // May destroy the |this| if it was the last reference. |
| 266 self_ = nullptr; | 266 self_ = nullptr; |
| 267 } | 267 } |
| 268 | 268 |
| 269 // base::MessageLoop::DestructionObserver: | 269 // base::MessageLoop::DestructionObserver: |
| 270 void WillDestroyCurrentMessageLoop() override { | 270 void WillDestroyCurrentMessageLoop() override { |
| 271 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 271 DCHECK(io_task_runner_->RunsTasksInCurrentSequence()); |
| 272 if (self_) | 272 if (self_) |
| 273 ShutDownOnIOThread(); | 273 ShutDownOnIOThread(); |
| 274 } | 274 } |
| 275 | 275 |
| 276 // base::MessageLoopForIO::Watcher: | 276 // base::MessageLoopForIO::Watcher: |
| 277 void OnFileCanReadWithoutBlocking(int fd) override { | 277 void OnFileCanReadWithoutBlocking(int fd) override { |
| 278 CHECK_EQ(fd, handle_.get().handle); | 278 CHECK_EQ(fd, handle_.get().handle); |
| 279 if (handle_.get().needs_connection) { | 279 if (handle_.get().needs_connection) { |
| 280 #if !defined(OS_NACL) | 280 #if !defined(OS_NACL) |
| 281 read_watcher_.reset(); | 281 read_watcher_.reset(); |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 563 scoped_refptr<Channel> Channel::Create( | 563 scoped_refptr<Channel> Channel::Create( |
| 564 Delegate* delegate, | 564 Delegate* delegate, |
| 565 ConnectionParams connection_params, | 565 ConnectionParams connection_params, |
| 566 scoped_refptr<base::TaskRunner> io_task_runner) { | 566 scoped_refptr<base::TaskRunner> io_task_runner) { |
| 567 return new ChannelPosix(delegate, std::move(connection_params), | 567 return new ChannelPosix(delegate, std::move(connection_params), |
| 568 io_task_runner); | 568 io_task_runner); |
| 569 } | 569 } |
| 570 | 570 |
| 571 } // namespace edk | 571 } // namespace edk |
| 572 } // namespace mojo | 572 } // namespace mojo |
| OLD | NEW |