Index: chrome/common/db_message_filter.h |
=================================================================== |
--- chrome/common/db_message_filter.h (revision 43588) |
+++ chrome/common/db_message_filter.h (working copy) |
@@ -1,143 +1,27 @@ |
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
#ifndef CHROME_COMMON_DB_MESSAGE_FILTER_H_ |
#define CHROME_COMMON_DB_MESSAGE_FILTER_H_ |
-#include "base/atomic_sequence_num.h" |
-#include "base/id_map.h" |
-#include "base/lock.h" |
-#include "base/scoped_ptr.h" |
-#include "base/waitable_event.h" |
#include "ipc/ipc_channel_proxy.h" |
-class Lock; |
-class MessageLoop; |
- |
-namespace IPC { |
-class Channel; |
-} |
- |
-// A thread-safe message filter used to send IPCs from DB threads and process |
-// replies from the browser process. |
-// |
-// This class should not be instantianted anywhere but RenderThread::Init(). It |
-// is meant to be a singleton in each renderer process. To access the singleton, |
-// use GetInstance(). |
+// Receives database messages from the browser process and processes them on the |
+// IO thread. |
class DBMessageFilter : public IPC::ChannelProxy::MessageFilter { |
public: |
- // Returns the DBMessageFilter singleton created in this renderer process. |
- static DBMessageFilter* GetInstance() { return instance_; } |
- |
- // Creates a new DBMessageFilter instance. |
DBMessageFilter(); |
- // Returns a unique ID for use when calling the SendAndWait() method. |
- virtual int GetUniqueID(); |
- |
- // Posts a task to the IO thread to send |message| to the browser. |
- virtual void Send(IPC::Message* message); |
- |
- // Sends |message| and blocks the current thread. Returns the result from the |
- // reply message, or |default_result| if the renderer process is being |
- // destroyed or the message could not be sent. |
- template<class ResultType> |
- ResultType SendAndWait(IPC::Message* message, |
- int message_id, |
- ResultType default_result) { |
- ResultType result = default_result; |
- base::WaitableEvent waitable_event(false, false); |
- DBMessageState state = |
- { reinterpret_cast<intptr_t>(&result), &waitable_event }; |
- { |
- AutoLock msgs_awaiting_replies_autolock(messages_awaiting_replies_lock_); |
- messages_awaiting_replies_->AddWithID(&state, message_id); |
- } |
- |
- Send(message); |
- |
- base::WaitableEvent* events[2] = { shutdown_event_, &waitable_event }; |
- base::WaitableEvent::WaitMany(events, 2); |
- |
- // Locking on messages_awaiting_replies_ guarantees that either the IO |
- // thread won't enter OnResponse(), or if it's already in OnResponse(), |
- // then WaitableEvent::Signal() will get a chance to do all its work |
- // before waitable_event is deleted. |
- AutoLock msgs_awaiting_replies_autolock(messages_awaiting_replies_lock_); |
- messages_awaiting_replies_->Remove(message_id); |
- return result; |
- } |
- |
- // Processes incoming message |message| from the browser process. |
+ private: |
virtual bool OnMessageReceived(const IPC::Message& message); |
- private: |
- // The state we store for each message we send. |
- struct DBMessageState { |
- intptr_t result_address_; |
- base::WaitableEvent* waitable_event_; |
- }; |
- |
- // This is a RefCounted class, do not allow anybody to destroy it directly. |
- virtual ~DBMessageFilter() { instance_ = NULL; } |
- |
- // Invoked when this filter is added to |channel|. |
- virtual void OnFilterAdded(IPC::Channel* channel); |
- |
- // Called when the channel encounters a problem. The filter should clean up |
- // its internal data and not accept any more messages. |
- virtual void OnChannelError(); |
- |
- // Called when the channel is closing. The filter should clean up its internal |
- // and not accept any more messages. |
- virtual void OnChannelClosing(); |
- |
- // Processes the reply to a sync DB request. |
- template<class ResultType> |
- void OnResponse(int32 message_id, ResultType result) { |
- AutoLock msgs_awaiting_replies_autolock(messages_awaiting_replies_lock_); |
- DBMessageState *state = messages_awaiting_replies_->Lookup(message_id); |
- if (state) { |
- *reinterpret_cast<ResultType*>(state->result_address_) = result; |
- state->waitable_event_->Signal(); |
- } |
- } |
- |
- // Processes IPCs that indicate a change in the size of a DB file. |
void OnDatabaseUpdateSize(const string16& origin_identifier, |
const string16& database_name, |
int64 database_size, |
int64 space_available); |
- |
- // Processes IPCs that ask for a DB to be closed immediately. |
void OnDatabaseCloseImmediately(const string16& origin_identifier, |
const string16& database_name); |
- |
- // The message loop for the IO thread. |
- MessageLoop* io_thread_message_loop_; |
- |
- // The channel to which this filter was added. |
- IPC::Channel* channel_; |
- |
- // A lock around the channel. |
- Lock channel_lock_; |
- |
- // The shutdown event. |
- base::WaitableEvent* shutdown_event_; |
- |
- // The list of messages awaiting replies. For each such message we store a |
- // DBMessageState instance. |
- scoped_ptr<IDMap<DBMessageState> > messages_awaiting_replies_; |
- |
- // The lock for 'messages_awaiting_replies_'. |
- Lock messages_awaiting_replies_lock_; |
- |
- // A thread-safe unique number generator. |
- scoped_ptr<base::AtomicSequenceNumber> unique_id_generator_; |
- |
- // The singleton. |
- static DBMessageFilter* instance_; |
}; |
#endif // CHROME_COMMON_DB_MESSAGE_FILTER_H_ |