blob: 2855ed9d85038299d1eb0675d490720a29a901e5 [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
11#ifndef WEBRTC_MODULES_UTILITY_SOURCE_PROCESS_THREAD_IMPL_H_
12#define WEBRTC_MODULES_UTILITY_SOURCE_PROCESS_THREAD_IMPL_H_
13
henrike@webrtc.org79cf3ac2014-01-13 15:21:30 +000014#include <list>
kwiberg22feaa32016-03-17 09:17:43 -070015#include <memory>
tommi@webrtc.org03054482015-03-05 13:13:42 +000016#include <queue>
henrike@webrtc.org79cf3ac2014-01-13 15:21:30 +000017
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000018#include "webrtc/base/criticalsection.h"
pbos12411ef2015-11-23 14:47:56 -080019#include "webrtc/base/platform_thread.h"
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000020#include "webrtc/base/thread_checker.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010021#include "webrtc/modules/utility/include/process_thread.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010022#include "webrtc/system_wrappers/include/event_wrapper.h"
pbos@webrtc.org8b062002013-07-12 08:28:10 +000023#include "webrtc/typedefs.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000024
25namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000026
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000027class ProcessThreadImpl : public ProcessThread {
28 public:
stefan847855b2015-09-11 09:52:15 -070029 explicit ProcessThreadImpl(const char* thread_name);
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000030 ~ProcessThreadImpl() override;
niklase@google.com470e71d2011-07-07 08:21:25 +000031
tommi@webrtc.org3985f012015-02-27 13:36:34 +000032 void Start() override;
33 void Stop() override;
niklase@google.com470e71d2011-07-07 08:21:25 +000034
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000035 void WakeUp(Module* module) override;
terelius52d4e6b2016-04-26 09:31:59 -070036 void PostTask(rtc::scoped_ptr<ProcessTask> task) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000037
tommi@webrtc.org3985f012015-02-27 13:36:34 +000038 void RegisterModule(Module* module) override;
39 void DeRegisterModule(Module* module) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000040
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000041 protected:
42 static bool Run(void* obj);
43 bool Process();
44
45 private:
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000046 struct ModuleCallback {
tommi@webrtc.org103f3282015-02-08 00:48:10 +000047 ModuleCallback() : module(nullptr), next_callback(0) {}
48 ModuleCallback(const ModuleCallback& cb)
49 : module(cb.module), next_callback(cb.next_callback) {}
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000050 ModuleCallback(Module* module) : module(module), next_callback(0) {}
51 bool operator==(const ModuleCallback& cb) const {
52 return cb.module == module;
53 }
tommi@webrtc.org103f3282015-02-08 00:48:10 +000054
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000055 Module* const module;
56 int64_t next_callback; // Absolute timestamp.
tommi@webrtc.org103f3282015-02-08 00:48:10 +000057
58 private:
59 ModuleCallback& operator=(ModuleCallback&);
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000060 };
61
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000062 typedef std::list<ModuleCallback> ModuleList;
tommi@webrtc.org103f3282015-02-08 00:48:10 +000063
64 // Warning: For some reason, if |lock_| comes immediately before |modules_|
65 // with the current class layout, we will start to have mysterious crashes
66 // on Mac 10.9 debug. I (Tommi) suspect we're hitting some obscure alignemnt
67 // issues, but I haven't figured out what they are, if there are alignment
68 // requirements for mutexes on Mac or if there's something else to it.
69 // So be careful with changing the layout.
tommi@webrtc.org03054482015-03-05 13:13:42 +000070 rtc::CriticalSection lock_; // Used to guard modules_, tasks_ and stop_.
tommi@webrtc.org103f3282015-02-08 00:48:10 +000071
72 rtc::ThreadChecker thread_checker_;
kwiberg22feaa32016-03-17 09:17:43 -070073 const std::unique_ptr<EventWrapper> wake_up_;
74 // TODO(pbos): Remove unique_ptr and stop recreating the thread.
75 std::unique_ptr<rtc::PlatformThread> thread_;
tommi@webrtc.org103f3282015-02-08 00:48:10 +000076
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000077 ModuleList modules_;
tommi@webrtc.org03054482015-03-05 13:13:42 +000078 // TODO(tommi): Support delayed tasks.
79 std::queue<ProcessTask*> queue_;
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000080 bool stop_;
stefan2b180842015-09-14 07:53:38 -070081 const char* thread_name_;
niklase@google.com470e71d2011-07-07 08:21:25 +000082};
tommi@webrtc.org0c3e12b2015-02-06 09:44:12 +000083
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +000084} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +000085
86#endif // WEBRTC_MODULES_UTILITY_SOURCE_PROCESS_THREAD_IMPL_H_