diff options
Diffstat (limited to 'ipc')
-rw-r--r-- | ipc/ipc_forwarding_message_filter.cc | 36 | ||||
-rw-r--r-- | ipc/ipc_forwarding_message_filter.h | 18 |
2 files changed, 23 insertions, 31 deletions
diff --git a/ipc/ipc_forwarding_message_filter.cc b/ipc/ipc_forwarding_message_filter.cc index 48f6e5f..d886706 100644 --- a/ipc/ipc_forwarding_message_filter.cc +++ b/ipc/ipc_forwarding_message_filter.cc @@ -12,24 +12,22 @@ namespace IPC { ForwardingMessageFilter::ForwardingMessageFilter( const uint32* message_ids_to_filter, size_t num_message_ids_to_filter, - base::TaskRunner* target_task_runner, - const Handler& handler) - : target_task_runner_(target_task_runner), - handler_(handler) { + base::TaskRunner* target_task_runner) + : target_task_runner_(target_task_runner) { DCHECK(target_task_runner_); - DCHECK(!handler_.is_null()); for (size_t i = 0; i < num_message_ids_to_filter; i++) message_ids_to_filter_.insert(message_ids_to_filter[i]); } -void ForwardingMessageFilter::AddRoute(int routing_id) { - base::AutoLock locked(routes_lock_); - routes_.insert(routing_id); +void ForwardingMessageFilter::AddRoute(int routing_id, const Handler& handler) { + DCHECK(!handler.is_null()); + base::AutoLock locked(handlers_lock_); + handlers_.insert(std::make_pair(routing_id, handler)); } void ForwardingMessageFilter::RemoveRoute(int routing_id) { - base::AutoLock locked(routes_lock_); - routes_.erase(routing_id); + base::AutoLock locked(handlers_lock_); + handlers_.erase(routing_id); } bool ForwardingMessageFilter::OnMessageReceived(const Message& message) { @@ -37,24 +35,22 @@ bool ForwardingMessageFilter::OnMessageReceived(const Message& message) { message_ids_to_filter_.end()) return false; + + Handler handler; + { - base::AutoLock locked(routes_lock_); - if (routes_.find(message.routing_id()) == routes_.end()) + base::AutoLock locked(handlers_lock_); + std::map<int, Handler>::iterator it = handlers_.find(message.routing_id()); + if (it == handlers_.end()) return false; + handler = it->second; } - target_task_runner_->PostTask( - FROM_HERE, - base::Bind(&ForwardingMessageFilter::ForwardToHandler, this, message)); + target_task_runner_->PostTask(FROM_HERE, base::Bind(handler, message)); return true; } ForwardingMessageFilter::~ForwardingMessageFilter() { } -void ForwardingMessageFilter::ForwardToHandler(const Message& message) { - DCHECK(target_task_runner_->RunsTasksOnCurrentThread()); - handler_.Run(message); -} - } // namespace IPC diff --git a/ipc/ipc_forwarding_message_filter.h b/ipc/ipc_forwarding_message_filter.h index 5b404c5..919a44d 100644 --- a/ipc/ipc_forwarding_message_filter.h +++ b/ipc/ipc_forwarding_message_filter.h @@ -5,6 +5,7 @@ #ifndef IPC_IPC_FORWARDING_MESSAGE_FILTER_H_ #define IPC_IPC_FORWARDING_MESSAGE_FILTER_H_ +#include <map> #include <set> #include "base/bind.h" @@ -17,9 +18,8 @@ namespace IPC { // This class can be used to intercept routed messages and // deliver them to a different task runner than they would otherwise -// be sent. Messages are filtered based on -// based on routing_id as well as type (see message_ids_to_filter and AddRoute -// and RemoveRoute). +// be sent. Messages are filtered based on type. To route these messages, +// add a MessageRouter to the handler. // // The user of this class implements ForwardingMessageFilter::Client, // which will receive the intercepted messages, on the specified target thread. @@ -38,11 +38,10 @@ class IPC_EXPORT ForwardingMessageFilter : public ChannelProxy::MessageFilter { ForwardingMessageFilter( const uint32* message_ids_to_filter, size_t num_message_ids_to_filter, - base::TaskRunner* target_task_runner, - const Handler& handler); + base::TaskRunner* target_task_runner); // Define the message routes to be filtered. - void AddRoute(int routing_id); + void AddRoute(int routing_id, const Handler& handler); void RemoveRoute(int routing_id); // ChannelProxy::MessageFilter methods: @@ -52,20 +51,17 @@ class IPC_EXPORT ForwardingMessageFilter : public ChannelProxy::MessageFilter { friend class ChannelProxy::MessageFilter; virtual ~ForwardingMessageFilter(); - void ForwardToHandler(const Message& message); - std::set<int> message_ids_to_filter_; // The handler_ only gets Run on the thread corresponding to // target_task_runner_. scoped_refptr<base::TaskRunner> target_task_runner_; - Handler handler_; // Protects access to routes_. - base::Lock routes_lock_; + base::Lock handlers_lock_; // Indicates the routing_ids for which messages should be filtered. - std::set<int> routes_; + std::map<int, Handler> handlers_; DISALLOW_COPY_AND_ASSIGN(ForwardingMessageFilter); }; |