blob: 80824e29e54d8fa3113ad418a8d3b7b15a60b72b [file] [log] [blame]
Sebastian Jansson6ea2c6a2020-01-13 14:07:22 +01001/*
2 * Copyright (c) 2020 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10#ifndef RTC_BASE_THREAD_MESSAGE_H_
11#define RTC_BASE_THREAD_MESSAGE_H_
12
13#include <list>
14#include <memory>
15#include <utility>
16
17#include "api/scoped_refptr.h"
18#include "rtc_base/location.h"
19#include "rtc_base/message_handler.h"
20
21namespace rtc {
22
23// Derive from this for specialized data
24// App manages lifetime, except when messages are purged
25
26class MessageData {
27 public:
28 MessageData() {}
29 virtual ~MessageData() {}
30};
31
32template <class T>
33class TypedMessageData : public MessageData {
34 public:
35 explicit TypedMessageData(const T& data) : data_(data) {}
36 const T& data() const { return data_; }
37 T& data() { return data_; }
38
39 private:
40 T data_;
41};
42
43// Like TypedMessageData, but for pointers that require a delete.
44template <class T>
45class ScopedMessageData : public MessageData {
46 public:
47 explicit ScopedMessageData(std::unique_ptr<T> data)
48 : data_(std::move(data)) {}
49 // Deprecated.
50 // TODO(deadbeef): Remove this once downstream applications stop using it.
51 explicit ScopedMessageData(T* data) : data_(data) {}
52 // Deprecated.
53 // TODO(deadbeef): Returning a reference to a unique ptr? Why. Get rid of
54 // this once downstream applications stop using it, then rename inner_data to
55 // just data.
56 const std::unique_ptr<T>& data() const { return data_; }
57 std::unique_ptr<T>& data() { return data_; }
58
59 const T& inner_data() const { return *data_; }
60 T& inner_data() { return *data_; }
61
62 private:
63 std::unique_ptr<T> data_;
64};
65
66// Like ScopedMessageData, but for reference counted pointers.
67template <class T>
68class ScopedRefMessageData : public MessageData {
69 public:
70 explicit ScopedRefMessageData(T* data) : data_(data) {}
71 const scoped_refptr<T>& data() const { return data_; }
72 scoped_refptr<T>& data() { return data_; }
73
74 private:
75 scoped_refptr<T> data_;
76};
77
78template <class T>
79inline MessageData* WrapMessageData(const T& data) {
80 return new TypedMessageData<T>(data);
81}
82
83template <class T>
84inline const T& UseMessageData(MessageData* data) {
85 return static_cast<TypedMessageData<T>*>(data)->data();
86}
87
88template <class T>
89class DisposeData : public MessageData {
90 public:
91 explicit DisposeData(T* data) : data_(data) {}
92 virtual ~DisposeData() { delete data_; }
93
94 private:
95 T* data_;
96};
97
98const uint32_t MQID_ANY = static_cast<uint32_t>(-1);
99const uint32_t MQID_DISPOSE = static_cast<uint32_t>(-2);
100
101// No destructor
102
103struct Message {
Sebastian Jansson61380c02020-01-17 14:46:08 +0100104 Message() : phandler(nullptr), message_id(0), pdata(nullptr) {}
Sebastian Jansson6ea2c6a2020-01-13 14:07:22 +0100105 inline bool Match(MessageHandler* handler, uint32_t id) const {
106 return (handler == nullptr || handler == phandler) &&
107 (id == MQID_ANY || id == message_id);
108 }
109 Location posted_from;
110 MessageHandler* phandler;
111 uint32_t message_id;
112 MessageData* pdata;
Sebastian Jansson6ea2c6a2020-01-13 14:07:22 +0100113};
114
115typedef std::list<Message> MessageList;
Sebastian Jansson6ea2c6a2020-01-13 14:07:22 +0100116} // namespace rtc
117#endif // RTC_BASE_THREAD_MESSAGE_H_