libsysprof-capture: add stats to reader when possible

We can also back-fill these when reading a capture file.
This commit is contained in:
Christian Hergert
2019-05-15 16:38:47 -07:00
parent 6437dba247
commit aed80ea51f
5 changed files with 56 additions and 14 deletions

View File

@ -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;
}

View File

@ -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)

View File

@ -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;

View File

@ -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);
}
/**

View File

@ -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