blob: 8989ee0e0b2bba36e7f0b381c95e0da617796684 [file] [log] [blame]
/* SPDX-License-Identifier: LGPL-2.1 */
/*
* Copyright (C) 2017 VMware Inc, Yordan Karadzhov (VMware) <y.karadz@gmail.com>
*/
/**
* @file libkshark-model.h
* @brief Time series visualization model for tracing data.
*/
#ifndef _LIB_KSHARK_MODEL_H
#define _LIB_KSHARK_MODEL_H
// KernelShark
#include "libkshark.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
/**
* Overflow Bin identifiers. The two overflow bins are used to hold the data
* outside the visualized range.
*/
enum OverflowBin {
/**
* Identifier of the Upper Overflow Bin. This bin is used to hold the
* data after (in time) the end of the visualized range.
*/
UPPER_OVERFLOW_BIN = -1,
/**
* Identifier of the Lower Overflow Bin. This bin is used to hold the
* data before (in time) the beginning of the visualized range.
*/
LOWER_OVERFLOW_BIN = -2,
};
/** Structure describing the current state of the visualization model. */
struct kshark_trace_histo {
/** Trace data array. */
struct kshark_entry **data;
/** The size of the data array. */
size_t data_size;
/** The first entry (index of data array) in each bin. */
ssize_t *map;
/** Number of entries in each bin. */
size_t *bin_count;
/** Total number of entries in all bin except the overflow bins. */
int tot_count;
/**
* Lower edge of the time-window to be visualized. Only entries having
* timestamp >= min will be visualized.
*/
int64_t min;
/**
* Upper edge of the time-window to be visualized. Only entries having
* timestamp <= max will be visualized.
*/
int64_t max;
/** The size in time for each bin. */
int64_t bin_size;
/** Number of bins. */
int n_bins;
};
void ksmodel_init(struct kshark_trace_histo *histo);
void ksmodel_clear(struct kshark_trace_histo *histo);
void ksmodel_set_bining(struct kshark_trace_histo *histo,
size_t n, int64_t min, int64_t max);
void ksmodel_fill(struct kshark_trace_histo *histo,
struct kshark_entry **data, size_t n);
size_t ksmodel_bin_count(struct kshark_trace_histo *histo, int bin);
void ksmodel_shift_forward(struct kshark_trace_histo *histo, size_t n);
void ksmodel_shift_backward(struct kshark_trace_histo *histo, size_t n);
void ksmodel_jump_to(struct kshark_trace_histo *histo, int64_t ts);
void ksmodel_zoom_out(struct kshark_trace_histo *histo,
double r, int mark);
void ksmodel_zoom_in(struct kshark_trace_histo *histo,
double r, int mark);
ssize_t ksmodel_first_index_at_bin(struct kshark_trace_histo *histo, int bin);
ssize_t ksmodel_last_index_at_bin(struct kshark_trace_histo *histo, int bin);
ssize_t ksmodel_first_index_at_cpu(struct kshark_trace_histo *histo,
int bin, int sd, int cpu);
ssize_t ksmodel_first_index_at_pid(struct kshark_trace_histo *histo,
int bin, int sd, int pid);
const struct kshark_entry *
ksmodel_get_entry_front(struct kshark_trace_histo *histo,
int bin, bool vis_only,
matching_condition_func func, int sd, int *values,
struct kshark_entry_collection *col,
ssize_t *index);
const struct kshark_entry *
ksmodel_get_entry_back(struct kshark_trace_histo *histo,
int bin, bool vis_only,
matching_condition_func func, int sd, int *values,
struct kshark_entry_collection *col,
ssize_t *index);
int ksmodel_get_pid_front(struct kshark_trace_histo *histo,
int bin, int sd, int cpu, bool vis_only,
struct kshark_entry_collection *col,
ssize_t *index);
int ksmodel_get_pid_back(struct kshark_trace_histo *histo,
int bin, int sd, int cpu, bool vis_only,
struct kshark_entry_collection *col,
ssize_t *index);
int ksmodel_get_cpu_front(struct kshark_trace_histo *histo,
int bin, int sd, int pid, bool vis_only,
struct kshark_entry_collection *col,
ssize_t *index);
int ksmodel_get_cpu_back(struct kshark_trace_histo *histo,
int bin, int sd, int pid, bool vis_only,
struct kshark_entry_collection *col,
ssize_t *index);
bool ksmodel_cpu_visible_event_exist(struct kshark_trace_histo *histo,
int bin, int sd, int cpu,
struct kshark_entry_collection *col,
ssize_t *index);
bool ksmodel_task_visible_event_exist(struct kshark_trace_histo *histo,
int bin, int sd, int pid,
struct kshark_entry_collection *col,
ssize_t *index);
const struct kshark_entry *
ksmodel_get_cpu_missed_events(struct kshark_trace_histo *histo,
int bin, int sd, int cpu,
struct kshark_entry_collection *col,
ssize_t *index);
const struct kshark_entry *
ksmodel_get_task_missed_events(struct kshark_trace_histo *histo,
int bin, int sd, int pid,
struct kshark_entry_collection *col,
ssize_t *index);
static inline int64_t ksmodel_bin_ts(struct kshark_trace_histo *histo,
int bin)
{
return (histo->min + bin*histo->bin_size);
}
static inline double ksmodel_bin_time(struct kshark_trace_histo *histo,
int bin)
{
return ksmodel_bin_ts(histo, bin) * 1e-9;
}
int ksmodel_get_bin(struct kshark_trace_histo *histo,
const struct kshark_entry *entry);
#ifdef __cplusplus
}
#endif // __cplusplus
#endif