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 ConstString GetStaticPluginName();
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   ConstString GetPluginName() override;
50 
51   uint32_t GetPluginVersion() override;
52 
53   // StructuredDataPlugin API
54 
55   bool SupportsStructuredDataType(ConstString type_name) override;
56 
57   void HandleArrivalOfStructuredData(
58       Process &process, ConstString type_name,
59       const StructuredData::ObjectSP &object_sp) override;
60 
61   Status GetDescription(const StructuredData::ObjectSP &object_sp,
62                         lldb_private::Stream &stream) override;
63 
64   bool GetEnabled(ConstString type_name) const override;
65 
66   void ModulesDidLoad(Process &process, ModuleList &module_list) override;
67 
68   ~StructuredDataDarwinLog() override;
69 
70 private:
71   // Private constructors
72 
73   StructuredDataDarwinLog(const lldb::ProcessWP &process_wp);
74 
75   // Private static methods
76 
77   static lldb::StructuredDataPluginSP CreateInstance(Process &process);
78 
79   static void DebuggerInitialize(Debugger &debugger);
80 
81   static bool InitCompletionHookCallback(void *baton,
82                                          StoppointCallbackContext *context,
83                                          lldb::user_id_t break_id,
84                                          lldb::user_id_t break_loc_id);
85 
86   static Status FilterLaunchInfo(ProcessLaunchInfo &launch_info,
87                                  Target *target);
88 
89   // Internal helper methods used by friend classes
90   void SetEnabled(bool enabled);
91 
92   void AddInitCompletionHook(Process &process);
93 
94   // Private methods
95 
96   void DumpTimestamp(Stream &stream, uint64_t timestamp);
97 
98   size_t DumpHeader(Stream &stream, const StructuredData::Dictionary &event);
99 
100   size_t HandleDisplayOfEvent(const StructuredData::Dictionary &event,
101                               Stream &stream);
102 
103   /// Call the enable command again, using whatever settings were initially
104   /// made.
105 
106   void EnableNow();
107 
108   // Private data
109   bool m_recorded_first_timestamp;
110   uint64_t m_first_timestamp_seen;
111   bool m_is_enabled;
112   std::mutex m_added_breakpoint_mutex;
113   bool m_added_breakpoint;
114   lldb::user_id_t m_breakpoint_id;
115 };
116 }
117 
118 #endif // LLDB_SOURCE_PLUGINS_STRUCTUREDDATA_DARWINLOG_STRUCTUREDDATADARWINLOG_H
119