From aed80ea51f1bfb79036e37390f312fab8721185a Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Wed, 15 May 2019 16:38:47 -0700 Subject: [PATCH] libsysprof-capture: add stats to reader when possible We can also back-fill these when reading a capture file. --- .../sysprof-capture-reader.c | 32 +++++++++++++++++++ .../sysprof-capture-reader.h | 6 ++++ .../sysprof-capture-types.h | 13 ++++++++ .../sysprof-capture-writer.c | 6 +++- .../sysprof-capture-writer.h | 13 -------- 5 files changed, 56 insertions(+), 14 deletions(-) diff --git a/src/libsysprof-capture/sysprof-capture-reader.c b/src/libsysprof-capture/sysprof-capture-reader.c index e4dc91fb..a2402763 100644 --- a/src/libsysprof-capture/sysprof-capture-reader.c +++ b/src/libsysprof-capture/sysprof-capture-reader.c @@ -46,6 +46,8 @@ struct _SysprofCaptureReader gint endian; SysprofCaptureFileHeader header; gint64 end_time; + SysprofCaptureStat st_buf; + guint st_buf_set : 1; }; static gboolean @@ -955,3 +957,33 @@ sysprof_capture_reader_copy (SysprofCaptureReader *self) return copy; } + +void +sysprof_capture_reader_set_stat (SysprofCaptureReader *self, + const SysprofCaptureStat *st_buf) +{ + g_return_if_fail (self != NULL); + + if (st_buf != NULL) + { + self->st_buf = *st_buf; + self->st_buf_set = TRUE; + } + else + { + memset (&self->st_buf, 0, sizeof (self->st_buf)); + self->st_buf_set = FALSE; + } +} + +gboolean +sysprof_capture_reader_get_stat (SysprofCaptureReader *self, + SysprofCaptureStat *st_buf) +{ + g_return_val_if_fail (self != NULL, FALSE); + + if (st_buf != NULL) + *st_buf = self->st_buf; + + return self->st_buf_set; +} diff --git a/src/libsysprof-capture/sysprof-capture-reader.h b/src/libsysprof-capture/sysprof-capture-reader.h index 5a03ca67..c0c8392e 100644 --- a/src/libsysprof-capture/sysprof-capture-reader.h +++ b/src/libsysprof-capture/sysprof-capture-reader.h @@ -85,6 +85,12 @@ SYSPROF_AVAILABLE_IN_ALL gboolean sysprof_capture_reader_save_as (SysprofCaptureReader *self, const gchar *filename, GError **error); +SYSPROF_AVAILABLE_IN_ALL +gboolean sysprof_capture_reader_get_stat (SysprofCaptureReader *self, + SysprofCaptureStat *st_buf); +SYSPROF_AVAILABLE_IN_ALL +void sysprof_capture_reader_set_stat (SysprofCaptureReader *self, + const SysprofCaptureStat *st_buf); G_DEFINE_AUTOPTR_CLEANUP_FUNC (SysprofCaptureReader, sysprof_capture_reader_unref) diff --git a/src/libsysprof-capture/sysprof-capture-types.h b/src/libsysprof-capture/sysprof-capture-types.h index bd6a36e2..0608e1c3 100644 --- a/src/libsysprof-capture/sysprof-capture-types.h +++ b/src/libsysprof-capture/sysprof-capture-types.h @@ -58,6 +58,19 @@ typedef struct _SysprofCaptureCondition SysprofCaptureCondition; typedef guint64 SysprofCaptureAddress; +typedef struct +{ + /* + * The number of frames indexed by SysprofCaptureFrameType + */ + gsize frame_count[16]; + + /* + * Padding for future expansion. + */ + gsize padding[48]; +} SysprofCaptureStat; + typedef union { gint64 v64; diff --git a/src/libsysprof-capture/sysprof-capture-writer.c b/src/libsysprof-capture/sysprof-capture-writer.c index fae0fe0d..6939cc80 100644 --- a/src/libsysprof-capture/sysprof-capture-writer.c +++ b/src/libsysprof-capture/sysprof-capture-writer.c @@ -1012,6 +1012,7 @@ SysprofCaptureReader * sysprof_capture_writer_create_reader (SysprofCaptureWriter *self, GError **error) { + SysprofCaptureReader *ret; int copy; g_return_val_if_fail (self != NULL, NULL); @@ -1033,7 +1034,10 @@ sysprof_capture_writer_create_reader (SysprofCaptureWriter *self, if (-1 == (copy = dup (self->fd))) return NULL; - return sysprof_capture_reader_new_from_fd (copy, error); + if ((ret = sysprof_capture_reader_new_from_fd (copy, error))) + sysprof_capture_reader_set_stat (ret, &self->stat); + + return g_steal_pointer (&ret); } /** diff --git a/src/libsysprof-capture/sysprof-capture-writer.h b/src/libsysprof-capture/sysprof-capture-writer.h index 97f775cc..47b3e3ab 100644 --- a/src/libsysprof-capture/sysprof-capture-writer.h +++ b/src/libsysprof-capture/sysprof-capture-writer.h @@ -27,19 +27,6 @@ G_BEGIN_DECLS typedef struct _SysprofCaptureWriter SysprofCaptureWriter; -typedef struct -{ - /* - * The number of frames indexed by SysprofCaptureFrameType - */ - gsize frame_count[16]; - - /* - * Padding for future expansion. - */ - gsize padding[48]; -} SysprofCaptureStat; - SYSPROF_AVAILABLE_IN_ALL SysprofCaptureWriter *sysprof_capture_writer_new_from_env (gsize buffer_size); SYSPROF_AVAILABLE_IN_ALL