summaryrefslogtreecommitdiffstats
path: root/chrome/common
diff options
context:
space:
mode:
authorrvargas@google.com <rvargas@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-01-29 00:07:06 +0000
committerrvargas@google.com <rvargas@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-01-29 00:07:06 +0000
commitc1e4bff3d7cfd8c386a9cd002b4bbe505233b39c (patch)
tree599e0c175319d4c40e1fd695c9ecd55b3a4f9d55 /chrome/common
parent98e72142d06252169a27570cf448639889c66dc6 (diff)
downloadchromium_src-c1e4bff3d7cfd8c386a9cd002b4bbe505233b39c.zip
chromium_src-c1e4bff3d7cfd8c386a9cd002b4bbe505233b39c.tar.gz
chromium_src-c1e4bff3d7cfd8c386a9cd002b4bbe505233b39c.tar.bz2
Add thread checks to the IPC channel.
Almost every method of the IPC channel must be invoked from a single thread. This adds the corresponding DCHECKS, and should confirm bug 6489 as a cause of flakiness on the UI tests. BUG: 6489. Review URL: http://codereview.chromium.org/19617 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@8837 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/common')
-rw-r--r--chrome/common/ipc_channel_win.cc13
-rw-r--r--chrome/common/ipc_channel_win.h4
2 files changed, 17 insertions, 0 deletions
diff --git a/chrome/common/ipc_channel_win.cc b/chrome/common/ipc_channel_win.cc
index a38305a..dfccc33 100644
--- a/chrome/common/ipc_channel_win.cc
+++ b/chrome/common/ipc_channel_win.cc
@@ -9,6 +9,7 @@
#include "base/compiler_specific.h"
#include "base/logging.h"
+#include "base/non_thread_safe.h"
#include "base/win_util.h"
#include "chrome/common/chrome_counters.h"
#include "chrome/common/ipc_logging.h"
@@ -46,6 +47,10 @@ Channel::ChannelImpl::ChannelImpl(const std::wstring& channel_id, Mode mode,
}
void Channel::ChannelImpl::Close() {
+ if (thread_check_.get()) {
+ DCHECK(thread_check_->CalledOnValidThread());
+ }
+
bool waited = false;
if (input_state_.is_pending || output_state_.is_pending) {
CancelIo(pipe_);
@@ -77,6 +82,7 @@ void Channel::ChannelImpl::Close() {
}
bool Channel::ChannelImpl::Send(Message* message) {
+ DCHECK(thread_check_->CalledOnValidThread());
chrome::Counters::ipc_send_counter().Increment();
#ifdef IPC_MESSAGE_DEBUG_EXTRA
DLOG(INFO) << "sending message @" << message << " on channel @" << this
@@ -167,6 +173,9 @@ bool Channel::ChannelImpl::CreatePipe(const std::wstring& channel_id,
bool Channel::ChannelImpl::Connect() {
DLOG(WARNING) << "Connect called twice";
+ if (!thread_check_.get())
+ thread_check_.reset(new NonThreadSafe());
+
if (pipe_ == INVALID_HANDLE_VALUE)
return false;
@@ -190,6 +199,7 @@ bool Channel::ChannelImpl::Connect() {
}
bool Channel::ChannelImpl::ProcessConnection() {
+ DCHECK(thread_check_->CalledOnValidThread());
if (input_state_.is_pending)
input_state_.is_pending = false;
@@ -225,6 +235,7 @@ bool Channel::ChannelImpl::ProcessConnection() {
bool Channel::ChannelImpl::ProcessIncomingMessages(
MessageLoopForIO::IOContext* context,
DWORD bytes_read) {
+ DCHECK(thread_check_->CalledOnValidThread());
if (input_state_.is_pending) {
input_state_.is_pending = false;
DCHECK(context);
@@ -313,6 +324,7 @@ bool Channel::ChannelImpl::ProcessOutgoingMessages(
DWORD bytes_written) {
DCHECK(!waiting_connect_); // Why are we trying to send messages if there's
// no connection?
+ DCHECK(thread_check_->CalledOnValidThread());
if (output_state_.is_pending) {
DCHECK(context);
@@ -370,6 +382,7 @@ bool Channel::ChannelImpl::ProcessOutgoingMessages(
void Channel::ChannelImpl::OnIOCompleted(MessageLoopForIO::IOContext* context,
DWORD bytes_transfered, DWORD error) {
bool ok;
+ DCHECK(thread_check_->CalledOnValidThread());
if (context == &input_state_.context) {
if (waiting_connect_) {
if (!ProcessConnection())
diff --git a/chrome/common/ipc_channel_win.h b/chrome/common/ipc_channel_win.h
index fcd8abe..2a601e1 100644
--- a/chrome/common/ipc_channel_win.h
+++ b/chrome/common/ipc_channel_win.h
@@ -12,6 +12,8 @@
#include "base/message_loop.h"
+class NonThreadSafe;
+
namespace IPC {
class Channel::ChannelImpl : public MessageLoopForIO::IOHandler {
@@ -73,6 +75,8 @@ class Channel::ChannelImpl : public MessageLoopForIO::IOHandler {
ScopedRunnableMethodFactory<ChannelImpl> factory_;
+ scoped_ptr<NonThreadSafe> thread_check_;
+
DISALLOW_COPY_AND_ASSIGN(ChannelImpl);
};