From a6ca0eb2d74c9a070c5894e95f203e894400020a Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Sun, 4 Jun 2023 00:02:58 -0700 Subject: [PATCH] libsysprof-profile: setup mmap for perf mapping --- .../sysprof-perf-event-stream.c | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/libsysprof-profile/sysprof-perf-event-stream.c b/src/libsysprof-profile/sysprof-perf-event-stream.c index 4c5ee0b8..26025959 100644 --- a/src/libsysprof-profile/sysprof-perf-event-stream.c +++ b/src/libsysprof-profile/sysprof-perf-event-stream.c @@ -347,7 +347,31 @@ sysprof_perf_event_stream_new_cb (GObject *object, g_variant_get (ret, "(h)", &handle); if (-1 != (fd = g_unix_fd_list_get (fd_list, handle, &error))) - self->perf_fd = fd; + { + gsize map_size; + guint8 *map; + + self->perf_fd = fd; + self->perf_fd_tag = g_source_add_unix_fd (self->source, fd, G_IO_ERR); + + map_size = N_PAGES * sysprof_getpagesize () + sysprof_getpagesize (); + map = mmap (NULL, map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + + if ((gpointer)map == MAP_FAILED) + { + int errsv = errno; + g_set_error_literal (&error, + G_IO_ERROR, + g_io_error_from_errno (errsv), + g_strerror (errsv)); + } + else + { + self->map = (gpointer)map; + self->map_data = map + sysprof_getpagesize (); + self->tail = 0; + } + } } if (error != NULL) @@ -447,6 +471,8 @@ sysprof_perf_event_stream_enable (SysprofPerfEventStream *self, self->active = TRUE; + g_source_modify_unix_fd (self->source, self->perf_fd_tag, G_IO_IN); + g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ACTIVE]); return TRUE; @@ -473,6 +499,8 @@ sysprof_perf_event_stream_disable (SysprofPerfEventStream *self, self->active = FALSE; + g_source_modify_unix_fd (self->source, self->perf_fd_tag, G_IO_ERR); + g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ACTIVE]); return TRUE;