Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(214)

Side by Side Diff: chrome/browser/browser_message_filter.cc

Issue 5541005: Make BrowserMessageFilter support dispatching messages on different threads. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "chrome/browser/browser_io_message_filter.h" 5 #include "chrome/browser/browser_message_filter.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/process.h"
8 #include "base/process_util.h" 9 #include "base/process_util.h"
9 #include "chrome/browser/renderer_host/browser_render_process_host.h" 10 #include "chrome/browser/renderer_host/browser_render_process_host.h"
10 11
11 BrowserIOMessageFilter::BrowserIOMessageFilter() : channel_(NULL) { 12 BrowserMessageFilter::BrowserMessageFilter()
13 : channel_(NULL), peer_handle_(base::kNullProcessHandle) {
12 } 14 }
13 15
14 BrowserIOMessageFilter::~BrowserIOMessageFilter() { 16 BrowserMessageFilter::~BrowserMessageFilter() {
15 } 17 }
16 18
17 void BrowserIOMessageFilter::OnFilterAdded(IPC::Channel* channel) { 19 void BrowserMessageFilter::OnFilterAdded(IPC::Channel* channel) {
18 channel_ = channel; 20 channel_ = channel;
19 } 21 }
20 22
21 void BrowserIOMessageFilter::OnChannelClosing() { 23 void BrowserMessageFilter::OnChannelClosing() {
22 channel_ = NULL; 24 channel_ = NULL;
23 } 25 }
24 26
25 void BrowserIOMessageFilter::OnChannelConnected(int32 peer_pid) { 27 void BrowserMessageFilter::OnChannelConnected(int32 peer_pid) {
26 if (!base::OpenProcessHandle(peer_pid, &peer_handle_)) { 28 if (!base::OpenProcessHandle(peer_pid, &peer_handle_)) {
27 NOTREACHED(); 29 NOTREACHED();
28 } 30 }
29 } 31 }
30 32
31 bool BrowserIOMessageFilter::Send(IPC::Message* msg) { 33 bool BrowserMessageFilter::Send(IPC::Message* message) {
34 if (message->is_sync()) {
35 // We don't support sending synchronous messages from the browser. If we
36 // really needed it, we can make this class derive from SyncMessageFilter
37 // but it seems better to not allow sending synchronous messages from the
38 // browser, since it might allow a corrupt/malicious renderer to hang us.
39 NOTREACHED() << "Can't send sync message through BrowserMessageFilter!";
40 return false;
41 }
42
43 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
44 BrowserThread::PostTask(
45 BrowserThread::IO,
46 FROM_HERE,
47 NewRunnableMethod(this, &BrowserMessageFilter::Send, message));
48 return true;
49 }
50
32 if (channel_) 51 if (channel_)
33 return channel_->Send(msg); 52 return channel_->Send(message);
34 53
35 delete msg; 54 delete message;
36 return false; 55 return false;
37 } 56 }
38 57
39 void BrowserIOMessageFilter::BadMessageReceived(uint32 msg_type) { 58 BrowserThread::ID BrowserMessageFilter::HandleMessageOnThread(
59 const IPC::Message& message) {
60 return BrowserThread::IO;
61 }
62
63 bool BrowserMessageFilter::OnMessageReceived(const IPC::Message& message) {
64 BrowserThread::ID thread = HandleMessageOnThread(message);
65 if (thread == BrowserThread::IO)
66 return DispatchMessage(message);
67
68 BrowserThread::PostTask(
69 thread, FROM_HERE,
70 NewRunnableMethod(
71 this, &BrowserMessageFilter::DispatchMessage, message));
darin (slow to review) 2010/12/06 05:14:58 This has the side effect of generating a PostTask
jam 2010/12/06 07:24:43 Each message filter's HandleMessageOnThread should
72 return true;
73 }
74
75 bool BrowserMessageFilter::DispatchMessage(const IPC::Message& message) {
76 bool message_was_ok = true;
77 bool rv = OnMessageReceived(message, &message_was_ok);
78 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO) || rv) <<
79 "Must handle messages that were dispatched to another thread!";
80 if (!message_was_ok)
81 BadMessageReceived(message.type());
82
83 return rv;
84 }
85
86 void BrowserMessageFilter::BadMessageReceived(uint32 msg_type) {
40 BrowserRenderProcessHost::BadMessageTerminateProcess(msg_type, peer_handle()); 87 BrowserRenderProcessHost::BadMessageTerminateProcess(msg_type, peer_handle());
41 } 88 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698