blob: 97d3227e98edd6a9baf8f44c867f08ee25ec4c93 [file] [log] [blame]
/* SPDX-License-Identifier: LGPL-2.1 */
/*
* Copyright (C) 2017 VMware Inc, Yordan Karadzhov (VMware) <y.karadz@gmail.com>
*/
/**
* @file libkshark.h
* @brief API for processing of tracing data.
*/
#ifndef _LIB_KSHARK_H
#define _LIB_KSHARK_H
// C
#include <stdint.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
// Json-C
#include <json-c/json.h>
#ifdef __cplusplus
extern "C" {
#endif
// KernelShark
#include "libkshark-plugin.h"
/**
* Kernel Shark entry contains all information from one trace record needed
* in order to visualize the time-series of trace records. The part of the
* data which is not directly required for the visualization (latency, record
* info etc.) is available on-demand via the offset into the trace file.
*/
struct kshark_entry {
/** Pointer to the next (in time) kshark_entry on the same CPU core. */
struct kshark_entry *next; /* MUST BE FIRST ENTRY */
/**
* A bit mask controlling the visibility of the entry. A value of OxFF
* would mean that the entry is visible everywhere. Use
* kshark_filter_masks to check the level of visibility/invisibility
* of the entry.
*/
uint16_t visible;
/** Data stream identifier. */
int16_t stream_id;
/** Unique Id of the trace event type. */
int16_t event_id;
/** The CPU core of the record. */
int16_t cpu;
/** The PID of the task the record was generated. */
int32_t pid;
/** The offset into the trace file, used to find the record. */
int64_t offset;
/**
* The time of the record in nano seconds. The value is taken from
* the timestamps within the trace data file, which are architecture
* dependent. The time usually is the timestamp from when the system
* started.
*/
int64_t ts;
};
/** Size of the hash table of PIDs in terms of bits being used by the key. */
#define KS_TASK_HASH_NBITS 16
/** Size of the hash table of Ids in terms of bits being used by the key. */
#define KS_FILTER_HASH_NBITS 8
/** A bucket for the hash table of integer Id numbers (kshark_hash_id). */
struct kshark_hash_id_item {
/** Pointer to the Id in this bucket. */
struct kshark_hash_id_item *next;
/** The Id value. */
int id;
};
/**
* Hash table of integer Id numbers. To be used for fast filter of trace
* entries.
*/
struct kshark_hash_id {
/** Array of buckets. */
struct kshark_hash_id_item **hash;
/** The number of Ids in the table. */
size_t count;
/**
* The number of bits used by the hashing function.
* Note that the number of buckets in the table if given by
* 1 << n_bits.
*/
size_t n_bits;
};
bool kshark_hash_id_find(struct kshark_hash_id *hash, int id);
int kshark_hash_id_add(struct kshark_hash_id *hash, int id);
void kshark_hash_id_clear(struct kshark_hash_id *hash);
struct kshark_hash_id *kshark_hash_id_alloc(size_t n_bits);
void kshark_hash_id_free(struct kshark_hash_id *hash);
int *kshark_hash_ids(struct kshark_hash_id *hash);
/* Quiet warnings over documenting simple structures */
//! @cond Doxygen_Suppress
static const char top_name[] = { 0x1b, 0x00 }; // Non printable character
//! @endcond
/**
* Non printable character used for the name in the case when the name has to
* be ignored.
*/
#define KS_UNNAMED (char *) &top_name
/**
* Timestamp calibration function type. To be user for system clock
* calibration.
*/
typedef void (*time_calib_func) (int64_t *, int64_t *);
struct kshark_data_stream;
/** A function type to be used by the method interface of the data stream. */
typedef char *(*stream_get_str_func) (struct kshark_data_stream *,
const struct kshark_entry *);
/** A function type to be used by the method interface of the data stream. */
typedef int (*stream_get_int_func) (struct kshark_data_stream *,
const struct kshark_entry *);
/** A function type to be used by the method interface of the data stream. */
typedef int (*stream_find_id_func) (struct kshark_data_stream *,
const char *);
/** A function type to be used by the method interface of the data stream. */
typedef int *(*stream_get_ids_func) (struct kshark_data_stream *);
/** A function type to be used by the method interface of the data stream. */
typedef int (*stream_get_names_func) (struct kshark_data_stream *,
const struct kshark_entry *,
char ***);
/** Event field format identifier. */
typedef enum kshark_event_field_format {
/** A field of unknown type. */
KS_INVALID_FIELD,
/** Integer number */
KS_INTEGER_FIELD,
/** Floating-point number */
KS_FLOAT_FIELD
} kshark_event_field_format;
/** A function type to be used by the method interface of the data stream. */
typedef kshark_event_field_format
(*stream_event_field_type) (struct kshark_data_stream *,
const struct kshark_entry *,
const char *);
/** A function type to be used by the method interface of the data stream. */
typedef int (*stream_read_event_field) (struct kshark_data_stream *,
const struct kshark_entry *,
const char *,
int64_t *);
/** A function type to be used by the method interface of the data stream. */
typedef int (*stream_read_record_field) (struct kshark_data_stream *,
void *,
const char *,
int64_t *);
struct kshark_context;
/** A function type to be used by the method interface of the data stream. */
typedef ssize_t (*load_entries_func) (struct kshark_data_stream *,
struct kshark_context *,
struct kshark_entry ***);
/** A function type to be used by the method interface of the data stream. */
typedef ssize_t (*load_matrix_func) (struct kshark_data_stream *,
struct kshark_context *,
int16_t **event_array,
int16_t **cpu_array,
int32_t **pid_array,
int64_t **offset_array,
int64_t **ts_array);
/** Data interface identifier. */
typedef enum kshark_data_interface_id {
/** An interface with unknown type. */
KS_INVALID_INTERFACE,
/** Generic interface suitable for Ftrace data. */
KS_GENERIC_DATA_INTERFACE,
} kshark_data_interface_id;
/**
* Structure representing the interface of methods used to operate over
* the data from a given stream.
*/
struct kshark_generic_stream_interface {
/** Interface version identifier. */
kshark_data_interface_id type; /* MUST BE FIRST ENTRY. */
/** Method used to retrieve the Process Id of the entry. */
stream_get_int_func get_pid;
/** Method used to retrieve the Event Id of the entry. */
stream_get_int_func get_event_id;
/** Method used to retrieve the Event name of the entry. */
stream_get_str_func get_event_name;
/** Method used to retrieve the Task name of the entry. */
stream_get_str_func get_task;
/** Method used to retrieve the Info string of the entry. */
stream_get_str_func get_info;
/**
* Method used to retrieve an unspecified auxiliary info of the trace
* record.
*/
stream_get_str_func aux_info;
/** Method used to retrieve Id of the Event from its name. */
stream_find_id_func find_event_id;
/** Method used to retrieve the array of Ids of all Events. */
stream_get_ids_func get_all_event_ids;
/** Method used to dump the entry's content to string. */
stream_get_str_func dump_entry;
/**
* Method used to retrieve the array of all field names of a given
* event.
*/
stream_get_names_func get_all_event_field_names;
/** Method used to access the type of an event's data field. */
stream_event_field_type get_event_field_type;
/** Method used to access the value of an event's data field. */
stream_read_event_field read_event_field_int64;
/** Method used to access the value of an event's data field. */
stream_read_record_field read_record_field_int64;
/** Method used to load the data in the form of entries. */
load_entries_func load_entries;
/** Method used to load the data in matrix form. */
load_matrix_func load_matrix;
/** Generic data handle. */
void *handle;
};
/** Data format identifier string indicating invalid data. */
#define KS_INVALID_DATA "invalid data"
/** Structure representing a stream of trace data. */
struct kshark_data_stream {
/** Data stream identifier. */
int16_t stream_id;
/** The number of CPUs presented in this data stream. */
int n_cpus;
/** Hash table of Idle CPUs. */
struct kshark_hash_id *idle_cpus;
/**
* The number of distinct event types presented in this data stream.
*/
int n_events;
/** The Process Id of the Idle task. */
int idle_pid;
/** Trace data file pathname. */
char *file;
/** Stream name. */
char *name;
/** Hash table of task PIDs. */
struct kshark_hash_id *tasks;
/** A mutex, used to protect the access to the input file. */
pthread_mutex_t input_mutex;
/** Hash of tasks to filter on. */
struct kshark_hash_id *show_task_filter;
/** Hash of tasks to not display. */
struct kshark_hash_id *hide_task_filter;
/** Hash of events to filter on. */
struct kshark_hash_id *show_event_filter;
/** Hash of events to not display. */
struct kshark_hash_id *hide_event_filter;
/** Hash of CPUs to filter on. */
struct kshark_hash_id *show_cpu_filter;
/** Hash of CPUs to not display. */
struct kshark_hash_id *hide_cpu_filter;
/**
* Flag showing if some entries are filtered out (marked as invisible).
*/
bool filter_is_applied;
/** The type of the data. */
char data_format[KS_DATA_FORMAT_SIZE];
/** List of Plugin interfaces. */
struct kshark_dpi_list *plugins;
/** The number of plugins registered for this stream.*/
int n_plugins;
/** System clock calibration function. */
time_calib_func calib;
/** An array of time calibration constants. */
int64_t *calib_array;
/** The size of the array of time calibration constants. */
size_t calib_array_size;
/** List of Plugin's Event handlers. */
struct kshark_event_proc_handler *event_handlers;
/** List of Plugin's Draw handlers. */
struct kshark_draw_handler *draw_handlers;
/**
* The interface of methods used to operate over the data from a given
* stream.
*/
void *interface;
};
static inline char *kshark_set_data_format(char *dest_format,
const char *src_format)
{
return strncpy(dest_format, src_format, KS_DATA_FORMAT_SIZE - 1);
}
/** Hard-coded default number of data streams available at initialization. */
#define KS_DEFAULT_NUM_STREAMS 256
/**
* Structure representing the parameters of the stream descriptor array owned
* by the kshark session.
*/
struct kshark_stream_array_descriptor {
/** The identifier of the Data stream added. */
int max_stream_id;
/** The the next free Data stream identifier (index). */
int next_free_stream_id;
/** The capacity of the array of stream objects (pointers). */
int array_size;
};
/** Structure representing a kshark session. */
struct kshark_context {
/** Array of data stream descriptors. */
struct kshark_data_stream **stream;
/** The number of data streams. */
int n_streams;
/** Parameters of the stream descriptor array. */
struct kshark_stream_array_descriptor stream_info;
/**
* Bit mask, controlling the visibility of the entries after filtering.
* If given bit is set here, all entries which are filtered-out will
* have this bit unset in their "visible" fields.
*/
uint8_t filter_mask;
/** List of Data collections. */
struct kshark_entry_collection *collections;
/** List of data readout interfaces. */
struct kshark_dri_list *inputs;
/** The number of readout interfaces. */
int n_inputs;
/** List of Plugins. */
struct kshark_plugin_list *plugins;
/** The number of plugins. */
int n_plugins;
};
bool kshark_instance(struct kshark_context **kshark_ctx);
int kshark_open(struct kshark_context *kshark_ctx, const char *file);
int kshark_stream_open(struct kshark_data_stream *stream, const char *file);
int kshark_add_stream(struct kshark_context *kshark_ctx);
int kshark_remove_stream(struct kshark_context *kshark_ctx, int sd);
struct kshark_data_stream *
kshark_get_data_stream(struct kshark_context *kshark_ctx, int sd);
struct kshark_data_stream *
kshark_get_stream_from_entry(const struct kshark_entry *entry);
int *kshark_all_streams(struct kshark_context *kshark_ctx);
ssize_t kshark_get_task_pids(struct kshark_context *kshark_ctx, int sd,
int **pids);
int kshark_close(struct kshark_context *kshark_ctx, int sd);
void kshark_close_all(struct kshark_context *kshark_ctx);
void kshark_free(struct kshark_context *kshark_ctx);
char *kshark_comm_from_pid(int sd, int pid);
char *kshark_event_from_id(int sd, int event_id);
void kshark_convert_nano(uint64_t time, uint64_t *sec, uint64_t *usec);
char* kshark_dump_entry(const struct kshark_entry *entry);
void kshark_print_entry(const struct kshark_entry *entry);
int kshark_get_pid(const struct kshark_entry *entry);
int kshark_get_event_id(const struct kshark_entry *entry);
int *kshark_get_all_event_ids(struct kshark_data_stream *stream);
int kshark_find_event_id(struct kshark_data_stream *stream,
const char *event_name);
char *kshark_get_event_name(const struct kshark_entry *entry);
char *kshark_get_task(const struct kshark_entry *entry);
char *kshark_get_info(const struct kshark_entry *entry);
char *kshark_get_aux_info(const struct kshark_entry *entry);
kshark_event_field_format
kshark_get_event_field_type(const struct kshark_entry *entry,
const char *field);
int kshark_get_all_event_field_names(const struct kshark_entry *entry,
char ***field);
int kshark_read_record_field_int(struct kshark_data_stream *stream, void *rec,
const char *field, int64_t *val);
int kshark_read_event_field_int(const struct kshark_entry *entry,
const char* field, int64_t *val);
ssize_t kshark_load_entries(struct kshark_context *kshark_ctx, int sd,
struct kshark_entry ***data_rows);
ssize_t kshark_load_matrix(struct kshark_context *kshark_ctx, int sd,
int16_t **event_array,
int16_t **cpu_array,
int32_t **pid_array,
int64_t **offset_array,
int64_t **ts_array);
/** Bit masks used to control the visibility of the entry after filtering. */
enum kshark_filter_masks {
/**
* Use this mask to check the visibility of the entry in the text
* view.
*/
KS_TEXT_VIEW_FILTER_MASK = 1 << 0,
/**
* Use this mask to check the visibility of the entry in the graph
* view.
*/
KS_GRAPH_VIEW_FILTER_MASK = 1 << 1,
/** Special mask used whene filtering events. */
KS_EVENT_VIEW_FILTER_MASK = 1 << 2,
/* The next 4 bits are reserved for more KS_X_VIEW_FILTER_MASKs. */
/**
* Use this mask to check if the content of the entry has been accessed
* by a plugin-defined function.
*/
KS_PLUGIN_UNTOUCHED_MASK = 1 << 7
};
/** Filter type identifier. */
enum kshark_filter_type {
/** Dummy filter identifier reserved for future use. */
KS_NO_FILTER,
/**
* Identifier of the filter, used to specified the events to be shown.
*/
KS_SHOW_EVENT_FILTER,
/**
* Identifier of the filter, used to specified the events to be
* filtered-out.
*/
KS_HIDE_EVENT_FILTER,
/**
* Identifier of the filter, used to specified the tasks to be shown.
*/
KS_SHOW_TASK_FILTER,
/**
* Identifier of the filter, used to specified the tasks to be
* filtered-out.
*/
KS_HIDE_TASK_FILTER,
/**
* Identifier of the filter, used to specified the CPUs to be shown.
*/
KS_SHOW_CPU_FILTER,
/**
* Identifier of the filter, used to specified the CPUs to be
* filtered-out.
*/
KS_HIDE_CPU_FILTER,
};
struct kshark_hash_id *
kshark_get_filter(struct kshark_data_stream *stream,
enum kshark_filter_type filter_id);
void kshark_filter_add_id(struct kshark_context *kshark_ctx, int sd,
int filter_id, int id);
int *kshark_get_filter_ids(struct kshark_context *kshark_ctx, int sd,
int filter_id, int *n);
void kshark_filter_clear(struct kshark_context *kshark_ctx, int sd,
int filter_id);
bool kshark_this_filter_is_set(struct kshark_hash_id *filter);
bool kshark_filter_is_set(struct kshark_context *kshark_ctx, int sd);
static inline void unset_event_filter_flag(struct kshark_context *kshark_ctx,
struct kshark_entry *e)
{
/*
* All entries, filtered-out by the event filters, will be treated
* differently, when visualized. Because of this, ignore the value
* of the GRAPH_VIEW flag provided by the user via
* stream->filter_mask. The value of the EVENT_VIEW flag in
* stream->filter_mask will be used instead.
*/
int event_mask = kshark_ctx->filter_mask & ~KS_GRAPH_VIEW_FILTER_MASK;
e->visible &= ~event_mask;
}
void kshark_apply_filters(struct kshark_context *kshark_ctx,
struct kshark_data_stream *stream,
struct kshark_entry *entry);
void kshark_filter_stream_entries(struct kshark_context *kshark_ctx, int sd,
struct kshark_entry **data,
size_t n_entries);
void kshark_filter_all_entries(struct kshark_context *kshark_ctx,
struct kshark_entry **data, size_t n_entries);
void kshark_clear_all_filters(struct kshark_context *kshark_ctx,
struct kshark_entry **data,
size_t n_entries);
void kshark_plugin_actions(struct kshark_data_stream *stream,
void *record, struct kshark_entry *entry);
void kshark_calib_entry(struct kshark_data_stream *stream,
struct kshark_entry *entry);
void kshark_postprocess_entry(struct kshark_data_stream *stream,
void *record, struct kshark_entry *entry);
/** Search failed identifiers. */
enum kshark_search_failed {
/** All entries have greater timestamps. */
BSEARCH_ALL_GREATER = -1,
/** All entries have smaller timestamps. */
BSEARCH_ALL_SMALLER = -2,
};
/** General purpose Binary search macro. */
#define BSEARCH(h, l, cond) \
({ \
while (h - l > 1) { \
mid = (l + h) / 2; \
if (cond) \
l = mid; \
else \
h = mid; \
} \
})
ssize_t kshark_find_entry_by_time(int64_t time,
struct kshark_entry **data_rows,
size_t l, size_t h);
bool kshark_match_pid(struct kshark_context *kshark_ctx,
struct kshark_entry *e, int sd, int *pid);
bool kshark_match_cpu(struct kshark_context *kshark_ctx,
struct kshark_entry *e, int sd, int *cpu);
bool kshark_match_event_id(struct kshark_context *kshark_ctx,
struct kshark_entry *e, int sd, int *event_id);
bool kshark_match_event_and_pid(struct kshark_context *kshark_ctx,
struct kshark_entry *e,
int sd, int *values);
bool kshark_match_event_and_cpu(struct kshark_context *kshark_ctx,
struct kshark_entry *e,
int sd, int *values);
/**
* Empty bin identifier.
* KS_EMPTY_BIN is used to reset entire arrays to empty with memset(), thus it
* must be -1 for that to work.
*/
#define KS_EMPTY_BIN -1
/** Filtered bin identifier. */
#define KS_FILTERED_BIN -2
/** Overflow Event identifier. */
#define KS_EVENT_OVERFLOW (-EOVERFLOW)
/** Matching condition function type. To be user for data requests */
typedef bool (matching_condition_func)(struct kshark_context*,
struct kshark_entry*,
int, int*);
/**
* Data request structure, defining the properties of the required
* kshark_entry.
*/
struct kshark_entry_request {
/** Pointer to the next Data request. */
struct kshark_entry_request *next;
/**
* Array index specifying the position inside the array from where
* the search starts.
*/
size_t first;
/** Number of array elements to search in. */
size_t n;
/** Matching condition function. */
matching_condition_func *cond;
/** Data stream identifier. */
int sd;
/**
* Matching condition value, used by the Matching condition function.
*/
int *values;
/** If true, a visible entry is requested. */
bool vis_only;
/**
* If "vis_only" is true, use this mask to specify the level of
* visibility of the requested entry.
*/
uint8_t vis_mask;
};
struct kshark_entry_request *
kshark_entry_request_alloc(size_t first, size_t n,
matching_condition_func cond, int sd, int *values,
bool vis_only, int vis_mask);
void kshark_free_entry_request(struct kshark_entry_request *req);
const struct kshark_entry *
kshark_get_entry_front(const struct kshark_entry_request *req,
struct kshark_entry **data,
ssize_t *index);
const struct kshark_entry *
kshark_get_entry_back(const struct kshark_entry_request *req,
struct kshark_entry **data,
ssize_t *index);
/**
* Data collections are used to optimize the search for an entry having an
* abstract property, defined by a Matching condition function and an array of
* values. When a collection is processed, the data which is relevant for the
* collection is enclosed in "Data intervals", defined by pairs of "Resume" and
* "Break" points. It is guaranteed that the data outside of the intervals
* contains no entries satisfying the abstract matching condition. However, the
* intervals may (will) contain data that do not satisfy the matching condition.
* Once defined, the Data collection can be used when searching for an entry
* having the same (ore related) abstract property. The collection allows to
* ignore the irrelevant data, thus it eliminates the linear worst-case time
* complexity of the search.
*/
struct kshark_entry_collection {
/** Pointer to the next Data collection. */
struct kshark_entry_collection *next;
/** Matching condition function, used to define the collections. */
matching_condition_func *cond;
/** Data stream identifier. */
int stream_id;
/**
* Array of matching condition values, used by the Matching condition
* finction to define the collection.
*/
int *values;
/** The suze of the array of matching condition values. */
int n_val;
/**
* Array of indexes defining the beginning of each individual data
* interval.
*/
size_t *resume_points;
/**
* Array of indexes defining the end of each individual data interval.
*/
size_t *break_points;
/** Number of data intervals in this collection. */
size_t size;
};
struct kshark_entry_collection *
kshark_add_collection_to_list(struct kshark_context *kshark_ctx,
struct kshark_entry_collection **col_list,
struct kshark_entry **data,
size_t n_rows,
matching_condition_func cond,
int sd, int *values, size_t n_val,
size_t margin);
struct kshark_entry_collection *
kshark_register_data_collection(struct kshark_context *kshark_ctx,
struct kshark_entry **data, size_t n_rows,
matching_condition_func cond,
int sd, int *values, size_t n_val,
size_t margin);
void kshark_unregister_data_collection(struct kshark_entry_collection **col,
matching_condition_func cond,
int sd, int *values, size_t n_val);
struct kshark_entry_collection *
kshark_find_data_collection(struct kshark_entry_collection *col,
matching_condition_func cond,
int sd, int *values, size_t n_val);
void kshark_reset_data_collection(struct kshark_entry_collection *col);
void kshark_unregister_stream_collections(struct kshark_entry_collection **col,
int sd);
void kshark_free_collection_list(struct kshark_entry_collection *col);
const struct kshark_entry *
kshark_get_collection_entry_front(struct kshark_entry_request *req,
struct kshark_entry **data,
const struct kshark_entry_collection *col,
ssize_t *index);
const struct kshark_entry *
kshark_get_collection_entry_back(struct kshark_entry_request *req,
struct kshark_entry **data,
const struct kshark_entry_collection *col,
ssize_t *index);
/** Structure representing a KernelShark Configuration document. */
struct kshark_config_doc {
/** Document format identifier. */
int format;
/** Configuration document instance. */
void *conf_doc;
};
/** Configuration format identifiers. */
enum kshark_config_formats {
/** Unformatted Configuration document identifier. */
KS_CONFIG_AUTO = 0,
/**
* String Configuration document identifier. The String format is
* meant to be used only by kshark_config_doc_add() and
* kshark_config_doc_get(), when adding/getting simple string fields.
*/
KS_CONFIG_STRING,
/** Json Configuration document identifier. */
KS_CONFIG_JSON,
};
/**
* Field name for the Configuration document describing the Hide Event filter.
*/
#define KS_HIDE_EVENT_FILTER_NAME "hide event filter"
/**
* Field name for the Configuration document describing the Show Event filter.
*/
#define KS_SHOW_EVENT_FILTER_NAME "show event filter"
/**
* Field name for the Configuration document describing the Hide Task filter.
*/
#define KS_HIDE_TASK_FILTER_NAME "hide task filter"
/**
* Field name for the Configuration document describing the Show Task filter.
*/
#define KS_SHOW_TASK_FILTER_NAME "show task filter"
/**
* Field name for the Configuration document describing the Hide Task filter.
*/
#define KS_HIDE_CPU_FILTER_NAME "hide cpu filter"
/**
* Field name for the Configuration document describing the Show Task filter.
*/
#define KS_SHOW_CPU_FILTER_NAME "show cpu filter"
/**
* Field name for the Configuration document describing the Advanced event
* filter.
*/
#define KS_ADV_EVENT_FILTER_NAME "adv event filter"
/**
* Field name for the Configuration document describing user-specified filter
* mask.
*/
#define KS_USER_FILTER_MASK_NAME "filter mask"
/**
* Field name for the Configuration document describing the state of the Vis.
* model.
*/
#define KS_HISTO_NAME "vis. model"
/**
* Field name for the Configuration document describing the currently loaded
* trace data file.
*/
#define KS_DATA_SOURCE_NAME "trace data"
/**
* Field name for the Configuration document describing all currently loaded
* data streams.
*/
#define KS_DSTREAMS_NAME "data streams"
struct kshark_config_doc *
kshark_config_alloc(enum kshark_config_formats);
struct kshark_config_doc *
kshark_config_new(const char *type, enum kshark_config_formats);
void kshark_free_config_doc(struct kshark_config_doc *conf);
struct kshark_config_doc *
kshark_record_config_new(enum kshark_config_formats);
struct kshark_config_doc *
kshark_stream_config_new(enum kshark_config_formats);
struct kshark_config_doc *
kshark_filter_config_new(enum kshark_config_formats);
struct kshark_config_doc *
kshark_session_config_new(enum kshark_config_formats format);
struct kshark_config_doc *kshark_string_config_alloc(void);
bool kshark_type_check(struct kshark_config_doc *conf, const char *type);
bool kshark_config_doc_add(struct kshark_config_doc *conf,
const char *key,
struct kshark_config_doc *val);
bool kshark_config_doc_get(struct kshark_config_doc *conf,
const char *key,
struct kshark_config_doc *val);
struct kshark_trace_histo;
struct kshark_config_doc *
kshark_export_trace_file(const char *file, const char *name,
enum kshark_config_formats format);
int kshark_import_trace_file(struct kshark_context *kshark_ctx,
struct kshark_config_doc *conf);
struct kshark_config_doc *
kshark_export_plugin_file(struct kshark_plugin_list *plugin,
enum kshark_config_formats format);
struct kshark_config_doc *
kshark_export_all_plugins(struct kshark_context *kshark_ctx,
enum kshark_config_formats format);
bool kshark_import_all_plugins(struct kshark_context *kshark_ctx,
struct kshark_config_doc *conf);
struct kshark_config_doc *
kshark_export_stream_plugins(struct kshark_data_stream *stream,
enum kshark_config_formats format);
bool kshark_import_stream_plugins(struct kshark_context *kshark_ctx,
struct kshark_data_stream *stream,
struct kshark_config_doc *conf);
struct kshark_config_doc *
kshark_export_model(struct kshark_trace_histo *histo,
enum kshark_config_formats format);
bool kshark_import_model(struct kshark_trace_histo *histo,
struct kshark_config_doc *conf);
bool kshark_export_adv_filters(struct kshark_context *kshark_ctx, int sd,
struct kshark_config_doc **conf);
bool kshark_import_adv_filters(struct kshark_context *kshark_ctx, int sd,
struct kshark_config_doc *conf);
bool kshark_export_event_filter(struct kshark_data_stream *stream,
enum kshark_filter_type filter_type,
const char *filter_name,
struct kshark_config_doc *conf);
int kshark_import_event_filter(struct kshark_data_stream *stream,
enum kshark_filter_type filter_type,
const char *filter_name,
struct kshark_config_doc *conf);
bool kshark_export_user_mask(struct kshark_context *kshark_ctx,
struct kshark_config_doc **conf);
bool kshark_import_user_mask(struct kshark_context *kshark_ctx,
struct kshark_config_doc *conf);
bool kshark_export_filter_array(struct kshark_hash_id *filter,
const char *filter_name,
struct kshark_config_doc *conf);
bool kshark_import_filter_array(struct kshark_hash_id *filter,
const char *filter_name,
struct kshark_config_doc *conf);
bool kshark_export_all_event_filters(struct kshark_context *kshark_ctx, int sd,
struct kshark_config_doc **conf);
bool kshark_export_all_task_filters(struct kshark_context *kshark_ctx, int sd,
struct kshark_config_doc **conf);
bool kshark_export_all_cpu_filters(struct kshark_context *kshark_ctx, int sd,
struct kshark_config_doc **conf);
struct kshark_config_doc *
kshark_export_all_filters(struct kshark_context *kshark_ctx, int sd,
enum kshark_config_formats format);
bool kshark_import_all_event_filters(struct kshark_context *kshark_ctx, int sd,
struct kshark_config_doc *conf);
bool kshark_import_all_task_filters(struct kshark_context *kshark_ctx, int sd,
struct kshark_config_doc *conf);
bool kshark_import_all_cpu_filters(struct kshark_context *kshark_ctx, int sd,
struct kshark_config_doc *conf);
bool kshark_import_all_filters(struct kshark_context *kshark_ctx, int sd,
struct kshark_config_doc *conf);
struct kshark_config_doc *
kshark_export_dstream(struct kshark_context *kshark_ctx, int sd,
enum kshark_config_formats format);
int kshark_import_dstream(struct kshark_context *kshark_ctx,
struct kshark_config_doc *conf);
bool kshark_export_all_dstreams(struct kshark_context *kshark_ctx,
struct kshark_config_doc **conf);
ssize_t kshark_import_all_dstreams(struct kshark_context *kshark_ctx,
struct kshark_config_doc *conf,
struct kshark_entry ***data_rows);
bool kshark_save_config_file(const char *file_name,
struct kshark_config_doc *conf);
struct kshark_config_doc *kshark_open_config_file(const char *file_name,
const char *type);
struct kshark_config_doc *kshark_json_to_conf(struct json_object *jobj);
void kshark_offset_calib(int64_t *ts, int64_t *atgv);
void kshark_set_clock_offset(struct kshark_context *kshark_ctx,
struct kshark_entry **entries, size_t size,
int sd, int64_t offset);
/** Structure representing a data set made of KernelShark entries. */
struct kshark_entry_data_set {
/** Array of entries pointers. */
struct kshark_entry **data;
/** The size of the data set. */
ssize_t n_rows;
};
struct kshark_entry **
kshark_merge_data_entries(struct kshark_entry_data_set *buffers,
int n_buffers);
ssize_t kshark_load_all_entries(struct kshark_context *kshark_ctx,
struct kshark_entry ***data_rows);
ssize_t kshark_append_all_entries(struct kshark_context *kshark_ctx,
struct kshark_entry **prior_data,
ssize_t n_prior_rows,
int first_streams,
struct kshark_entry ***merged_data);
bool kshark_data_matrix_alloc(size_t n_rows, int16_t **event_array,
int16_t **cpu_array,
int32_t **pid_array,
int64_t **offset_array,
int64_t **ts_array);
/** Structure representing a data set made of data columns (arrays). */
struct kshark_matrix_data_set {
/** Event Id column. */
int16_t *event_array;
/** CPU Id column. */
int16_t *cpu_array;
/** PID column. */
int32_t *pid_array;
/** Record offset column. */
int64_t *offset_array;
/** Timestamp column. */
int64_t *ts_array;
/** The size of the data set. */
ssize_t n_rows;
};
struct kshark_matrix_data_set
kshark_merge_data_matrices(struct kshark_matrix_data_set *buffers,
int n_buffers);
/**
* Structure used to store the data of a kshark_entry plus one additional
* 64 bit integer data field.
*/
struct kshark_data_field_int64 {
/** The entry object holding the basic data of the trace record. */
struct kshark_entry *entry;
/** Additional 64 bit integer data field. */
int64_t field;
};
/** The capacity of the kshark_data_container object after initialization. */
#define KS_CONTAINER_DEFAULT_SIZE 1024
/** Structure used to store an array of entries and data fields. */
struct kshark_data_container {
/** An array of kshark_data_field_int64 objects. */
struct kshark_data_field_int64 **data;
/** The total number of kshark_data_field_int64 objects stored. */
ssize_t size;
/** The memory capacity of the container. */
ssize_t capacity;
/** Is sorted in time. */
bool sorted;
};
struct kshark_data_container *kshark_init_data_container();
void kshark_free_data_container(struct kshark_data_container *container);
ssize_t kshark_data_container_append(struct kshark_data_container *container,
struct kshark_entry *entry, int64_t field);
void kshark_data_container_sort(struct kshark_data_container *container);
ssize_t kshark_find_entry_field_by_time(int64_t time,
struct kshark_data_field_int64 **data,
size_t l, size_t h);
#ifdef __cplusplus
}
#endif
#endif // _LIB_KSHARK_H