[sysprof] sysprofd: remove use of GAtomicRCBox



commit d89a689ab4b2feafd6175cf4bf685b173f6f6f7c
Author: Christian Hergert <chergert redhat com>
Date:   Thu Feb 20 11:01:02 2020 -0800

    sysprofd: remove use of GAtomicRCBox
    
    Using an embedded ref count allows us to backport to older operating
    systems for which GLib is restricted to 2.56.

 src/sysprofd/ipc-rapl-profiler.c |  2 +-
 src/sysprofd/sysprof-turbostat.c | 39 ++++++++++++++++++++++++++++-----------
 src/sysprofd/sysprof-turbostat.h |  5 +++--
 3 files changed, 32 insertions(+), 14 deletions(-)
---
diff --git a/src/sysprofd/ipc-rapl-profiler.c b/src/sysprofd/ipc-rapl-profiler.c
index 259016b..9b91847 100644
--- a/src/sysprofd/ipc-rapl-profiler.c
+++ b/src/sysprofd/ipc-rapl-profiler.c
@@ -84,7 +84,7 @@ ipc_rapl_profiler_stop_locked (IpcRaplProfiler *self)
   if (self->turbostat != NULL)
     sysprof_turbostat_stop (self->turbostat);
 
-  g_clear_pointer (&self->turbostat, sysprof_turbostat_free);
+  g_clear_pointer (&self->turbostat, sysprof_turbostat_unref);
   g_clear_pointer (&self->counter_ids, g_array_unref);
 
   if (self->writer != NULL)
diff --git a/src/sysprofd/sysprof-turbostat.c b/src/sysprofd/sysprof-turbostat.c
index 4c6301d..5c80a53 100644
--- a/src/sysprofd/sysprof-turbostat.c
+++ b/src/sysprofd/sysprof-turbostat.c
@@ -32,11 +32,12 @@
 
 struct _SysprofTurbostat
 {
-  GPid        pid;
-  GIOChannel *channel;
-  guint       channel_watch;
-  GFunc       sample_func;
-  gpointer    sample_data;
+  volatile gint ref_count;
+  GPid          pid;
+  GIOChannel   *channel;
+  guint         channel_watch;
+  GFunc         sample_func;
+  gpointer      sample_data;
 };
 
 enum {
@@ -51,7 +52,8 @@ sysprof_turbostat_new (GFunc    sample_func,
 {
   SysprofTurbostat *self;
 
-  self = g_rc_box_new0 (SysprofTurbostat);
+  self = g_slice_new0 (SysprofTurbostat);
+  self->ref_count = 1;
   self->pid = 0;
   self->channel = NULL;
   self->sample_func = sample_func;
@@ -61,21 +63,36 @@ sysprof_turbostat_new (GFunc    sample_func,
 }
 
 static void
-sysprof_turbostat_finalize (gpointer data)
+sysprof_turbostat_finalize (SysprofTurbostat *self)
 {
-  SysprofTurbostat *self = data;
-
   if (self->pid != 0)
     sysprof_turbostat_stop (self);
 
   g_assert (self->pid == 0);
   g_assert (self->channel == NULL);
+
+  g_slice_free (SysprofTurbostat, self);
+}
+
+SysprofTurbostat *
+sysprof_turbostat_ref (SysprofTurbostat *self)
+{
+  g_return_val_if_fail (self != NULL, NULL);
+  g_return_val_if_fail (self->ref_count > 0, NULL);
+
+  g_atomic_int_inc (&self->ref_count);
+
+  return self;
 }
 
 void
-sysprof_turbostat_free (SysprofTurbostat *self)
+sysprof_turbostat_unref (SysprofTurbostat *self)
 {
-  g_rc_box_release_full (self, sysprof_turbostat_finalize);
+  g_return_if_fail (self != NULL);
+  g_return_if_fail (self->ref_count > 1);
+
+  if (g_atomic_int_dec_and_test (&self->ref_count))
+    sysprof_turbostat_finalize (self);
 }
 
 static gboolean
diff --git a/src/sysprofd/sysprof-turbostat.h b/src/sysprofd/sysprof-turbostat.h
index 3b94e75..200e6ad 100644
--- a/src/sysprofd/sysprof-turbostat.h
+++ b/src/sysprofd/sysprof-turbostat.h
@@ -43,8 +43,9 @@ gboolean          sysprof_turbostat_start  (SysprofTurbostat  *self,
 void              sysprof_turbostat_stop   (SysprofTurbostat  *self);
 gboolean          sysprof_turbostat_sample (SysprofTurbostat  *self,
                                             GError           **error);
-void              sysprof_turbostat_free   (SysprofTurbostat  *self);
+SysprofTurbostat *sysprof_turbostat_ref    (SysprofTurbostat  *self);
+void              sysprof_turbostat_unref  (SysprofTurbostat  *self);
 
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (SysprofTurbostat, sysprof_turbostat_free)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (SysprofTurbostat, sysprof_turbostat_unref)
 
 G_END_DECLS


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]