blob: 0cb677aafef545f71c86bab409226a747ae2cd8f [file] [log] [blame]
/* SPDX-License-Identifier: LGPL-2.1 */
/*
* Copyright (C) 2016 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
*/
/**
* @file libkshark-plugin.h
* @brief KernelShark plugins.
*/
#ifndef _KSHARK_PLUGIN_H
#define _KSHARK_PLUGIN_H
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
// trace-cmd
#include "event-parse.h"
/* Quiet warnings over documenting simple structures */
//! @cond Doxygen_Suppress
#define KSHARK_PLUGIN_INITIALIZER kshark_plugin_initializer
#define KSHARK_PLUGIN_DEINITIALIZER kshark_plugin_deinitializer
#define _MAKE_STR(x) #x
#define MAKE_STR(x) _MAKE_STR(x)
#define KSHARK_PLUGIN_INITIALIZER_NAME MAKE_STR(KSHARK_PLUGIN_INITIALIZER)
#define KSHARK_PLUGIN_DEINITIALIZER_NAME MAKE_STR(KSHARK_PLUGIN_DEINITIALIZER)
struct kshark_context;
struct kshark_entry;
//! @endcond
/**
* A function type to be used when defining load/reload/unload plugin
* functions.
*/
typedef int (*kshark_plugin_load_func)(struct kshark_context *);
struct kshark_trace_histo;
/**
* Structure representing the C arguments of the drawing function of
* a plugin.
*/
struct kshark_cpp_argv {
/** Pointer to the model descriptor object. */
struct kshark_trace_histo *histo;
};
/** A function type to be used when defining plugin functions for drawing. */
typedef void
(*kshark_plugin_draw_handler_func)(struct kshark_cpp_argv *argv,
int val, int draw_action);
/**
* A function type to be used when defining plugin functions for data
* manipulation.
*/
typedef void
(*kshark_plugin_event_handler_func)(struct kshark_context *kshark_ctx,
struct tep_record *rec,
struct kshark_entry *e);
/** Plugin action identifier. */
enum kshark_plugin_actions {
/**
* Load plugins action. This action identifier is used when handling
* plugins.
*/
KSHARK_PLUGIN_INIT,
/**
* Reload plugins action. This action identifier is used when handling
* plugins.
*/
KSHARK_PLUGIN_UPDATE,
/**
* Unload plugins action. This action identifier is used when handling
* plugins.
*/
KSHARK_PLUGIN_CLOSE,
/**
* Task draw action. This action identifier is used by the plugin draw
* function.
*/
KSHARK_PLUGIN_TASK_DRAW,
/**
* CPU draw action. This action identifier is used by the plugin draw
* function.
*/
KSHARK_PLUGIN_CPU_DRAW,
};
/**
* Plugin Event handler structure, defining the properties of the required
* kshark_entry.
*/
struct kshark_event_handler {
/** Pointer to the next Plugin Event handler. */
struct kshark_event_handler *next;
/** Unique Id ot the trace event type. */
int id;
/**
* Event action function. This action can be used to modify the content
* of all kshark_entries having Event Ids equal to "id".
*/
kshark_plugin_event_handler_func event_func;
/**
* Draw action function. This action can be used to draw additional
* graphical elements (shapes) for all kshark_entries having Event Ids
* equal to "id".
*/
kshark_plugin_draw_handler_func draw_func;
};
struct kshark_event_handler *
kshark_find_event_handler(struct kshark_event_handler *handlers, int event_id);
int kshark_register_event_handler(struct kshark_event_handler **handlers,
int event_id,
kshark_plugin_event_handler_func evt_func,
kshark_plugin_draw_handler_func dw_func);
void kshark_unregister_event_handler(struct kshark_event_handler **handlers,
int event_id,
kshark_plugin_event_handler_func evt_func,
kshark_plugin_draw_handler_func dw_func);
void kshark_free_event_handler_list(struct kshark_event_handler *handlers);
/** Linked list of plugins. */
struct kshark_plugin_list {
/** Pointer to the next Plugin. */
struct kshark_plugin_list *next;
/** The plugin object file to load. */
char *file;
/** Plugin Event handler. */
void *handle;
/** Callback function for initialization of the plugin. */
kshark_plugin_load_func init;
/** Callback function for deinitialization of the plugin. */
kshark_plugin_load_func close;
};
int kshark_register_plugin(struct kshark_context *kshark_ctx,
const char *file);
void kshark_unregister_plugin(struct kshark_context *kshark_ctx,
const char *file);
void kshark_free_plugin_list(struct kshark_plugin_list *plugins);
int kshark_handle_plugins(struct kshark_context *kshark_ctx,
enum kshark_plugin_actions task_id);
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // _KSHARK_PLUGIN_H