summaryrefslogtreecommitdiffstats
path: root/content/child/notifications/notification_dispatcher.h
blob: 2df766126e7643256148b9483fc1ae804f4c9a1a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// Copyright 2014 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 CONTENT_CHILD_NOTIFICATIONS_NOTIFICATION_DISPATCHER_H_
#define CONTENT_CHILD_NOTIFICATIONS_NOTIFICATION_DISPATCHER_H_

#include <map>

#include "base/macros.h"
#include "base/synchronization/lock.h"
#include "content/child/worker_thread_message_filter.h"

namespace content {

class NotificationDispatcher : public WorkerThreadMessageFilter {
 public:
  explicit NotificationDispatcher(ThreadSafeSender* thread_safe_sender);

  // Generates a, process-unique new notification Id mapped to |thread_id|, and
  // return the notification Id. This method can be called on any thread.
  int GenerateNotificationId(int thread_id);

 protected:
  ~NotificationDispatcher() override;

 private:
  // WorkerThreadMessageFilter:
  bool ShouldHandleMessage(const IPC::Message& msg) const override;
  void OnFilteredMessageReceived(const IPC::Message& msg) override;
  bool GetWorkerThreadIdForMessage(const IPC::Message& msg,
                                   int* ipc_thread_id) override;

  using NotificationIdToThreadId = std::map<int, int>;

  base::Lock notification_id_map_lock_;
  NotificationIdToThreadId notification_id_map_;
  int next_notification_id_ = 0;

  DISALLOW_COPY_AND_ASSIGN(NotificationDispatcher);
};

}  // namespace content

#endif  // CONTENT_CHILD_NOTIFICATIONS_NOTIFICATION_DISPATCHER_H_