1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_CHILD_QUOTA_MESSAGE_FILTER_H_
6#define CONTENT_CHILD_QUOTA_MESSAGE_FILTER_H_
7
8#include <map>
9
10#include "base/memory/ref_counted.h"
11#include "base/synchronization/lock.h"
12#include "content/child/child_message_filter.h"
13
14namespace base {
15class MessageLoopProxy;
16}
17
18namespace content {
19
20class ThreadSafeSender;
21
22class QuotaMessageFilter : public ChildMessageFilter {
23 public:
24  explicit QuotaMessageFilter(ThreadSafeSender* thread_safe_sender);
25
26  // Generates a new request_id, registers { request_id, thread_id } map to
27  // the message filter and returns the request_id.
28  // This method can be called on any thread.
29  int GenerateRequestID(int thread_id);
30
31  // Clears all requests from the thread_id.
32  void ClearThreadRequests(int thread_id);
33
34 protected:
35  virtual ~QuotaMessageFilter();
36
37 private:
38  // ChildMessageFilter implementation:
39  virtual base::TaskRunner* OverrideTaskRunnerForMessage(
40      const IPC::Message& msg) OVERRIDE;
41  virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
42
43  typedef std::map<int, int> RequestIdToThreadId;
44
45  scoped_refptr<base::MessageLoopProxy> main_thread_loop_proxy_;
46  scoped_refptr<ThreadSafeSender> thread_safe_sender_;
47
48  base::Lock request_id_map_lock_;
49  RequestIdToThreadId request_id_map_;
50  int next_request_id_;
51
52  DISALLOW_COPY_AND_ASSIGN(QuotaMessageFilter);
53};
54
55}  // namespace content
56
57#endif  // CONTENT_CHILD_QUOTA_MESSAGE_FILTER_H_
58