blob: 9355b49ca17f25784d485f4a7db92aae52842334 [file] [log] [blame]
// Copyright 2020 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
//==============================================================================
// This file contains the backend hooks and implementation details for trace.
#pragma once
#include "pw_preprocessor/arguments.h"
#include "pw_preprocessor/concat.h"
#include "pw_trace_backend/trace_backend.h"
// Default: Flag value if none set
#ifndef PW_TRACE_FLAGS_DEFAULT
#define PW_TRACE_FLAGS_DEFAULT 0
#endif // PW_TRACE_FLAGS_DEFAULT
// Default: PW_TRACE_TRACE_ID_DEFAULT
#ifndef PW_TRACE_TRACE_ID_DEFAULT
#define PW_TRACE_TRACE_ID_DEFAULT 0
#endif // PW_TRACE_TRACE_ID_DEFAULT
// Default: PW_TRACE_GROUP_LABEL_DEFAULT
#ifndef PW_TRACE_GROUP_LABEL_DEFAULT
#define PW_TRACE_GROUP_LABEL_DEFAULT ""
#endif // PW_TRACE_GROUP_LABEL_DEFAULT
// These macros can be used to determine if a trace type contrains span or group
// label
#ifndef PW_TRACE_HAS_TRACE_ID
#define PW_TRACE_HAS_TRACE_ID(TRACE_TYPE) \
((TRACE_TYPE) == PW_TRACE_TYPE_ASYNC_START || \
(TRACE_TYPE) == PW_TRACE_TYPE_ASYNC_INSTANT || \
(TRACE_TYPE) == PW_TRACE_TYPE_ASYNC_END)
#endif // PW_TRACE_HAS_TRACE_ID
#ifndef PW_TRACE_HAS_GROUP_LABEL
#define PW_TRACE_HAS_GROUP_LABEL(TRACE_TYPE) (false)
#endif // PW_TRACE_HAS_GROUP_LABEL
// Default: behaviour for unimplemented trace event types
#ifndef _PW_TRACE_DISABLED
#define _PW_TRACE_DISABLED(...) \
do { \
} while (0)
#endif // _PW_TRACE_DISABLED
// Default: label used for PW_TRACE_FUNCTION trace events
#ifndef PW_TRACE_FUNCTION_LABEL
#define PW_TRACE_FUNCTION_LABEL __PRETTY_FUNCTION__
#endif
// Control to enable/disable tracing. If 0, no traces are emitted.
//
// Defaults to enabled.
#ifndef PW_TRACE_ENABLE
#define PW_TRACE_ENABLE 1
#endif // PW_TRACE_ENABLE
#define _PW_TRACE_IF_ENABLED(event_type, flags, label, group_label, trace_id) \
do { \
if ((PW_TRACE_ENABLE) != 0) { \
PW_TRACE(event_type, flags, label, group_label, trace_id); \
} \
} while (0)
#define _PW_TRACE_DATA_IF_ENABLED(event_type, \
flags, \
label, \
group_label, \
trace_id, \
data_format_string, \
data, \
size) \
do { \
if ((PW_TRACE_ENABLE) != 0) { \
PW_TRACE_DATA(event_type, \
flags, \
label, \
group_label, \
trace_id, \
data_format_string, \
data, \
size); \
} \
} while (0)
// This block handles:
// - PW_TRACE_INSTANT(label)
// - PW_TRACE_INSTANT_FLAG(flag, label)
// Which creates a trace event with the type: PW_TRACE_TYPE_INSTANT
// NOTE: If this type is not defined by the backend this trace is removed.
#ifdef PW_TRACE_TYPE_INSTANT
#define _PW_TRACE_INSTANT_ARGS2(flag, label) \
_PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_INSTANT, \
flag, \
label, \
PW_TRACE_GROUP_LABEL_DEFAULT, \
PW_TRACE_TRACE_ID_DEFAULT)
#else // PW_TRACE_TYPE_INSTANT
#define _PW_TRACE_INSTANT_ARGS2(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // PW_TRACE_TYPE_INSTANT
// This block handles:
// - PW_TRACE_INSTANT(label, group)
// - PW_TRACE_INSTANT_FLAG(flag, label, group)
// Which creates a trace event with the type: PW_TRACE_TYPE_INSTANT_GROUP
// NOTE: If this type is not defined by the backend this trace is removed.
#ifdef PW_TRACE_TYPE_INSTANT_GROUP
#define _PW_TRACE_INSTANT_ARGS3(flag, label, group) \
_PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_INSTANT_GROUP, \
flag, \
label, \
group, \
PW_TRACE_TRACE_ID_DEFAULT)
#else // PW_TRACE_TYPE_INSTANT_GROUP
#define _PW_TRACE_INSTANT_ARGS3(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // PW_TRACE_TYPE_INSTANT_GROUP
// This block handles:
// - PW_TRACE_INSTANT(label, group, trace_id)
// - PW_TRACE_INSTANT_FLAG(flag, label, group, trace_id)
// Which creates a trace event with the type: PW_TRACE_TYPE_ASYNC_INSTANT
// NOTE: If this type is not defined by the backend this trace is removed.
#ifdef PW_TRACE_TYPE_ASYNC_INSTANT
#define _PW_TRACE_INSTANT_ARGS4(flag, label, group, trace_id) \
_PW_TRACE_IF_ENABLED( \
PW_TRACE_TYPE_ASYNC_INSTANT, flag, label, group, trace_id)
#else // PW_TRACE_TYPE_ASYNC_INSTANT
#define _PW_TRACE_INSTANT_ARGS4(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // PW_TRACE_TYPE_ASYNC_INSTANT
// This block handles:
// - PW_TRACE_START(label)
// - PW_TRACE_START_FLAG(flag, label)
// Which creates a trace event with the type: PW_TRACE_TYPE_DURATION_START
// NOTE: If this type is not defined by the backend this trace is removed.
#ifdef PW_TRACE_TYPE_DURATION_START
#define _PW_TRACE_START_ARGS2(flag, label) \
_PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_DURATION_START, \
flag, \
label, \
PW_TRACE_GROUP_LABEL_DEFAULT, \
PW_TRACE_TRACE_ID_DEFAULT)
#else // PW_TRACE_TYPE_DURATION_START
#define _PW_TRACE_START_ARGS2(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // PW_TRACE_TYPE_DURATION_START
// This block handles:
// - PW_TRACE_START(label, group)
// - PW_TRACE_START_FLAG(flag, label, group)
// Which creates a trace event with the type: PW_TRACE_TYPE_DURATION_GROUP_START
// NOTE: If this type is not defined by the backend this trace is removed.
#ifdef PW_TRACE_TYPE_DURATION_GROUP_START // Disabled if backend doesn't define
// this
#define _PW_TRACE_START_ARGS3(flag, label, group) \
_PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_DURATION_GROUP_START, \
flag, \
label, \
group, \
PW_TRACE_TRACE_ID_DEFAULT)
#else // PW_TRACE_TYPE_DURATION_GROUP_START
#define _PW_TRACE_START_ARGS3(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // PW_TRACE_TYPE_DURATION_GROUP_START
// This block handles:
// - PW_TRACE_START(label, group, trace_id)
// - PW_TRACE_START_FLAG(flag, label, group, trace_id)
// Which creates a trace event with the type: PW_TRACE_TYPE_ASYNC_START
// NOTE: If this type is not defined by the backend this trace is removed.
#ifdef PW_TRACE_TYPE_ASYNC_START
#define _PW_TRACE_START_ARGS4(flag, label, group, trace_id) \
_PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_ASYNC_START, flag, label, group, trace_id)
#else // PW_TRACE_TYPE_ASYNC_START
#define _PW_TRACE_START_ARGS4(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // PW_TRACE_TYPE_ASYNC_START
// This block handles:
// - PW_TRACE_END(labe)
// - PW_TRACE_END_FLAG(flag, label)
// Which creates a trace event with the type: PW_TRACE_TYPE_DURATION_END
// NOTE: If this type is not defined by the backend this trace is removed.
#ifdef PW_TRACE_TYPE_DURATION_END
#define _PW_TRACE_END_ARGS2(flag, label) \
_PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_DURATION_END, \
flag, \
label, \
PW_TRACE_GROUP_LABEL_DEFAULT, \
PW_TRACE_TRACE_ID_DEFAULT)
#else // PW_TRACE_TYPE_DURATION_END
#define _PW_TRACE_END_ARGS2(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // PW_TRACE_TYPE_DURATION_END
// This block handles:
// - PW_TRACE_END(label, group)
// - PW_TRACE_END_FLAG(flag, label, group)
// Which creates a trace event with the type: PW_TRACE_TYPE_DURATION_GROUP_END
// NOTE: If this type is not defined by the backend this trace is removed.
#ifdef PW_TRACE_TYPE_DURATION_GROUP_END
#define _PW_TRACE_END_ARGS3(flag, label, group) \
_PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_DURATION_GROUP_END, \
flag, \
label, \
group, \
PW_TRACE_TRACE_ID_DEFAULT)
#else // PW_TRACE_TYPE_DURATION_GROUP_END
#define _PW_TRACE_END_ARGS3(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // PW_TRACE_TYPE_DURATION_GROUP_END
// This block handles:
// - PW_TRACE_END(label, group, trace_id)
// - PW_TRACE_END_FLAG(flag, label, group, trace_id)
// Which creates a trace event with the type: PW_TRACE_TYPE_ASYNC_END
// NOTE: If this type is not defined by the backend this trace is removed.
#ifdef PW_TRACE_TYPE_ASYNC_END
#define _PW_TRACE_END_ARGS4(flag, label, group, trace_id) \
_PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_ASYNC_END, flag, label, group, trace_id)
#else // PW_TRACE_TYPE_ASYNC_END
#define _PW_TRACE_END_ARGS4(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // PW_TRACE_TYPE_ASYNC_END
// The pigweed scope objects gets defined inline with the trace event. The
// constructor handles the start trace event, and the destructor does the end.
#ifndef _PW_TRACE_SCOPE_OBJECT
#define _PW_TRACE_SCOPE_OBJECT( \
object_name, flag, event_type_start, event_type_end, label, group) \
class object_name { \
public: \
object_name(uint32_t trace_id = PW_TRACE_TRACE_ID_DEFAULT) \
: trace_id_(trace_id) { \
_PW_TRACE_IF_ENABLED(event_type_start, flag, label, group, trace_id_); \
} \
~object_name() { \
_PW_TRACE_IF_ENABLED(event_type_end, flag, label, group, trace_id_); \
} \
\
private: \
const uint32_t trace_id_; \
}
#endif // _PW_TRACE_SCOPE_OBJECT
// This block handles:
// - PW_TRACE_SCOPE(label)
// - PW_TRACE_SCOPE_FLAG(flag, label)
// - PW_TRACE_FUNCTION()
// - PW_TRACE_FUNCTION_FLAG(flag)
// These each generate two trace events:
// - PW_TRACE_TYPE_DURATION_START: Where trace event appears in code.
// - PW_TRACE_TYPE_DURATION_END: When current scope is lost.
// NOTE; If these types are not defined by the backend these traces are removed.
#if defined(PW_TRACE_TYPE_DURATION_START) && defined(PW_TRACE_TYPE_DURATION_END)
#define _PW_TRACE_SCOPE_ARGS2(flag, label) \
_PW_TRACE_SCOPE_OBJECT(PW_CONCAT(_PwTraceScopeObject, __COUNTER__), \
flag, \
PW_TRACE_TYPE_DURATION_START, \
PW_TRACE_TYPE_DURATION_END, \
label, \
PW_TRACE_GROUP_LABEL_DEFAULT) \
PW_CONCAT(_pw_trace_scope_object, __COUNTER__);
#define _PW_TRACE_FUNCTION_ARGS0() \
_PW_TRACE_SCOPE_ARGS2(PW_TRACE_FLAGS, PW_TRACE_FUNCTION_LABEL)
#define _PW_TRACE_FUNCTION_FLAGS_ARGS1(flag) \
_PW_TRACE_SCOPE_ARGS2(flag, PW_TRACE_FUNCTION_LABEL)
#endif // defined(PW_TRACE_TYPE_DURATION_START) &&
// defined(PW_TRACE_TYPE_DURATION_END)
// This block handles:
// - PW_TRACE_SCOPE(label, group)
// - PW_TRACE_SCOPE_FLAG(flag, label, group)
// - PW_TRACE_FUNCTION(group)
// - PW_TRACE_FUNCTION_FLAG(flag, group)
// These each generate two trace events:
// - PW_TRACE_TYPE_DURATION_GROUP_START: Where trace event appears in code.
// - PW_TRACE_TYPE_DURATION_GROUP_END: When current scope is lost.
// NOTE; If these types are not defined by the backend these traces are removed.
#if defined(PW_TRACE_TYPE_DURATION_GROUP_START) && \
defined(PW_TRACE_TYPE_DURATION_GROUP_END)
#define _PW_TRACE_SCOPE_ARGS3(flag, label, group) \
_PW_TRACE_SCOPE_OBJECT(PW_CONCAT(_PwTraceScopeObject, __COUNTER__), \
flag, \
PW_TRACE_TYPE_DURATION_GROUP_START, \
PW_TRACE_TYPE_DURATION_GROUP_END, \
label, \
group) \
PW_CONCAT(_pw_trace_scope_object, __COUNTER__);
#define _PW_TRACE_FUNCTION_ARGS1(group) \
_PW_TRACE_SCOPE_ARGS3(PW_TRACE_FLAGS, PW_TRACE_FUNCTION_LABEL, group)
#define _PW_TRACE_FUNCTION_FLAGS_ARGS2(flag, group) \
_PW_TRACE_SCOPE_ARGS3(flag, PW_TRACE_FUNCTION_LABEL, group)
#endif // defined(PW_TRACE_TYPE_DURATION_GROUP_START) &&
// defined(PW_TRACE_TYPE_DURATION_GROUP_END)
// This block handles:
// - PW_TRACE_SCOPE(label, group, trace_id)
// - PW_TRACE_SCOPE_FLAG(flag, label, group, trace_id)
// - PW_TRACE_FUNCTION(group, trace_id)
// - PW_TRACE_FUNCTION_FLAG(flag, group, trace_id)
// These each generate two trace events:
// - PW_TRACE_TYPE_ASYNC_START: Where trace event appears in code.
// - PW_TRACE_TYPE_ASYNC_END: When current scope is lost.
// NOTE: If these types are not defined by the backend these traces are removed.
#if defined(PW_TRACE_TYPE_ASYNC_START) && defined(PW_TRACE_TYPE_ASYNC_END)
#define _PW_TRACE_SCOPE_ARGS4(flag, label, group, trace_id) \
_PW_TRACE_SCOPE_OBJECT(PW_CONCAT(_PwTraceScopeObject, __COUNTER__), \
flag, \
PW_TRACE_TYPE_ASYNC_START, \
PW_TRACE_TYPE_ASYNC_END, \
label, \
group) \
PW_CONCAT(_pw_trace_scope_object, __COUNTER__)(trace_id);
#define _PW_TRACE_FUNCTION_ARGS2(group, trace_id) \
_PW_TRACE_SCOPE_ARGS4( \
PW_TRACE_FLAGS, PW_TRACE_FUNCTION_LABEL, group, trace_id)
#define _PW_TRACE_FUNCTION_FLAGS_ARGS3(flag, group, trace_id) \
_PW_TRACE_SCOPE_ARGS4(flag, PW_TRACE_FUNCTION_LABEL, group, trace_id)
#endif // defined(PW_TRACE_TYPE_ASYNC_START) &&
// defined(PW_TRACE_TYPE_ASYNC_END)
// This block handles:
// - PW_TRACE_INSTANT_DATA(label,
// data_format_string,
// data,
// size)
// - PW_TRACE_INSTANT_DATA_FLAG(flag,
// label,
// data_format_string,
// data,
// size)
// Which creates a trace event with the type: PW_TRACE_TYPE_INSTANT
// NOTE: If this type or PW_TRACE_DATA is not defined by the backend this trace
// is removed.
#if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_INSTANT)
#define _PW_TRACE_INSTANT_DATA_ARGS5( \
flag, label, data_format_string, data, size) \
_PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_INSTANT, \
flag, \
label, \
PW_TRACE_GROUP_LABEL_DEFAULT, \
PW_TRACE_TRACE_ID_DEFAULT, \
data_format_string, \
data, \
size)
#else // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_INSTANT)
#define _PW_TRACE_INSTANT_DATA_ARGS5(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_INSTANT)
// This block handles:
// - PW_TRACE_INSTANT_DATA(label,
// group,
// data_format_string,
// data,
// size)
// - PW_TRACE_INSTANT_DATA_FLAG(flag,
// label,
// group,
// data_format_string,
// data,
// size)
// Which creates a trace event with the type: PW_TRACE_TYPE_INSTANT_GROUP
// NOTE: If this type or PW_TRACE_DATA is not defined by the backend this trace
// is removed.
#if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_INSTANT_GROUP)
#define _PW_TRACE_INSTANT_DATA_ARGS6( \
flag, label, group, data_format_string, data, size) \
_PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_INSTANT_GROUP, \
flag, \
label, \
group, \
PW_TRACE_TRACE_ID_DEFAULT, \
data_format_string, \
data, \
size)
#else // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_INSTANT_GROUP)
#define _PW_TRACE_INSTANT_DATA_ARGS6(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_INSTANT_GROUP)
// This block handles:
// - PW_TRACE_INSTANT_DATA(label,
// group,
// trace_id
// data_format_string,
// data,
// size)
// - PW_TRACE_INSTANT_DATA_FLAG(flag,
// label,
// group,
// trace_id
// data_format_string,
// data,
// size)
// Which creates a trace event with the type: PW_TRACE_TYPE_ASYNC_INSTANT
// NOTE: If this type or PW_TRACE_DATA is not defined by the backend this trace
// is removed.
#if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_INSTANT)
#define _PW_TRACE_INSTANT_DATA_ARGS7( \
flag, label, group, trace_id, data_format_string, data, size) \
_PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_ASYNC_INSTANT, \
flag, \
label, \
group, \
trace_id, \
data_format_string, \
data, \
size)
#else // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_INSTANT)
#define _PW_TRACE_INSTANT_DATA_ARGS7(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_INSTANT)
// This block handles:
// - PW_TRACE_START_DATA(label,
// data_format_string,
// data,
// size)
// - PW_TRACE_START_DATA_FLAG(flag,
// label,
// data_format_string,
// data,
// size)
// Which creates a trace event with the type: PW_TRACE_TYPE_DURATION_START
// NOTE: If this type or PW_TRACE_DATA is not defined by the backend this trace
// is removed.
#if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_START)
#define _PW_TRACE_START_DATA_ARGS5( \
flag, label, data_format_string, data, size) \
_PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_DURATION_START, \
flag, \
label, \
PW_TRACE_GROUP_LABEL_DEFAULT, \
PW_TRACE_TRACE_ID_DEFAULT, \
data_format_string, \
data, \
size)
#else // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_START)
#define _PW_TRACE_START_DATA_ARGS5(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_START)
// This block handles:
// - PW_TRACE_START_DATA(label,
// group,
// data_format_string,
// data,
// size)
// - PW_TRACE_START_DATA_FLAG(flag,
// label,
// group,
// data_format_string,
// data,
// size)
// Which creates a trace event with the type: PW_TRACE_TYPE_DURATION_GROUP_START
// NOTE: If this type or PW_TRACE_DATA is not defined by the backend this trace
// is removed.
#if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_GROUP_START)
#define _PW_TRACE_START_DATA_ARGS6( \
flag, label, group, data_format_string, data, size) \
_PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_DURATION_GROUP_START, \
flag, \
label, \
group, \
PW_TRACE_TRACE_ID_DEFAULT, \
data_format_string, \
data, \
size)
#else // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_START)
#define _PW_TRACE_START_DATA_ARGS6(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_START)
// This block handles:
// - PW_TRACE_START_DATA(label,
// group,
// trace_id
// data_format_string,
// data,
// size)
// - PW_TRACE_START_DATA_FLAG(flag,
// label,
// group,
// trace_id
// data_format_string,
// data,
// size)
// Which creates a trace event with the type: PW_TRACE_TYPE_ASYNC_START
// NOTE: If this type or PW_TRACE_DATA is not defined by the backend this trace
// is removed.
#if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_START)
#define _PW_TRACE_START_DATA_ARGS7( \
flag, label, group, trace_id, data_format_string, data, size) \
_PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_ASYNC_START, \
flag, \
label, \
group, \
trace_id, \
data_format_string, \
data, \
size)
#else // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_START)
#define _PW_TRACE_START_DATA_ARGS7(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_START)
// This block handles:
// - PW_TRACE_END_DATA(label,
// data_format_string,
// data,
// size)
// - PW_TRACE_END_DATA_FLAG(flag,
// label,
// data_format_string,
// data,
// size)
// Which creates a trace event with the type: PW_TRACE_TYPE_DURATION_END
// NOTE: If this type or PW_TRACE_DATA is not defined by the backend this trace
// is removed.
#if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_END)
#define _PW_TRACE_END_DATA_ARGS5(flag, label, data_format_string, data, size) \
_PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_DURATION_END, \
flag, \
label, \
PW_TRACE_GROUP_LABEL_DEFAULT, \
PW_TRACE_TRACE_ID_DEFAULT, \
data_format_string, \
data, \
size)
#else // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_START)
#define _PW_TRACE_END_DATA_ARGS5(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_START)
// This block handles:
// - PW_TRACE_END_DATA(label,
// group,
// data_format_string,
// data,
// size)
// - PW_TRACE_END_DATA_FLAG(flag,
// label,
// group,
// data_format_string,
// data,
// size)
// Which creates a trace event with the type: PW_TRACE_TYPE_DURATION_GROUP_END
// NOTE: If this type or PW_TRACE_DATA is not defined by the backend this trace
// is removed.
#if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_GROUP_END)
#define _PW_TRACE_END_DATA_ARGS6( \
flag, label, group, data_format_string, data, size) \
_PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_DURATION_GROUP_END, \
flag, \
label, \
group, \
PW_TRACE_TRACE_ID_DEFAULT, \
data_format_string, \
data, \
size)
#else // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_GROUP_END)
#define _PW_TRACE_END_DATA_ARGS6(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_GROUP_END)
// This block handles:
// - PW_TRACE_END_DATA(label,
// group,
// trace_id
// data_format_string,
// data,
// size)
// - PW_TRACE_END_DATA_FLAG(flag,
// label,
// group,
// trace_id
// data_format_string,
// data,
// size)
// Which creates a trace event with the type: PW_TRACE_TYPE_ASYNC_END
// NOTE: If this type or PW_TRACE_DATA is not defined by the backend this trace
// is removed.
#if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_END)
#define _PW_TRACE_END_DATA_ARGS7( \
flag, label, group, trace_id, data_format_string, data, size) \
_PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_ASYNC_END, \
flag, \
label, \
group, \
trace_id, \
data_format_string, \
data, \
size)
#else // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_END)
#define _PW_TRACE_END_DATA_ARGS7(...) _PW_TRACE_DISABLED(__VA_ARGS__)
#endif // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_END)