root/tools/perf/util/tool.h
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __PERF_TOOL_H
#define __PERF_TOOL_H

#include <stdbool.h>

#include <linux/types.h>

struct perf_session;
union perf_event;
struct evlist;
struct evsel;
struct perf_sample;
struct perf_tool;
struct machine;
struct ordered_events;

typedef int (*event_sample)(const struct perf_tool *tool, union perf_event *event,
                            struct perf_sample *sample,
                            struct evsel *evsel, struct machine *machine);

typedef int (*event_op)(const struct perf_tool *tool, union perf_event *event,
                        struct perf_sample *sample, struct machine *machine);

typedef int (*event_attr_op)(const struct perf_tool *tool,
                             union perf_event *event,
                             struct evlist **pevlist);

typedef int (*event_op2)(const struct perf_tool *tool, struct perf_session *session,
                         union perf_event *event);
typedef s64 (*event_op3)(const struct perf_tool *tool, struct perf_session *session,
                         union perf_event *event);
typedef int (*event_op4)(const struct perf_tool *tool, struct perf_session *session,
                         union perf_event *event, u64 data, const char *str);

typedef int (*event_oe)(const struct perf_tool *tool, union perf_event *event,
                        struct ordered_events *oe);

enum show_feature_header {
        SHOW_FEAT_NO_HEADER = 0,
        SHOW_FEAT_HEADER,
        SHOW_FEAT_HEADER_FULL_INFO,
};

struct perf_tool {
        event_sample    sample,
                        read,
                        callchain_deferred;
        event_op        mmap,
                        mmap2,
                        comm,
                        namespaces,
                        cgroup,
                        fork,
                        exit,
                        lost,
                        lost_samples,
                        aux,
                        itrace_start,
                        aux_output_hw_id,
                        context_switch,
                        throttle,
                        unthrottle,
                        ksymbol,
                        bpf,
                        text_poke;

        event_attr_op   attr;
        event_attr_op   event_update;
        event_op2       tracing_data;
        event_oe        finished_round;
        event_op2       build_id,
                        id_index,
                        auxtrace_info,
                        auxtrace_error,
                        time_conv,
                        thread_map,
                        cpu_map,
                        stat_config,
                        stat,
                        stat_round,
                        feature,
                        finished_init,
                        bpf_metadata,
                        schedstat_cpu,
                        schedstat_domain;
        event_op4       compressed;
        event_op3       auxtrace;
        bool            ordered_events;
        bool            ordering_requires_timestamps;
        bool            namespace_events;
        bool            cgroup_events;
        bool            no_warn;
        bool            dont_split_sample_group;
        bool            merge_deferred_callchains;
        enum show_feature_header show_feat_hdr;
};

void perf_tool__init(struct perf_tool *tool, bool ordered_events);

bool perf_tool__compressed_is_stub(const struct perf_tool *tool);

int process_event_sample_stub(const struct perf_tool *tool,
                              union perf_event *event,
                              struct perf_sample *sample,
                              struct evsel *evsel,
                              struct machine *machine);

struct delegate_tool {
        /** @tool: The actual tool that calls the delegate. */
        struct perf_tool tool;
        /** @delegate: The tool that is delegated to. */
        struct perf_tool *delegate;
};

void delegate_tool__init(struct delegate_tool *tool, struct perf_tool *delegate);

#endif /* __PERF_TOOL_H */