1 //===-- StructuredDataPlugin.h ----------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef StructuredDataPlugin_h
11 #define StructuredDataPlugin_h
13 #include "lldb/Core/PluginInterface.h"
14 #include "lldb/Core/StructuredData.h"
16 namespace lldb_private {
18 class CommandObjectMultiword;
20 // -----------------------------------------------------------------------------
21 /// Plugin that supports process-related structured data sent asynchronously
22 /// from the debug monitor (e.g. debugserver, lldb-server, etc.)
24 /// This plugin type is activated by a Process-derived instance when that
25 /// instance detects that a given structured data feature is available.
27 /// StructuredDataPlugin instances are inherently tied to a process. The
28 /// main functionality they support is the ability to consume asynchronously-
29 /// delivered structured data from the process monitor, and do something
30 /// reasonable with it. Something reasonable can include broadcasting a
31 /// StructuredData event, which other parts of the system can then do with
32 /// as they please. An IDE could use this facility to retrieve CPU usage,
33 /// memory usage, and other run-time aspects of the process. That data
34 /// can then be displayed meaningfully to the user through the IDE.
36 /// For command-line LLDB, the Debugger instance listens for the structured
37 /// data events raised by the plugin, and give the plugin both the output
38 /// and error streams such that the plugin can display something about the
39 /// event, at a time when the debugger ensures it is safe to write to the
40 /// output or error streams.
41 // -----------------------------------------------------------------------------
43 class StructuredDataPlugin
44 : public PluginInterface,
45 public std::enable_shared_from_this<StructuredDataPlugin> {
47 virtual ~StructuredDataPlugin();
49 lldb::ProcessSP GetProcess() const;
51 // -------------------------------------------------------------------------
52 // Public instance API
53 // -------------------------------------------------------------------------
55 // -------------------------------------------------------------------------
56 /// Return whether this plugin supports the given StructuredData feature.
58 /// When Process is informed of a list of process-monitor-supported
59 /// structured data features, Process will go through the list of plugins,
60 /// one at a time, and have the first plugin that supports a given feature
61 /// be the plugin instantiated to handle that feature. There is a 1-1
62 /// correspondence between a Process instance and a StructuredDataPlugin
63 /// mapped to that process. A plugin can support handling multiple
64 /// features, and if that happens, there is a single plugin instance
65 /// created covering all of the mapped features for a given process.
67 /// @param[in] type_name
68 /// The name of the feature tag supported by a process.
69 /// e.g. "darwin-log".
72 /// true if the plugin supports the feature; otherwise, false.
73 // -------------------------------------------------------------------------
74 virtual bool SupportsStructuredDataType(const ConstString &type_name) = 0;
76 // -------------------------------------------------------------------------
77 /// Handle the arrival of asynchronous structured data from the process.
79 /// When asynchronous structured data arrives from the process monitor,
80 /// it is immediately delivered to the plugin mapped for that feature
81 /// if one exists. The structured data that arrives from a process
82 /// monitor must be a dictionary, and it must have a string field named
83 /// "type" that must contain the StructuredData feature name set as the
84 /// value. This is the manner in which the data is routed to the proper
87 /// @param[in] process
88 /// The process instance that just received the structured data.
89 /// This will always be the same process for a given instance of
92 /// @param[in] type_name
93 /// The name of the feature tag for the asynchronous structured data.
94 /// Note this data will also be present in the \b object_sp dictionary
95 /// under the string value with key "type".
97 /// @param[in] object_sp
98 /// A shared pointer to the structured data that arrived. This must
99 /// be a dictionary. The only key required is the aforementioned
100 /// key named "type" that must be a string value containing the
101 /// structured data type name.
102 // -------------------------------------------------------------------------
104 HandleArrivalOfStructuredData(Process &process, const ConstString &type_name,
105 const StructuredData::ObjectSP &object_sp) = 0;
107 // -------------------------------------------------------------------------
108 /// Get a human-readable description of the contents of the data.
110 /// In command-line LLDB, this method will be called by the Debugger
111 /// instance for each structured data event generated, and the output
112 /// will be printed to the LLDB console. If nothing is added to the stream,
113 /// nothing will be printed; otherwise, a newline will be added to the end
116 /// @param[in] object_sp
117 /// A shared pointer to the structured data to format.
119 /// @param[in] stream
120 /// The stream where the structured data should be pretty printed.
123 /// The error if formatting the object contents failed; otherwise,
125 // -------------------------------------------------------------------------
126 virtual Error GetDescription(const StructuredData::ObjectSP &object_sp,
127 lldb_private::Stream &stream) = 0;
129 // -------------------------------------------------------------------------
130 /// Returns whether the plugin's features are enabled.
132 /// This is a convenience method for plugins that can enable or disable
133 /// their functionality. It allows retrieval of this state without
134 /// requiring a cast.
136 /// @param[in] type_name
137 /// The name of the feature tag for the asynchronous structured data.
138 /// This is needed for plugins that support more than one feature.
139 // -------------------------------------------------------------------------
140 virtual bool GetEnabled(const ConstString &type_name) const;
142 // -------------------------------------------------------------------------
143 /// Allow the plugin to do work related to modules that loaded in the
144 /// the corresponding process.
146 /// This method defaults to doing nothing. Plugins can override it
147 /// if they have any behavior they want to enable/modify based on loaded
150 /// @param[in] process
151 /// The process that just was notified of modules having been loaded.
152 /// This will always be the same process for a given instance of
155 /// @param[in] module_list
156 /// The list of modules that the process registered as having just
157 /// loaded. See \b Process::ModulesDidLoad(...).
158 // -------------------------------------------------------------------------
159 virtual void ModulesDidLoad(Process &process, ModuleList &module_list);
162 // -------------------------------------------------------------------------
164 // -------------------------------------------------------------------------
165 StructuredDataPlugin(const lldb::ProcessWP &process_wp);
167 // -------------------------------------------------------------------------
168 /// Derived classes must call this before attempting to hook up commands
169 /// to the 'plugin structured-data' tree.
171 /// This ensures the relevant command and options hook points for all
172 /// StructuredDataPlugin derived classes are available for this debugger.
173 /// If this has already happened, this call is a no-op.
175 /// @param[in] debugger
176 /// The Debugger instance for which we're creating the required shared
177 /// components for the StructuredDataPlugin derived classes.
178 // -------------------------------------------------------------------------
179 static void InitializeBasePluginForDebugger(Debugger &debugger);
182 lldb::ProcessWP m_process_wp;
184 DISALLOW_COPY_AND_ASSIGN(StructuredDataPlugin);