| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "ipc/ipc_channel_mojo.h" | 5 #include "ipc/ipc_channel_mojo.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 if (task_runner_->RunsTasksOnCurrentThread()) { | 349 if (task_runner_->RunsTasksOnCurrentThread()) { |
| 350 listener_->OnChannelError(); | 350 listener_->OnChannelError(); |
| 351 } else { | 351 } else { |
| 352 task_runner_->PostTask( | 352 task_runner_->PostTask( |
| 353 FROM_HERE, | 353 FROM_HERE, |
| 354 base::Bind(&ChannelMojo::OnPipeError, weak_factory_.GetWeakPtr())); | 354 base::Bind(&ChannelMojo::OnPipeError, weak_factory_.GetWeakPtr())); |
| 355 } | 355 } |
| 356 } | 356 } |
| 357 | 357 |
| 358 bool ChannelMojo::Send(Message* message) { | 358 bool ChannelMojo::Send(Message* message) { |
| 359 bool sent = false; | 359 base::AutoLock lock(lock_); |
| 360 { | 360 if (!message_reader_) { |
| 361 base::AutoLock lock(lock_); | 361 pending_messages_.push_back(base::WrapUnique(message)); |
| 362 if (!message_reader_) { | 362 // Counts as OK before the connection is established, but it's an |
| 363 pending_messages_.push_back(base::WrapUnique(message)); | 363 // error otherwise. |
| 364 // Counts as OK before the connection is established, but it's an | 364 return waiting_connect_; |
| 365 // error otherwise. | |
| 366 return waiting_connect_; | |
| 367 } | |
| 368 | |
| 369 sent = message_reader_->Send(base::WrapUnique(message)); | |
| 370 } | 365 } |
| 371 | 366 |
| 372 if (!sent) { | 367 // Comment copied from ipc_channel_posix.cc: |
| 373 OnPipeError(); | 368 // We can't close the pipe here, because calling OnChannelError may destroy |
| 374 return false; | 369 // this object, and that would be bad if we are called from Send(). Instead, |
| 375 } | 370 // we return false and hope the caller will close the pipe. If they do not, |
| 376 | 371 // the pipe will still be closed next time OnFileCanReadWithoutBlocking is |
| 377 return true; | 372 // called. |
| 373 // |
| 374 // With Mojo, there's no OnFileCanReadWithoutBlocking, but we expect the |
| 375 // pipe's connection error handler will be invoked in its place. |
| 376 return message_reader_->Send(base::WrapUnique(message)); |
| 378 } | 377 } |
| 379 | 378 |
| 380 bool ChannelMojo::IsSendThreadSafe() const { | 379 bool ChannelMojo::IsSendThreadSafe() const { |
| 381 return false; | 380 return false; |
| 382 } | 381 } |
| 383 | 382 |
| 384 base::ProcessId ChannelMojo::GetPeerPID() const { | 383 base::ProcessId ChannelMojo::GetPeerPID() const { |
| 385 base::AutoLock lock(lock_); | 384 base::AutoLock lock(lock_); |
| 386 if (!message_reader_) | 385 if (!message_reader_) |
| 387 return base::kNullProcessId; | 386 return base::kNullProcessId; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 463 DCHECK(ok); | 462 DCHECK(ok); |
| 464 if (!ok) { | 463 if (!ok) { |
| 465 LOG(ERROR) << "Failed to add new Mojo handle."; | 464 LOG(ERROR) << "Failed to add new Mojo handle."; |
| 466 return MOJO_RESULT_UNKNOWN; | 465 return MOJO_RESULT_UNKNOWN; |
| 467 } | 466 } |
| 468 } | 467 } |
| 469 return MOJO_RESULT_OK; | 468 return MOJO_RESULT_OK; |
| 470 } | 469 } |
| 471 | 470 |
| 472 } // namespace IPC | 471 } // namespace IPC |
| OLD | NEW |