mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2025-12-31 20:36:25 +00:00
libsysprof-ui: calculate min/max/avg for mark durations
This can be used in details later to show information about the marks.
This commit is contained in:
@ -89,6 +89,24 @@ load_async_free (gpointer data)
|
||||
}
|
||||
}
|
||||
|
||||
SysprofMarkStat *
|
||||
_sysprof_mark_stat_new (const gchar *name)
|
||||
{
|
||||
SysprofMarkStat *ret;
|
||||
|
||||
ret = g_slice_new0 (SysprofMarkStat);
|
||||
ret->name = g_strdup (name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
_sysprof_mark_stat_free (SysprofMarkStat *self)
|
||||
{
|
||||
g_clear_pointer (&self->name, g_free);
|
||||
g_slice_free (SysprofMarkStat, self);
|
||||
}
|
||||
|
||||
/**
|
||||
* sysprof_capture_view_new:
|
||||
*
|
||||
@ -224,6 +242,7 @@ sysprof_capture_view_scan_worker (GTask *task,
|
||||
SysprofCaptureView *self = source_object;
|
||||
SysprofCaptureViewPrivate *priv = sysprof_capture_view_get_instance_private (self);
|
||||
SysprofCaptureReader *reader = task_data;
|
||||
g_autoptr(GHashTable) mark_stats = NULL;
|
||||
SysprofCaptureFeatures features = {0};
|
||||
SysprofCaptureFrame frame;
|
||||
SysprofCaptureStat st_buf = {{0}};
|
||||
@ -233,6 +252,9 @@ sysprof_capture_view_scan_worker (GTask *task,
|
||||
g_assert (reader != NULL);
|
||||
g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
|
||||
|
||||
mark_stats = g_hash_table_new_full (g_str_hash, g_str_equal, NULL,
|
||||
(GDestroyNotify)_sysprof_mark_stat_free);
|
||||
|
||||
features.begin_time = sysprof_capture_reader_get_start_time (reader);
|
||||
features.end_time = sysprof_capture_reader_get_end_time (reader);
|
||||
|
||||
@ -248,8 +270,34 @@ sysprof_capture_view_scan_worker (GTask *task,
|
||||
if (frame.type == SYSPROF_CAPTURE_FRAME_MARK)
|
||||
{
|
||||
const SysprofCaptureMark *mark;
|
||||
|
||||
if ((mark = sysprof_capture_reader_read_mark (reader)))
|
||||
end_time = frame.time + mark->duration;
|
||||
{
|
||||
SysprofMarkStat *mstat;
|
||||
gchar name[128];
|
||||
|
||||
end_time = frame.time + mark->duration;
|
||||
|
||||
g_snprintf (name, sizeof name, "%s:%s", mark->group, mark->name);
|
||||
|
||||
if (!(mstat = g_hash_table_lookup (mark_stats, name)))
|
||||
{
|
||||
mstat = _sysprof_mark_stat_new (name);
|
||||
g_hash_table_insert (mark_stats, mstat->name, mstat);
|
||||
}
|
||||
|
||||
if (mark->duration > 0)
|
||||
{
|
||||
if (mstat->min == 0 || mark->duration < mstat->min)
|
||||
mstat->min = mark->duration;
|
||||
}
|
||||
|
||||
if (mark->duration > mstat->max)
|
||||
mstat->max = mark->duration;
|
||||
|
||||
mstat->avg += mark->duration;
|
||||
mstat->count++;
|
||||
}
|
||||
|
||||
features.has_marks = TRUE;
|
||||
}
|
||||
@ -275,6 +323,29 @@ sysprof_capture_view_scan_worker (GTask *task,
|
||||
features.end_time = end_time;
|
||||
}
|
||||
|
||||
{
|
||||
GHashTableIter iter;
|
||||
gpointer k,v;
|
||||
|
||||
g_hash_table_iter_init (&iter, mark_stats);
|
||||
while (g_hash_table_iter_next (&iter, &k, &v))
|
||||
{
|
||||
SysprofMarkStat *mstat = v;
|
||||
|
||||
if (mstat->count > 0 && mstat->avg > 0)
|
||||
mstat->avg /= mstat->count;
|
||||
|
||||
#if 0
|
||||
g_print ("%s: count=%ld avg=%ld min=%ld max=%ld\n",
|
||||
(gchar*)k,
|
||||
((SysprofMarkStat *)v)->count,
|
||||
((SysprofMarkStat *)v)->avg,
|
||||
((SysprofMarkStat *)v)->min,
|
||||
((SysprofMarkStat *)v)->max);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
sysprof_capture_reader_set_stat (reader, &st_buf);
|
||||
|
||||
if (!g_task_return_error_if_cancelled (task))
|
||||
|
||||
@ -25,13 +25,26 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
void _sysprof_marks_view_set_hadjustment (SysprofMarksView *self,
|
||||
GtkAdjustment *hadjustment);
|
||||
void _sysprof_visualizer_view_set_hadjustment (SysprofVisualizerView *self,
|
||||
GtkAdjustment *hadjustment);
|
||||
void _sysprof_rounded_rectangle (cairo_t *cr,
|
||||
const GdkRectangle *rect,
|
||||
gint x_radius,
|
||||
gint y_radius);
|
||||
typedef struct
|
||||
{
|
||||
gchar *name;
|
||||
guint64 count;
|
||||
gint64 max;
|
||||
gint64 min;
|
||||
gint64 avg;
|
||||
} SysprofMarkStat;
|
||||
|
||||
SysprofMarkStat *_sysprof_mark_stat_new (const gchar *name);
|
||||
void _sysprof_mark_stat_free (SysprofMarkStat *self);
|
||||
void _sysprof_marks_view_set_hadjustment (SysprofMarksView *self,
|
||||
GtkAdjustment *hadjustment);
|
||||
void _sysprof_visualizer_view_set_hadjustment (SysprofVisualizerView *self,
|
||||
GtkAdjustment *hadjustment);
|
||||
void _sysprof_rounded_rectangle (cairo_t *cr,
|
||||
const GdkRectangle *rect,
|
||||
gint x_radius,
|
||||
gint y_radius);
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (SysprofMarkStat, _sysprof_mark_stat_free)
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
Reference in New Issue
Block a user