From 6dcb5e5fdde00b93b0afbf466070199356b2dc9d Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Thu, 15 Jun 2023 16:14:32 -0700 Subject: [PATCH] libsysprof-analyze: include time as fractions for marks This allows more easily calculating the horizontal position of marks and their duration from charts. --- .../sysprof-document-frame-private.h | 15 ++++++- .../sysprof-document-frame.c | 21 +++++++++- .../sysprof-document-mark.c | 42 +++++++++++++------ .../sysprof-document-mark.h | 14 ++++--- src/libsysprof-analyze/sysprof-document.c | 3 +- 5 files changed, 73 insertions(+), 22 deletions(-) diff --git a/src/libsysprof-analyze/sysprof-document-frame-private.h b/src/libsysprof-analyze/sysprof-document-frame-private.h index 3755009e..6035313e 100644 --- a/src/libsysprof-analyze/sysprof-document-frame-private.h +++ b/src/libsysprof-analyze/sysprof-document-frame-private.h @@ -42,11 +42,24 @@ struct _SysprofDocumentFrameClass GObjectClass parent_class; }; +struct _SysprofDocumentMark +{ + SysprofDocumentFrame parent_instance; + double begin_fraction; + double end_fraction; +}; + +struct _SysprofDocumentMarkClass +{ + SysprofDocumentFrameClass parent_class; +}; + SysprofDocumentFrame *_sysprof_document_frame_new (GMappedFile *mapped, const SysprofCaptureFrame *frame, guint16 frame_len, gboolean needs_swap, - gint64 clock_at_start); + gint64 begin_time, + gint64 end_time); #define SYSPROF_DOCUMENT_FRAME_ENDPTR(obj) \ (&((const guint8 *)SYSPROF_DOCUMENT_FRAME(obj)->frame)[SYSPROF_DOCUMENT_FRAME(obj)->frame_len]) diff --git a/src/libsysprof-analyze/sysprof-document-frame.c b/src/libsysprof-analyze/sysprof-document-frame.c index d7259c5b..e6f7e7dd 100644 --- a/src/libsysprof-analyze/sysprof-document-frame.c +++ b/src/libsysprof-analyze/sysprof-document-frame.c @@ -142,9 +142,11 @@ _sysprof_document_frame_new (GMappedFile *mapped_file, const SysprofCaptureFrame *frame, guint16 frame_len, gboolean needs_swap, - gint64 begin_time) + gint64 begin_time, + gint64 end_time) { SysprofDocumentFrame *self; + gint64 time_offset; GType gtype; switch (frame->type) @@ -206,12 +208,27 @@ _sysprof_document_frame_new (GMappedFile *mapped_file, break; } + self = g_object_new (gtype, NULL); self->mapped_file = g_mapped_file_ref (mapped_file); self->frame = frame; self->frame_len = frame_len; self->needs_swap = !!needs_swap; - self->time_offset = CLAMP (sysprof_document_frame_get_time (self) - begin_time, 0, G_MAXINT64); + + time_offset = CLAMP (sysprof_document_frame_get_time (self) - begin_time, 0, G_MAXINT64); + + /* loose precision here after about 71 minutes */ + self->time_offset = (guint)time_offset; + + if (frame->type == SYSPROF_CAPTURE_FRAME_MARK) + { + SysprofDocumentMark *mark = (SysprofDocumentMark *)self; + gint64 capture_duration = end_time - begin_time; + gint64 duration = sysprof_document_mark_get_duration (mark); + + mark->begin_fraction = time_offset / (double)capture_duration; + mark->end_fraction = (time_offset + duration) / (double)capture_duration; + } return self; } diff --git a/src/libsysprof-analyze/sysprof-document-mark.c b/src/libsysprof-analyze/sysprof-document-mark.c index aa91904c..43c51f3a 100644 --- a/src/libsysprof-analyze/sysprof-document-mark.c +++ b/src/libsysprof-analyze/sysprof-document-mark.c @@ -23,16 +23,6 @@ #include "sysprof-document-frame-private.h" #include "sysprof-document-mark.h" -struct _SysprofDocumentMark -{ - SysprofDocumentFrame parent_instance; -}; - -struct _SysprofDocumentMarkClass -{ - SysprofDocumentFrameClass parent_class; -}; - enum { PROP_0, PROP_DURATION, @@ -48,9 +38,9 @@ static GParamSpec *properties [N_PROPS]; static void sysprof_document_mark_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) + guint prop_id, + GValue *value, + GParamSpec *pspec) { SysprofDocumentMark *self = SYSPROF_DOCUMENT_MARK (object); @@ -159,3 +149,29 @@ sysprof_document_mark_get_message (SysprofDocumentMark *self) return SYSPROF_DOCUMENT_FRAME_CSTRING (self, mark->message); } + +/** + * sysprof_document_mark_get_time_fraction: + * @self: a #SysprofDocumentMark + * @begin_fraction: (out) (nullable): a location for the begin + * time as a fraction + * @end_fraction: (out) (nullable): a location for the end + * time as a fraction + * + * Gets the begin/end time of the mark as a fraction between 0 and 1. + * + * 0 is the beginning of the capture, 1 is the end of the capture. + */ +void +sysprof_document_mark_get_time_fraction (SysprofDocumentMark *self, + double *begin_fraction, + double *end_fraction) +{ + g_return_if_fail (SYSPROF_IS_DOCUMENT_MARK (self)); + + if (begin_fraction) + *begin_fraction = self->begin_fraction; + + if (end_fraction) + *end_fraction = self->end_fraction; +} diff --git a/src/libsysprof-analyze/sysprof-document-mark.h b/src/libsysprof-analyze/sysprof-document-mark.h index 99bd7550..e549f597 100644 --- a/src/libsysprof-analyze/sysprof-document-mark.h +++ b/src/libsysprof-analyze/sysprof-document-mark.h @@ -33,15 +33,19 @@ typedef struct _SysprofDocumentMark SysprofDocumentMark; typedef struct _SysprofDocumentMarkClass SysprofDocumentMarkClass; SYSPROF_AVAILABLE_IN_ALL -GType sysprof_document_mark_get_type (void) G_GNUC_CONST; +GType sysprof_document_mark_get_type (void) G_GNUC_CONST; SYSPROF_AVAILABLE_IN_ALL -gint64 sysprof_document_mark_get_duration (SysprofDocumentMark *self); +gint64 sysprof_document_mark_get_duration (SysprofDocumentMark *self); SYSPROF_AVAILABLE_IN_ALL -const char *sysprof_document_mark_get_group (SysprofDocumentMark *self); +const char *sysprof_document_mark_get_group (SysprofDocumentMark *self); SYSPROF_AVAILABLE_IN_ALL -const char *sysprof_document_mark_get_name (SysprofDocumentMark *self); +const char *sysprof_document_mark_get_name (SysprofDocumentMark *self); SYSPROF_AVAILABLE_IN_ALL -const char *sysprof_document_mark_get_message (SysprofDocumentMark *self); +const char *sysprof_document_mark_get_message (SysprofDocumentMark *self); +SYSPROF_AVAILABLE_IN_ALL +void sysprof_document_mark_get_time_fraction (SysprofDocumentMark *self, + double *begin_fraction, + double *end_fraction); G_DEFINE_AUTOPTR_CLEANUP_FUNC (SysprofDocumentMark, g_object_unref) diff --git a/src/libsysprof-analyze/sysprof-document.c b/src/libsysprof-analyze/sysprof-document.c index ca7e0daa..cc620a10 100644 --- a/src/libsysprof-analyze/sysprof-document.c +++ b/src/libsysprof-analyze/sysprof-document.c @@ -125,7 +125,8 @@ sysprof_document_get_item (GListModel *model, (gconstpointer)&self->base[ptr->offset], ptr->length, self->needs_swap, - self->header.time); + self->header.time, + self->header.end_time); /* Annotate processes with pre-calculated info */ if (SYSPROF_IS_DOCUMENT_PROCESS (ret))