summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.h
blob: 5dcb37b04eaa079b8f28d4c2f03235ad5a6bce29 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
//===-- StructuredDataDarwinLog.h -------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//


#ifndef StructuredDataDarwinLog_h
#define StructuredDataDarwinLog_h

#include "lldb/Target/StructuredDataPlugin.h"

#include <mutex>

// Forward declarations
namespace sddarwinlog_private
{
    class EnableCommand;
}

namespace lldb_private
{

class StructuredDataDarwinLog : public StructuredDataPlugin
{
    friend sddarwinlog_private::EnableCommand;

public:

    // -------------------------------------------------------------------------
    // Public static API
    // -------------------------------------------------------------------------

    static void
    Initialize();

    static void
    Terminate();

    static const ConstString&
    GetStaticPluginName();

    // -------------------------------------------------------------------------
    /// Return whether the DarwinLog functionality is enabled.
    ///
    /// The DarwinLog functionality is enabled if the user expicitly enabled
    /// it with the enable command, or if the user has the setting set
    /// that controls if we always enable it for newly created/attached
    /// processes.
    ///
    /// @return
    ///      True if DarwinLog support is/will be enabled for existing or
    ///      newly launched/attached processes.
    // -------------------------------------------------------------------------
    static bool
    IsEnabled();

    // -------------------------------------------------------------------------
    // PluginInterface API
    // -------------------------------------------------------------------------

    ConstString
    GetPluginName() override;

    uint32_t
    GetPluginVersion() override;

    // -------------------------------------------------------------------------
    // StructuredDataPlugin API
    // -------------------------------------------------------------------------

    bool
    SupportsStructuredDataType(const ConstString &type_name) override;

    void
    HandleArrivalOfStructuredData(Process &process,
                                  const ConstString &type_name,
                                  const StructuredData::ObjectSP
                                  &object_sp) override;

    Error
    GetDescription(const StructuredData::ObjectSP &object_sp,
                   lldb_private::Stream &stream) override;


    bool
    GetEnabled(const ConstString &type_name) const override;

    void
    ModulesDidLoad(Process &process, ModuleList &module_list) override;

private:

    // -------------------------------------------------------------------------
    // Private constructors
    // -------------------------------------------------------------------------

    StructuredDataDarwinLog(const lldb::ProcessWP &process_wp);

    // -------------------------------------------------------------------------
    // Private static methods
    // -------------------------------------------------------------------------

    static lldb::StructuredDataPluginSP
    CreateInstance(Process &process);

    static void
    DebuggerInitialize(Debugger &debugger);

    static bool
    InitCompletionHookCallback(void *baton, StoppointCallbackContext *context,
                               lldb::user_id_t break_id,
                               lldb::user_id_t break_loc_id);

    static Error
    FilterLaunchInfo(ProcessLaunchInfo &launch_info, Target *target);

    // -------------------------------------------------------------------------
    // Internal helper methods used by friend classes
    // -------------------------------------------------------------------------
    void
    SetEnabled(bool enabled);

    void
    AddInitCompletionHook(Process &process);

    // -------------------------------------------------------------------------
    // Private methods
    // -------------------------------------------------------------------------

    void
    DumpTimestamp(Stream &stream, uint64_t timestamp);

    size_t
    DumpHeader(Stream &stream, const StructuredData::Dictionary &event);

    size_t
    HandleDisplayOfEvent(const StructuredData::Dictionary &event,
                         Stream &stream);

    // -------------------------------------------------------------------------
    /// Call the enable command again, using whatever settings were initially
    /// made.
    // -------------------------------------------------------------------------

    void
    EnableNow();

    // -------------------------------------------------------------------------
    // Private data
    // -------------------------------------------------------------------------
    bool        m_recorded_first_timestamp;
    uint64_t    m_first_timestamp_seen;
    bool        m_is_enabled;
    std::mutex  m_added_breakpoint_mutex;
    bool        m_added_breakpoint;
};

}

#endif /* StructuredDataPluginDarwinLog_hpp */
OpenPOWER on IntegriCloud