Line data Source code
1 : /*
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 :
14 : #include <list>
15 : #include <memory>
16 : #include <queue>
17 :
18 : #include "webrtc/base/criticalsection.h"
19 : #include "webrtc/base/platform_thread.h"
20 : #include "webrtc/base/thread_checker.h"
21 : #include "webrtc/modules/utility/include/process_thread.h"
22 : #include "webrtc/system_wrappers/include/event_wrapper.h"
23 : #include "webrtc/typedefs.h"
24 :
25 : namespace webrtc {
26 :
27 : class ProcessThreadImpl : public ProcessThread {
28 : public:
29 : explicit ProcessThreadImpl(const char* thread_name);
30 : ~ProcessThreadImpl() override;
31 :
32 : void Start() override;
33 : void Stop() override;
34 :
35 : void WakeUp(Module* module) override;
36 : void PostTask(std::unique_ptr<rtc::QueuedTask> task) override;
37 :
38 : void RegisterModule(Module* module) override;
39 : void DeRegisterModule(Module* module) override;
40 :
41 : protected:
42 : static bool Run(void* obj);
43 : bool Process();
44 :
45 : private:
46 : struct ModuleCallback {
47 : ModuleCallback() : module(nullptr), next_callback(0) {}
48 0 : ModuleCallback(const ModuleCallback& cb)
49 0 : : module(cb.module), next_callback(cb.next_callback) {}
50 0 : ModuleCallback(Module* module) : module(module), next_callback(0) {}
51 : bool operator==(const ModuleCallback& cb) const {
52 : return cb.module == module;
53 : }
54 :
55 : Module* const module;
56 : int64_t next_callback; // Absolute timestamp.
57 :
58 : private:
59 : ModuleCallback& operator=(ModuleCallback&);
60 : };
61 :
62 : typedef std::list<ModuleCallback> ModuleList;
63 :
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.
70 : rtc::CriticalSection lock_; // Used to guard modules_, tasks_ and stop_.
71 :
72 : rtc::ThreadChecker thread_checker_;
73 : 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_;
76 :
77 : ModuleList modules_;
78 : std::queue<rtc::QueuedTask*> queue_;
79 : bool stop_;
80 : const char* thread_name_;
81 : };
82 :
83 : } // namespace webrtc
84 :
85 : #endif // WEBRTC_MODULES_UTILITY_SOURCE_PROCESS_THREAD_IMPL_H_
|