From d4da036f73833356ca0a3ed126728aa3ab9049cd Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Thu, 15 Jun 2023 16:43:17 -0700 Subject: [PATCH] libsysprof-analyze: move timespan to analyze library That way we can use it for the document itself, and have it update the timespan of the recording in case it didn't get updated due to ctrl+c or something prematurely stopping. --- src/libsysprof-analyze/meson.build | 2 + src/libsysprof-analyze/sysprof-document.c | 54 +++++++++++++++ src/libsysprof-analyze/sysprof-document.h | 65 ++++++++++--------- .../sysprof-time-span.c | 3 + .../sysprof-time-span.h | 0 src/libsysprof-gtk/meson.build | 2 - src/libsysprof-gtk/sysprof-gtk.h | 1 - 7 files changed, 92 insertions(+), 35 deletions(-) rename src/{libsysprof-gtk => libsysprof-analyze}/sysprof-time-span.c (96%) rename src/{libsysprof-gtk => libsysprof-analyze}/sysprof-time-span.h (100%) diff --git a/src/libsysprof-analyze/meson.build b/src/libsysprof-analyze/meson.build index 5c65a982..6fad4cfa 100644 --- a/src/libsysprof-analyze/meson.build +++ b/src/libsysprof-analyze/meson.build @@ -32,6 +32,7 @@ libsysprof_analyze_public_sources = [ 'sysprof-no-symbolizer.c', 'sysprof-symbol.c', 'sysprof-symbolizer.c', + 'sysprof-time-span.c', ] libsysprof_analyze_private_sources = [ @@ -47,6 +48,7 @@ libsysprof_analyze_private_sources = [ 'sysprof-process-info.c', 'sysprof-strings.c', 'sysprof-symbol-cache.c', + 'sysprof-time-span.h', ] libsysprof_analyze_public_headers = [ diff --git a/src/libsysprof-analyze/sysprof-document.c b/src/libsysprof-analyze/sysprof-document.c index cc620a10..8098472a 100644 --- a/src/libsysprof-analyze/sysprof-document.c +++ b/src/libsysprof-analyze/sysprof-document.c @@ -56,6 +56,8 @@ struct _SysprofDocument { GObject parent_instance; + SysprofTimeSpan time_span; + GArray *frames; GMappedFile *mapped_file; const guint8 *base; @@ -97,6 +99,14 @@ typedef struct _SysprofDocumentFramePointer guint64 length : 16; } SysprofDocumentFramePointer; +enum { + PROP_0, + PROP_TIME_SPAN, + N_PROPS +}; + +static GParamSpec *properties[N_PROPS]; + static GType sysprof_document_get_item_type (GListModel *model) { @@ -244,12 +254,40 @@ sysprof_document_finalize (GObject *object) G_OBJECT_CLASS (sysprof_document_parent_class)->finalize (object); } + +static void +sysprof_document_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + SysprofDocument *self = SYSPROF_DOCUMENT (object); + + switch (prop_id) + { + case PROP_TIME_SPAN: + g_value_set_boxed (value, sysprof_document_get_time_span (self)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + static void sysprof_document_class_init (SysprofDocumentClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = sysprof_document_finalize; + object_class->get_property = sysprof_document_get_property; + + properties [PROP_TIME_SPAN] = + g_param_spec_boxed ("time-span", NULL, NULL, + SYSPROF_TYPE_TIME_SPAN, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_properties (object_class, N_PROPS, properties); } static void @@ -659,11 +697,15 @@ sysprof_document_load_worker (GTask *task, self->header.end_time = GUINT64_SWAP_LE_BE (self->header.end_time); } + self->time_span.begin_nsec = self->header.time; + self->time_span.end_nsec = self->header.end_time; + pos = sizeof self->header; while (pos < (len - sizeof(guint16))) { const SysprofCaptureFrame *tainted; SysprofDocumentFramePointer ptr; + gint64 t; guint16 frame_len; int pid; @@ -680,6 +722,10 @@ sysprof_document_load_worker (GTask *task, tainted = (const SysprofCaptureFrame *)(gpointer)&self->base[pos]; pid = self->needs_swap ? GUINT32_SWAP_LE_BE (tainted->pid) : tainted->pid; + t = self->needs_swap ? GUINT64_SWAP_LE_BE (tainted->time) : tainted->time; + + if (t > self->time_span.end_nsec) + self->time_span.end_nsec = t; egg_bitset_add (self->pids, pid); @@ -1514,3 +1560,11 @@ sysprof_document_catalog_marks (SysprofDocument *self) return G_LIST_MODEL (store); } + +const SysprofTimeSpan * +sysprof_document_get_time_span (SysprofDocument *self) +{ + g_return_val_if_fail (SYSPROF_IS_DOCUMENT (self), NULL); + + return &self->time_span; +} diff --git a/src/libsysprof-analyze/sysprof-document.h b/src/libsysprof-analyze/sysprof-document.h index 0d5d1329..b7abc9f4 100644 --- a/src/libsysprof-analyze/sysprof-document.h +++ b/src/libsysprof-analyze/sysprof-document.h @@ -29,6 +29,7 @@ #include "sysprof-document-traceable.h" #include "sysprof-mark-catalog.h" #include "sysprof-symbol.h" +#include "sysprof-time-span.h" G_BEGIN_DECLS @@ -38,51 +39,51 @@ SYSPROF_AVAILABLE_IN_ALL G_DECLARE_FINAL_TYPE (SysprofDocument, sysprof_document, SYSPROF, DOCUMENT, GObject) SYSPROF_AVAILABLE_IN_ALL -gint64 sysprof_document_get_clock_at_start (SysprofDocument *self); +const SysprofTimeSpan *sysprof_document_get_time_span (SysprofDocument *self); SYSPROF_AVAILABLE_IN_ALL -SysprofDocumentFile *sysprof_document_lookup_file (SysprofDocument *self, - const char *path); +SysprofDocumentFile *sysprof_document_lookup_file (SysprofDocument *self, + const char *path); SYSPROF_AVAILABLE_IN_ALL -GListModel *sysprof_document_list_files (SysprofDocument *self); +GListModel *sysprof_document_list_files (SysprofDocument *self); SYSPROF_AVAILABLE_IN_ALL -GListModel *sysprof_document_list_traceables (SysprofDocument *self); +GListModel *sysprof_document_list_traceables (SysprofDocument *self); SYSPROF_AVAILABLE_IN_ALL -GListModel *sysprof_document_list_allocations (SysprofDocument *self); +GListModel *sysprof_document_list_allocations (SysprofDocument *self); SYSPROF_AVAILABLE_IN_ALL -GListModel *sysprof_document_list_samples (SysprofDocument *self); +GListModel *sysprof_document_list_samples (SysprofDocument *self); SYSPROF_AVAILABLE_IN_ALL -GListModel *sysprof_document_list_processes (SysprofDocument *self); +GListModel *sysprof_document_list_processes (SysprofDocument *self); SYSPROF_AVAILABLE_IN_ALL -GListModel *sysprof_document_list_jitmaps (SysprofDocument *self); +GListModel *sysprof_document_list_jitmaps (SysprofDocument *self); SYSPROF_AVAILABLE_IN_ALL -GListModel *sysprof_document_list_counters (SysprofDocument *self); +GListModel *sysprof_document_list_counters (SysprofDocument *self); SYSPROF_AVAILABLE_IN_ALL -GListModel *sysprof_document_list_marks (SysprofDocument *self); +GListModel *sysprof_document_list_marks (SysprofDocument *self); SYSPROF_AVAILABLE_IN_ALL -GListModel *sysprof_document_catalog_marks (SysprofDocument *self); +GListModel *sysprof_document_catalog_marks (SysprofDocument *self); SYSPROF_AVAILABLE_IN_ALL -GListModel *sysprof_document_list_symbols_in_traceable (SysprofDocument *self, - SysprofDocumentTraceable *traceable); +GListModel *sysprof_document_list_symbols_in_traceable (SysprofDocument *self, + SysprofDocumentTraceable *traceable); SYSPROF_AVAILABLE_IN_ALL -guint sysprof_document_symbolize_traceable (SysprofDocument *self, - SysprofDocumentTraceable *traceable, - SysprofSymbol **symbols, - guint n_symbols, - SysprofAddressContext *final_context); +guint sysprof_document_symbolize_traceable (SysprofDocument *self, + SysprofDocumentTraceable *traceable, + SysprofSymbol **symbols, + guint n_symbols, + SysprofAddressContext *final_context); SYSPROF_AVAILABLE_IN_ALL -void sysprof_document_callgraph_async (SysprofDocument *self, - SysprofCallgraphFlags flags, - GListModel *traceables, - gsize augment_size, - SysprofAugmentationFunc augment_func, - gpointer augment_func_data, - GDestroyNotify augment_func_data_destroy, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); +void sysprof_document_callgraph_async (SysprofDocument *self, + SysprofCallgraphFlags flags, + GListModel *traceables, + gsize augment_size, + SysprofAugmentationFunc augment_func, + gpointer augment_func_data, + GDestroyNotify augment_func_data_destroy, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); SYSPROF_AVAILABLE_IN_ALL -SysprofCallgraph *sysprof_document_callgraph_finish (SysprofDocument *self, - GAsyncResult *result, - GError **error); +SysprofCallgraph *sysprof_document_callgraph_finish (SysprofDocument *self, + GAsyncResult *result, + GError **error); G_END_DECLS diff --git a/src/libsysprof-gtk/sysprof-time-span.c b/src/libsysprof-analyze/sysprof-time-span.c similarity index 96% rename from src/libsysprof-gtk/sysprof-time-span.c rename to src/libsysprof-analyze/sysprof-time-span.c index d690965b..ef18d93f 100644 --- a/src/libsysprof-gtk/sysprof-time-span.c +++ b/src/libsysprof-analyze/sysprof-time-span.c @@ -27,6 +27,9 @@ G_DEFINE_BOXED_TYPE (SysprofTimeSpan, sysprof_time_span, sysprof_time_span_copy, SysprofTimeSpan * sysprof_time_span_copy (const SysprofTimeSpan *self) { + if (self == NULL) + return NULL; + return g_memdup2 (self, sizeof *self); } diff --git a/src/libsysprof-gtk/sysprof-time-span.h b/src/libsysprof-analyze/sysprof-time-span.h similarity index 100% rename from src/libsysprof-gtk/sysprof-time-span.h rename to src/libsysprof-analyze/sysprof-time-span.h diff --git a/src/libsysprof-gtk/meson.build b/src/libsysprof-gtk/meson.build index 88aade31..dae0173e 100644 --- a/src/libsysprof-gtk/meson.build +++ b/src/libsysprof-gtk/meson.build @@ -3,7 +3,6 @@ libsysprof_gtk_public_sources = [ 'sysprof-mark-chart.c', 'sysprof-mark-table.c', 'sysprof-session.c', - 'sysprof-time-span.c', 'sysprof-weighted-callgraph-view.c', ] @@ -22,7 +21,6 @@ libsysprof_gtk_public_headers = [ 'sysprof-mark-chart.h', 'sysprof-mark-table.h', 'sysprof-session.h', - 'sysprof-time-span.h', 'sysprof-weighted-callgraph-view.h', ] diff --git a/src/libsysprof-gtk/sysprof-gtk.h b/src/libsysprof-gtk/sysprof-gtk.h index e0b22302..c886f0c3 100644 --- a/src/libsysprof-gtk/sysprof-gtk.h +++ b/src/libsysprof-gtk/sysprof-gtk.h @@ -27,7 +27,6 @@ G_BEGIN_DECLS # include "sysprof-mark-chart.h" # include "sysprof-mark-table.h" # include "sysprof-session.h" -# include "sysprof-time-span.h" # include "sysprof-weighted-callgraph-view.h" #undef SYSPROF_GTK_INSIDE