| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_posix.h" | 5 #include "ipc/ipc_channel_posix.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <fcntl.h> | 8 #include <fcntl.h> |
| 9 #include <stddef.h> | 9 #include <stddef.h> |
| 10 #include <sys/socket.h> | 10 #include <sys/socket.h> |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 bool Channel::ChannelImpl::Connect() { | 328 bool Channel::ChannelImpl::Connect() { |
| 329 if (server_listen_pipe_ == -1 && pipe_ == -1) { | 329 if (server_listen_pipe_ == -1 && pipe_ == -1) { |
| 330 DLOG(INFO) << "Channel creation failed: " << pipe_name_; | 330 DLOG(INFO) << "Channel creation failed: " << pipe_name_; |
| 331 return false; | 331 return false; |
| 332 } | 332 } |
| 333 | 333 |
| 334 bool did_connect = true; | 334 bool did_connect = true; |
| 335 if (server_listen_pipe_ != -1) { | 335 if (server_listen_pipe_ != -1) { |
| 336 // Watch the pipe for connections, and turn any connections into | 336 // Watch the pipe for connections, and turn any connections into |
| 337 // active sockets. | 337 // active sockets. |
| 338 MessageLoopForIO::current()->WatchFileDescriptor( | 338 base::MessageLoopForIO::current()->WatchFileDescriptor( |
| 339 server_listen_pipe_, | 339 server_listen_pipe_, |
| 340 true, | 340 true, |
| 341 MessageLoopForIO::WATCH_READ, | 341 base::MessageLoopForIO::WATCH_READ, |
| 342 &server_listen_connection_watcher_, | 342 &server_listen_connection_watcher_, |
| 343 this); | 343 this); |
| 344 } else { | 344 } else { |
| 345 did_connect = AcceptConnection(); | 345 did_connect = AcceptConnection(); |
| 346 } | 346 } |
| 347 return did_connect; | 347 return did_connect; |
| 348 } | 348 } |
| 349 | 349 |
| 350 bool Channel::ChannelImpl::ProcessOutgoingMessages() { | 350 bool Channel::ChannelImpl::ProcessOutgoingMessages() { |
| 351 DCHECK(!waiting_connect_); // Why are we trying to send messages if there's | 351 DCHECK(!waiting_connect_); // Why are we trying to send messages if there's |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 } | 462 } |
| 463 | 463 |
| 464 if (static_cast<size_t>(bytes_written) != amt_to_write) { | 464 if (static_cast<size_t>(bytes_written) != amt_to_write) { |
| 465 if (bytes_written > 0) { | 465 if (bytes_written > 0) { |
| 466 // If write() fails with EAGAIN then bytes_written will be -1. | 466 // If write() fails with EAGAIN then bytes_written will be -1. |
| 467 message_send_bytes_written_ += bytes_written; | 467 message_send_bytes_written_ += bytes_written; |
| 468 } | 468 } |
| 469 | 469 |
| 470 // Tell libevent to call us back once things are unblocked. | 470 // Tell libevent to call us back once things are unblocked. |
| 471 is_blocked_on_write_ = true; | 471 is_blocked_on_write_ = true; |
| 472 MessageLoopForIO::current()->WatchFileDescriptor( | 472 base::MessageLoopForIO::current()->WatchFileDescriptor( |
| 473 pipe_, | 473 pipe_, |
| 474 false, // One shot | 474 false, // One shot |
| 475 MessageLoopForIO::WATCH_WRITE, | 475 base::MessageLoopForIO::WATCH_WRITE, |
| 476 &write_watcher_, | 476 &write_watcher_, |
| 477 this); | 477 this); |
| 478 return true; | 478 return true; |
| 479 } else { | 479 } else { |
| 480 message_send_bytes_written_ = 0; | 480 message_send_bytes_written_ = 0; |
| 481 | 481 |
| 482 // Message sent OK! | 482 // Message sent OK! |
| 483 DVLOG(2) << "sent message @" << msg << " on channel @" << this | 483 DVLOG(2) << "sent message @" << msg << " on channel @" << this |
| 484 << " with type " << msg->type() << " on fd " << pipe_; | 484 << " with type " << msg->type() << " on fd " << pipe_; |
| 485 delete output_queue_.front(); | 485 delete output_queue_.front(); |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 660 // Called by libevent when we can write to the pipe without blocking. | 660 // Called by libevent when we can write to the pipe without blocking. |
| 661 void Channel::ChannelImpl::OnFileCanWriteWithoutBlocking(int fd) { | 661 void Channel::ChannelImpl::OnFileCanWriteWithoutBlocking(int fd) { |
| 662 DCHECK_EQ(pipe_, fd); | 662 DCHECK_EQ(pipe_, fd); |
| 663 is_blocked_on_write_ = false; | 663 is_blocked_on_write_ = false; |
| 664 if (!ProcessOutgoingMessages()) { | 664 if (!ProcessOutgoingMessages()) { |
| 665 ClosePipeOnError(); | 665 ClosePipeOnError(); |
| 666 } | 666 } |
| 667 } | 667 } |
| 668 | 668 |
| 669 bool Channel::ChannelImpl::AcceptConnection() { | 669 bool Channel::ChannelImpl::AcceptConnection() { |
| 670 MessageLoopForIO::current()->WatchFileDescriptor(pipe_, | 670 base::MessageLoopForIO::current()->WatchFileDescriptor( |
| 671 true, | 671 pipe_, true, base::MessageLoopForIO::WATCH_READ, &read_watcher_, this); |
| 672 MessageLoopForIO::WATCH_READ, | |
| 673 &read_watcher_, | |
| 674 this); | |
| 675 QueueHelloMessage(); | 672 QueueHelloMessage(); |
| 676 | 673 |
| 677 if (mode_ & MODE_CLIENT_FLAG) { | 674 if (mode_ & MODE_CLIENT_FLAG) { |
| 678 // If we are a client we want to send a hello message out immediately. | 675 // If we are a client we want to send a hello message out immediately. |
| 679 // In server mode we will send a hello message when we receive one from a | 676 // In server mode we will send a hello message when we receive one from a |
| 680 // client. | 677 // client. |
| 681 waiting_connect_ = false; | 678 waiting_connect_ = false; |
| 682 return ProcessOutgoingMessages(); | 679 return ProcessOutgoingMessages(); |
| 683 } else if (mode_ & MODE_SERVER_FLAG) { | 680 } else if (mode_ & MODE_SERVER_FLAG) { |
| 684 waiting_connect_ = true; | 681 waiting_connect_ = true; |
| (...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1027 | 1024 |
| 1028 | 1025 |
| 1029 #if defined(OS_LINUX) | 1026 #if defined(OS_LINUX) |
| 1030 // static | 1027 // static |
| 1031 void Channel::SetGlobalPid(int pid) { | 1028 void Channel::SetGlobalPid(int pid) { |
| 1032 ChannelImpl::SetGlobalPid(pid); | 1029 ChannelImpl::SetGlobalPid(pid); |
| 1033 } | 1030 } |
| 1034 #endif // OS_LINUX | 1031 #endif // OS_LINUX |
| 1035 | 1032 |
| 1036 } // namespace IPC | 1033 } // namespace IPC |
| OLD | NEW |