From 6031233cc39bd6c07969bc7b2ef09f1962a0e87a Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Thu, 27 Apr 2023 17:22:44 -0700 Subject: [PATCH] libsysprof-analyze: add document type for marks --- src/libsysprof-analyze/meson.build | 2 + src/libsysprof-analyze/sysprof-analyze.h | 1 + .../sysprof-document-frame.c | 3 + .../sysprof-document-mark.c | 161 ++++++++++++++++++ .../sysprof-document-mark.h | 47 +++++ 5 files changed, 214 insertions(+) create mode 100644 src/libsysprof-analyze/sysprof-document-mark.c create mode 100644 src/libsysprof-analyze/sysprof-document-mark.h diff --git a/src/libsysprof-analyze/meson.build b/src/libsysprof-analyze/meson.build index eb5fb0cd..471a9ef3 100644 --- a/src/libsysprof-analyze/meson.build +++ b/src/libsysprof-analyze/meson.build @@ -2,6 +2,7 @@ libsysprof_analyze_public_sources = [ 'sysprof-document.c', 'sysprof-document-frame.c', 'sysprof-document-log.c', + 'sysprof-document-mark.c', 'sysprof-document-mmap.c', 'sysprof-document-sample.c', ] @@ -11,6 +12,7 @@ libsysprof_analyze_public_headers = [ 'sysprof-document.h', 'sysprof-document-frame.h', 'sysprof-document-log.h', + 'sysprof-document-mark.h', 'sysprof-document-mmap.h', 'sysprof-document-sample.h', ] diff --git a/src/libsysprof-analyze/sysprof-analyze.h b/src/libsysprof-analyze/sysprof-analyze.h index 1ed5e941..01814bd4 100644 --- a/src/libsysprof-analyze/sysprof-analyze.h +++ b/src/libsysprof-analyze/sysprof-analyze.h @@ -28,6 +28,7 @@ G_BEGIN_DECLS # include "sysprof-document.h" # include "sysprof-document-frame.h" # include "sysprof-document-log.h" +# include "sysprof-document-mark.h" # include "sysprof-document-mmap.h" # include "sysprof-document-sample.h" #undef SYSPROF_ANALYZE_INSIDE diff --git a/src/libsysprof-analyze/sysprof-document-frame.c b/src/libsysprof-analyze/sysprof-document-frame.c index fb574c3e..0f3fd8e6 100644 --- a/src/libsysprof-analyze/sysprof-document-frame.c +++ b/src/libsysprof-analyze/sysprof-document-frame.c @@ -22,6 +22,7 @@ #include "sysprof-document-frame-private.h" #include "sysprof-document-log.h" +#include "sysprof-document-mark.h" #include "sysprof-document-mmap.h" #include "sysprof-document-sample.h" @@ -130,6 +131,8 @@ _sysprof_document_frame_new (GMappedFile *mapped_file, gtype = SYSPROF_TYPE_DOCUMENT_MMAP; else if (frame->type == SYSPROF_CAPTURE_FRAME_LOG) gtype = SYSPROF_TYPE_DOCUMENT_LOG; + else if (frame->type == SYSPROF_CAPTURE_FRAME_MARK) + gtype = SYSPROF_TYPE_DOCUMENT_MARK; self = g_object_new (gtype, NULL); self->mapped_file = g_mapped_file_ref (mapped_file); diff --git a/src/libsysprof-analyze/sysprof-document-mark.c b/src/libsysprof-analyze/sysprof-document-mark.c new file mode 100644 index 00000000..aa91904c --- /dev/null +++ b/src/libsysprof-analyze/sysprof-document-mark.c @@ -0,0 +1,161 @@ +/* sysprof-document-mark.c + * + * Copyright 2023 Christian Hergert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include "config.h" + +#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, + PROP_GROUP, + PROP_MESSAGE, + PROP_NAME, + N_PROPS +}; + +G_DEFINE_FINAL_TYPE (SysprofDocumentMark, sysprof_document_mark, SYSPROF_TYPE_DOCUMENT_FRAME) + +static GParamSpec *properties [N_PROPS]; + +static void +sysprof_document_mark_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + SysprofDocumentMark *self = SYSPROF_DOCUMENT_MARK (object); + + switch (prop_id) + { + case PROP_DURATION: + g_value_set_int64 (value, sysprof_document_mark_get_duration (self)); + break; + + case PROP_NAME: + g_value_set_string (value, sysprof_document_mark_get_name (self)); + break; + + case PROP_GROUP: + g_value_set_string (value, sysprof_document_mark_get_group (self)); + break; + + case PROP_MESSAGE: + g_value_set_string (value, sysprof_document_mark_get_message (self)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +sysprof_document_mark_class_init (SysprofDocumentMarkClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = sysprof_document_mark_get_property; + + properties [PROP_DURATION] = + g_param_spec_int64 ("duration", NULL, NULL, + G_MININT64, G_MAXINT64, 0, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + properties [PROP_GROUP] = + g_param_spec_string ("group", NULL, NULL, + NULL, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + properties [PROP_NAME] = + g_param_spec_string ("name", NULL, NULL, + NULL, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + properties [PROP_MESSAGE] = + g_param_spec_string ("message", NULL, NULL, + NULL, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_properties (object_class, N_PROPS, properties); +} + +static void +sysprof_document_mark_init (SysprofDocumentMark *self) +{ +} + +gint64 +sysprof_document_mark_get_duration (SysprofDocumentMark *self) +{ + const SysprofCaptureMark *mark; + + g_return_val_if_fail (SYSPROF_IS_DOCUMENT_MARK (self), 0); + + mark = SYSPROF_DOCUMENT_FRAME_GET (self, SysprofCaptureMark); + + return SYSPROF_DOCUMENT_FRAME_INT64 (self, mark->duration); +} + +const char * +sysprof_document_mark_get_group (SysprofDocumentMark *self) +{ + const SysprofCaptureMark *mark; + + g_return_val_if_fail (SYSPROF_IS_DOCUMENT_MARK (self), 0); + + mark = SYSPROF_DOCUMENT_FRAME_GET (self, SysprofCaptureMark); + + return SYSPROF_DOCUMENT_FRAME_CSTRING (self, mark->group); +} + +const char * +sysprof_document_mark_get_name (SysprofDocumentMark *self) +{ + const SysprofCaptureMark *mark; + + g_return_val_if_fail (SYSPROF_IS_DOCUMENT_MARK (self), 0); + + mark = SYSPROF_DOCUMENT_FRAME_GET (self, SysprofCaptureMark); + + return SYSPROF_DOCUMENT_FRAME_CSTRING (self, mark->name); +} + +const char * +sysprof_document_mark_get_message (SysprofDocumentMark *self) +{ + const SysprofCaptureMark *mark; + + g_return_val_if_fail (SYSPROF_IS_DOCUMENT_MARK (self), 0); + + mark = SYSPROF_DOCUMENT_FRAME_GET (self, SysprofCaptureMark); + + return SYSPROF_DOCUMENT_FRAME_CSTRING (self, mark->message); +} diff --git a/src/libsysprof-analyze/sysprof-document-mark.h b/src/libsysprof-analyze/sysprof-document-mark.h new file mode 100644 index 00000000..a875af30 --- /dev/null +++ b/src/libsysprof-analyze/sysprof-document-mark.h @@ -0,0 +1,47 @@ +/* sysprof-document-mark.h + * + * Copyright 2023 Christian Hergert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#pragma once + +#include "sysprof-document-frame.h" + +G_BEGIN_DECLS + +#define SYSPROF_TYPE_DOCUMENT_MARK (sysprof_document_mark_get_type()) +#define SYSPROF_IS_DOCUMENT_MARK(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, SYSPROF_TYPE_DOCUMENT_MARK) +#define SYSPROF_DOCUMENT_MARK(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, SYSPROF_TYPE_DOCUMENT_MARK, SysprofDocumentMark) +#define SYSPROF_DOCUMENT_MARK_CLASS(klass) G_TYPE_CHECK_CLASS_CAST(klass, SYSPROF_TYPE_DOCUMENT_MARK, SysprofDocumentMarkClass) + +typedef struct _SysprofDocumentMark SysprofDocumentMark; +typedef struct _SysprofDocumentMarkClass SysprofDocumentMarkClass; + +SYSPROF_AVAILABLE_IN_ALL +GType sysprof_document_mark_get_type (void) G_GNUC_CONST; +SYSPROF_AVAILABLE_IN_ALL +gint64 sysprof_document_mark_get_duration (SysprofDocumentMark *self); +SYSPROF_AVAILABLE_IN_ALL +const char *sysprof_document_mark_get_group (SysprofDocumentMark *self); +SYSPROF_AVAILABLE_IN_ALL +const char *sysprof_document_mark_get_name (SysprofDocumentMark *self); +SYSPROF_AVAILABLE_IN_ALL +const char *sysprof_document_mark_get_message (SysprofDocumentMark *self); + +G_END_DECLS +