1 | //===-- StructuredDataDarwinLog.h -------------------------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef LLDB_SOURCE_PLUGINS_STRUCTUREDDATA_DARWINLOG_STRUCTUREDDATADARWINLOG_H |
10 | #define LLDB_SOURCE_PLUGINS_STRUCTUREDDATA_DARWINLOG_STRUCTUREDDATADARWINLOG_H |
11 | |
12 | #include "lldb/Target/StructuredDataPlugin.h" |
13 | |
14 | #include <mutex> |
15 | |
16 | // Forward declarations |
17 | namespace sddarwinlog_private { |
18 | class EnableCommand; |
19 | } |
20 | |
21 | namespace lldb_private { |
22 | |
23 | class StructuredDataDarwinLog : public StructuredDataPlugin { |
24 | friend sddarwinlog_private::EnableCommand; |
25 | |
26 | public: |
27 | // Public static API |
28 | |
29 | static void Initialize(); |
30 | |
31 | static void Terminate(); |
32 | |
33 | static llvm::StringRef GetStaticPluginName() { return "darwin-log" ; } |
34 | |
35 | /// Return whether the DarwinLog functionality is enabled. |
36 | /// |
37 | /// The DarwinLog functionality is enabled if the user explicitly enabled |
38 | /// it with the enable command, or if the user has the setting set |
39 | /// that controls if we always enable it for newly created/attached |
40 | /// processes. |
41 | /// |
42 | /// \return |
43 | /// True if DarwinLog support is/will be enabled for existing or |
44 | /// newly launched/attached processes. |
45 | static bool IsEnabled(); |
46 | |
47 | // PluginInterface API |
48 | |
49 | llvm::StringRef GetPluginName() override { return GetStaticPluginName(); } |
50 | |
51 | // StructuredDataPlugin API |
52 | |
53 | bool SupportsStructuredDataType(llvm::StringRef type_name) override; |
54 | |
55 | void HandleArrivalOfStructuredData( |
56 | Process &process, llvm::StringRef type_name, |
57 | const StructuredData::ObjectSP &object_sp) override; |
58 | |
59 | Status GetDescription(const StructuredData::ObjectSP &object_sp, |
60 | lldb_private::Stream &stream) override; |
61 | |
62 | bool GetEnabled(llvm::StringRef type_name) const override; |
63 | |
64 | void ModulesDidLoad(Process &process, ModuleList &module_list) override; |
65 | |
66 | ~StructuredDataDarwinLog() override; |
67 | |
68 | private: |
69 | // Private constructors |
70 | |
71 | StructuredDataDarwinLog(const lldb::ProcessWP &process_wp); |
72 | |
73 | // Private static methods |
74 | |
75 | static lldb::StructuredDataPluginSP CreateInstance(Process &process); |
76 | |
77 | static void DebuggerInitialize(Debugger &debugger); |
78 | |
79 | static bool InitCompletionHookCallback(void *baton, |
80 | StoppointCallbackContext *context, |
81 | lldb::user_id_t break_id, |
82 | lldb::user_id_t break_loc_id); |
83 | |
84 | static Status FilterLaunchInfo(ProcessLaunchInfo &launch_info, |
85 | Target *target); |
86 | |
87 | // Internal helper methods used by friend classes |
88 | void SetEnabled(bool enabled); |
89 | |
90 | void AddInitCompletionHook(Process &process); |
91 | |
92 | // Private methods |
93 | |
94 | void DumpTimestamp(Stream &stream, uint64_t timestamp); |
95 | |
96 | size_t (Stream &stream, const StructuredData::Dictionary &event); |
97 | |
98 | size_t HandleDisplayOfEvent(const StructuredData::Dictionary &event, |
99 | Stream &stream); |
100 | |
101 | /// Call the enable command again, using whatever settings were initially |
102 | /// made. |
103 | |
104 | void EnableNow(); |
105 | |
106 | // Private data |
107 | bool m_recorded_first_timestamp; |
108 | uint64_t m_first_timestamp_seen; |
109 | bool m_is_enabled; |
110 | std::mutex m_added_breakpoint_mutex; |
111 | bool m_added_breakpoint; |
112 | lldb::user_id_t m_breakpoint_id; |
113 | }; |
114 | } |
115 | |
116 | #endif // LLDB_SOURCE_PLUGINS_STRUCTUREDDATA_DARWINLOG_STRUCTUREDDATADARWINLOG_H |
117 | |