summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libsysprof-ui/sysprof-capture-view.c8
-rw-r--r--src/libsysprof-ui/sysprof-marks-model.c24
2 files changed, 29 insertions, 3 deletions
diff --git a/src/libsysprof-ui/sysprof-capture-view.c b/src/libsysprof-ui/sysprof-capture-view.c
index 2d36e79b..a7462a35 100644
--- a/src/libsysprof-ui/sysprof-capture-view.c
+++ b/src/libsysprof-ui/sysprof-capture-view.c
@@ -40,6 +40,7 @@ typedef struct
gint64 end_time;
guint has_samples : 1;
guint has_counters : 1;
+ guint has_forks : 1;
guint has_marks : 1;
guint can_replay : 1;
} SysprofCaptureFeatures;
@@ -330,6 +331,11 @@ sysprof_capture_view_scan_worker (GTask *task,
features.can_replay = TRUE;
}
}
+ else if (frame.type == SYSPROF_CAPTURE_FRAME_FORK)
+ {
+ features.has_forks = TRUE;
+ sysprof_capture_reader_read_fork (reader);
+ }
else if (frame.type == SYSPROF_CAPTURE_FRAME_MARK)
{
const SysprofCaptureMark *mark;
@@ -465,7 +471,7 @@ sysprof_capture_view_scan_finish (SysprofCaptureView *self,
if (!priv->features.has_samples)
gtk_widget_hide (GTK_WIDGET (priv->callgraph_view));
- if (!priv->features.has_marks)
+ if (!priv->features.has_marks && !priv->features.has_forks)
gtk_widget_hide (GTK_WIDGET (priv->marks_view));
if (!priv->features.has_counters)
diff --git a/src/libsysprof-ui/sysprof-marks-model.c b/src/libsysprof-ui/sysprof-marks-model.c
index abedb5f2..fa5772af 100644
--- a/src/libsysprof-ui/sysprof-marks-model.c
+++ b/src/libsysprof-ui/sysprof-marks-model.c
@@ -311,7 +311,8 @@ cursor_foreach_cb (const SysprofCaptureFrame *frame,
g_assert (SYSPROF_IS_MARKS_MODEL (self));
g_assert (frame->type == SYSPROF_CAPTURE_FRAME_MARK ||
frame->type == SYSPROF_CAPTURE_FRAME_CTRSET ||
- frame->type == SYSPROF_CAPTURE_FRAME_CTRDEF);
+ frame->type == SYSPROF_CAPTURE_FRAME_CTRDEF ||
+ frame->type == SYSPROF_CAPTURE_FRAME_FORK);
if (frame->type == SYSPROF_CAPTURE_FRAME_MARK)
{
@@ -331,6 +332,22 @@ cursor_foreach_cb (const SysprofCaptureFrame *frame,
g_array_append_val (self->items, item);
}
+ else if (frame->type == SYSPROF_CAPTURE_FRAME_FORK)
+ {
+ SysprofCaptureFork *fk = (SysprofCaptureFork *)frame;
+ g_autofree gchar *message = g_strdup_printf ("PID: %d, Child PID: %d", frame->pid, fk->child_pid);
+
+ item.begin_time = frame->time;
+ item.end_time = item.begin_time;
+ item.group = g_string_chunk_insert_const (self->chunks, "fork");
+ item.name = g_string_chunk_insert_const (self->chunks, "Fork");
+ item.message = g_string_chunk_insert_const (self->chunks, message);
+ item.value.v64 = 0;
+ item.is_counter = FALSE;
+ item.counter_type = 0;
+
+ g_array_append_val (self->items, item);
+ }
else if (frame->type == SYSPROF_CAPTURE_FRAME_CTRDEF)
{
SysprofCaptureCounterDefine *ctrdef = (SysprofCaptureCounterDefine *)frame;
@@ -475,7 +492,10 @@ sysprof_marks_model_new_async (SysprofCaptureReader *reader,
}
else if (kind == SYSPROF_MARKS_MODEL_MARKS)
{
- static const SysprofCaptureFrameType types[] = { SYSPROF_CAPTURE_FRAME_MARK };
+ static const SysprofCaptureFrameType types[] = {
+ SYSPROF_CAPTURE_FRAME_MARK,
+ SYSPROF_CAPTURE_FRAME_FORK,
+ };
c = sysprof_capture_condition_new_where_type_in (G_N_ELEMENTS (types), types);
}