blob: 8cac5742f5eb7fd48d2c462f27ae363255751072 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
2 * Copyright (c) 2011 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_UTILITY_SOURCE_PROCESS_THREAD_IMPL_H_
12#define MODULES_UTILITY_SOURCE_PROCESS_THREAD_IMPL_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
Yves Gerey988cc082018-10-23 12:03:01 +020014#include <stdint.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020015
henrike@webrtc.org79cf3ac2014-01-13 15:21:30 +000016#include <list>
kwiberg22feaa32016-03-17 09:17:43 -070017#include <memory>
tommi@webrtc.org03054482015-03-05 13:13:42 +000018#include <queue>
henrike@webrtc.org79cf3ac2014-01-13 15:21:30 +000019
Danil Chapovalov959e9b62019-01-14 14:29:18 +010020#include "api/task_queue/queued_task.h"
Yves Gerey988cc082018-10-23 12:03:01 +020021#include "modules/include/module.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "modules/utility/include/process_thread.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "rtc_base/critical_section.h"
Niels Möller2c16cc62018-10-29 09:47:51 +010024#include "rtc_base/event.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "rtc_base/location.h"
26#include "rtc_base/platform_thread.h"
27#include "rtc_base/thread_checker.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000028
29namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000030
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000031class ProcessThreadImpl : public ProcessThread {
32 public:
stefan847855b2015-09-11 09:52:15 -070033 explicit ProcessThreadImpl(const char* thread_name);
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000034 ~ProcessThreadImpl() override;
niklase@google.com470e71d2011-07-07 08:21:25 +000035
tommi@webrtc.org3985f012015-02-27 13:36:34 +000036 void Start() override;
37 void Stop() override;
niklase@google.com470e71d2011-07-07 08:21:25 +000038
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000039 void WakeUp(Module* module) override;
Danil Chapovalov959e9b62019-01-14 14:29:18 +010040 void PostTask(std::unique_ptr<QueuedTask> task) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000041
tommidea489f2017-03-03 03:20:24 -080042 void RegisterModule(Module* module, const rtc::Location& from) override;
tommi@webrtc.org3985f012015-02-27 13:36:34 +000043 void DeRegisterModule(Module* module) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000044
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000045 protected:
Niels Möller4731f002019-05-03 09:34:24 +020046 static void Run(void* obj);
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000047 bool Process();
48
49 private:
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000050 struct ModuleCallback {
tommidea489f2017-03-03 03:20:24 -080051 ModuleCallback() = delete;
52 ModuleCallback(ModuleCallback&& cb) = default;
53 ModuleCallback(const ModuleCallback& cb) = default;
54 ModuleCallback(Module* module, const rtc::Location& location)
55 : module(module), location(location) {}
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000056 bool operator==(const ModuleCallback& cb) const {
57 return cb.module == module;
58 }
tommi@webrtc.org103f3282015-02-08 00:48:10 +000059
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000060 Module* const module;
tommidea489f2017-03-03 03:20:24 -080061 int64_t next_callback = 0; // Absolute timestamp.
62 const rtc::Location location;
tommi@webrtc.org103f3282015-02-08 00:48:10 +000063
64 private:
65 ModuleCallback& operator=(ModuleCallback&);
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000066 };
67
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000068 typedef std::list<ModuleCallback> ModuleList;
tommi@webrtc.org103f3282015-02-08 00:48:10 +000069
70 // Warning: For some reason, if |lock_| comes immediately before |modules_|
71 // with the current class layout, we will start to have mysterious crashes
72 // on Mac 10.9 debug. I (Tommi) suspect we're hitting some obscure alignemnt
73 // issues, but I haven't figured out what they are, if there are alignment
74 // requirements for mutexes on Mac or if there's something else to it.
75 // So be careful with changing the layout.
tommi@webrtc.org03054482015-03-05 13:13:42 +000076 rtc::CriticalSection lock_; // Used to guard modules_, tasks_ and stop_.
tommi@webrtc.org103f3282015-02-08 00:48:10 +000077
78 rtc::ThreadChecker thread_checker_;
Niels Möller2c16cc62018-10-29 09:47:51 +010079 rtc::Event wake_up_;
kwiberg22feaa32016-03-17 09:17:43 -070080 // TODO(pbos): Remove unique_ptr and stop recreating the thread.
81 std::unique_ptr<rtc::PlatformThread> thread_;
tommi@webrtc.org103f3282015-02-08 00:48:10 +000082
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000083 ModuleList modules_;
Danil Chapovalov959e9b62019-01-14 14:29:18 +010084 std::queue<QueuedTask*> queue_;
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000085 bool stop_;
stefan2b180842015-09-14 07:53:38 -070086 const char* thread_name_;
niklase@google.com470e71d2011-07-07 08:21:25 +000087};
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000088
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +000089} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +000090
Yves Gerey665174f2018-06-19 15:03:05 +020091#endif // MODULES_UTILITY_SOURCE_PROCESS_THREAD_IMPL_H_