C/C++ API Reference
Loading...
Searching...
No Matches
trace_callback.h
1// Copyright 2020 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14//==============================================================================
15//
16// The file provides the API for working with callbacks and sinks for the
17// tokenized trace module.
18
19#pragma once
20
21#include <stdbool.h>
22#include <stdint.h>
23#include <string.h>
24
25#include "pw_span/span.h"
26#include "pw_status/status.h"
27#include "pw_trace_tokenized/config.h"
28#include "pw_trace_tokenized/trace_tokenized.h"
29
30PW_EXTERN_C_START
31
33
57typedef enum {
58 PW_TRACE_CALL_ONLY_WHEN_ENABLED = 0,
59 PW_TRACE_CALL_ON_EVERY_EVENT = 1,
61
62enum {
63 PW_TRACE_EVENT_RETURN_FLAGS_NONE = 0,
64 PW_TRACE_EVENT_RETURN_FLAGS_SKIP_EVENT = 1 << 0,
65 PW_TRACE_EVENT_RETURN_FLAGS_DISABLE_AFTER_PROCESSING = 1 << 1
66};
67typedef uint32_t pw_trace_TraceEventReturnFlags;
68
69typedef size_t pw_trace_EventCallbackHandle;
70typedef pw_trace_TraceEventReturnFlags (*pw_trace_EventCallback)(
71 void* user_data, pw_trace_tokenized_TraceEvent* event);
72
73pw_Status pw_trace_RegisterEventCallback(
74 pw_trace_EventCallback callback,
75 pw_trace_ShouldCallOnEveryEvent called_on_every_event,
76 void* user_data,
77 pw_trace_EventCallbackHandle* handle);
78
80pw_Status pw_trace_UnregisterEventCallback(pw_trace_EventCallbackHandle handle);
81
105typedef void (*pw_trace_SinkStartBlock)(void* user_data, size_t size);
106typedef void (*pw_trace_SinkAddBytes)(void* user_data,
107 const void* bytes,
108 size_t size);
109typedef void (*pw_trace_SinkEndBlock)(void* user_data);
110typedef size_t pw_trace_SinkHandle;
111pw_Status pw_trace_RegisterSink(pw_trace_SinkStartBlock start_func,
112 pw_trace_SinkAddBytes add_bytes_func,
113 pw_trace_SinkEndBlock end_block_func,
114 void* user_data,
115 pw_trace_SinkHandle* handle);
116
118pw_Status pw_trace_UnregisterSink(pw_trace_SinkHandle handle);
119
121
122PW_EXTERN_C_END
123
124#ifdef __cplusplus
125namespace pw {
126
128
129namespace trace {
130
136 public:
137 enum CallOnEveryEvent {
138 kCallOnlyWhenEnabled = PW_TRACE_CALL_ONLY_WHEN_ENABLED,
139 kCallOnEveryEvent = PW_TRACE_CALL_ON_EVERY_EVENT,
140 };
141 using SinkStartBlock = pw_trace_SinkStartBlock;
142 using SinkAddBytes = pw_trace_SinkAddBytes;
143 using SinkEndBlock = pw_trace_SinkEndBlock;
144 using SinkHandle = pw_trace_SinkHandle;
146 void* user_data;
147 SinkStartBlock start_block;
148 SinkAddBytes add_bytes;
149 SinkEndBlock end_block;
150 };
151 using EventCallback = pw_trace_EventCallback;
152 using EventCallbackHandle = pw_trace_EventCallbackHandle;
153 using TraceEvent = pw_trace_tokenized_TraceEvent;
155 void* user_data;
156 EventCallback callback;
157 CallOnEveryEvent called_on_every_event;
158 };
159
160 pw::Status RegisterSink(SinkStartBlock start_func,
161 SinkAddBytes add_bytes_func,
162 SinkEndBlock end_block_func,
163 void* user_data = nullptr,
164 SinkHandle* handle = nullptr);
165 pw::Status UnregisterSink(SinkHandle handle);
166 pw::Status UnregisterAllSinks();
167 SinkCallbacks* GetSink(SinkHandle handle);
168 void CallSinks(span<const std::byte> header, span<const std::byte> data);
169
170 pw::Status RegisterEventCallback(
171 EventCallback callback,
172 CallOnEveryEvent called_on_every_event = kCallOnlyWhenEnabled,
173 void* user_data = nullptr,
174 EventCallbackHandle* handle = nullptr);
175 pw::Status UnregisterEventCallback(EventCallbackHandle handle);
176 pw::Status UnregisterAllEventCallbacks();
177 EventCallbacks* GetEventCallback(EventCallbackHandle handle);
178 pw_trace_TraceEventReturnFlags CallEventCallbacks(
179 CallOnEveryEvent called_on_every_event, TraceEvent* event);
180 size_t GetCalledOnEveryEventCount() const {
181 return called_on_every_event_count_;
182 }
183
184 private:
185 EventCallbacks event_callbacks_[PW_TRACE_CONFIG_MAX_EVENT_CALLBACKS];
186 SinkCallbacks sink_callbacks_[PW_TRACE_CONFIG_MAX_SINKS];
187 size_t called_on_every_event_count_ = 0;
188
189 bool IsSinkFree(pw_trace_SinkHandle handle) {
190 return sink_callbacks_[handle].start_block == nullptr &&
191 sink_callbacks_[handle].add_bytes == nullptr &&
192 sink_callbacks_[handle].end_block == nullptr;
193 }
194};
195
197Callbacks& GetCallbacks();
198
203 public:
205 Callbacks& callbacks,
206 Callbacks::EventCallback event_callback,
207 Callbacks::CallOnEveryEvent called_on_every_event =
208 Callbacks::kCallOnlyWhenEnabled,
209 void* user_data = nullptr)
210 : callbacks_(callbacks) {
211 callbacks_
212 .RegisterEventCallback(event_callback, called_on_every_event, user_data)
213 .IgnoreError(); // TODO: b/242598609 - Handle Status properly
214 }
216 Callbacks::SinkStartBlock sink_start,
217 Callbacks::SinkAddBytes sink_add_bytes,
218 Callbacks::SinkEndBlock sink_end,
219 void* user_data = nullptr)
220 : callbacks_(callbacks) {
221 callbacks_.RegisterSink(sink_start, sink_add_bytes, sink_end, user_data)
222 .IgnoreError(); // TODO: b/242598609 - Handle Status properly
223 }
224
225 private:
226 Callbacks& callbacks_;
227};
228
229} // namespace trace
230
232
233} // namespace pw
234#endif // __cplusplus
Definition: status.h:120
constexpr void IgnoreError() const
Definition: status.h:430
Definition: span_impl.h:235
Definition: trace_callback.h:135
Definition: trace_callback.h:202
pw_Status
C API for status codes. In C++, use the pw::Status class instead.
Definition: status.h:40
#define PW_TRACE_CONFIG_MAX_SINKS
The maximum number of encoded event sinks which can be registered at a time.
Definition: config.h:76
pw_Status pw_trace_UnregisterEventCallback(pw_trace_EventCallbackHandle handle)
Causes the callback to not receive any more events.
void(* pw_trace_SinkStartBlock)(void *user_data, size_t size)
Definition: trace_callback.h:105
#define PW_TRACE_CONFIG_MAX_EVENT_CALLBACKS
The maximum number of event callbacks which can be registered at a time.
Definition: config.h:71
pw_trace_ShouldCallOnEveryEvent
Definition: trace_callback.h:57
pw_Status pw_trace_UnregisterSink(pw_trace_SinkHandle handle)
Causes the sink to stop receiving trace data.
The Pigweed namespace.
Definition: alignment.h:27
pw::InlineBasicString and pw::InlineString are safer alternatives to std::basic_string and std::strin...
Definition: trace_callback.h:154
Definition: trace_callback.h:145