diff --git a/src/libsysprof-ui/pointcache.c b/src/libsysprof-ui/pointcache.c index 8072ac14..c16304ff 100644 --- a/src/libsysprof-ui/pointcache.c +++ b/src/libsysprof-ui/pointcache.c @@ -24,25 +24,36 @@ struct _PointCache { - GHashTable *sets; + volatile gint ref_count; + GHashTable *sets; }; static void -point_cache_clear (PointCache *self) +point_cache_finalize (PointCache *self) { g_clear_pointer (&self->sets, g_hash_table_unref); + g_slice_free (PointCache, self); } PointCache * point_cache_ref (PointCache *self) { - return g_atomic_rc_box_acquire (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 point_cache_unref (PointCache *self) { - g_atomic_rc_box_release_full (self, (GDestroyNotify) point_cache_clear); + g_return_if_fail (self != NULL); + g_return_if_fail (self->ref_count > 0); + + if (g_atomic_int_dec_and_test (&self->ref_count)) + point_cache_finalize (self); } PointCache * @@ -50,7 +61,8 @@ point_cache_new (void) { PointCache *self; - self = g_atomic_rc_box_new0 (PointCache); + self = g_slice_new0 (PointCache); + self->ref_count = 1; self->sets = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_array_unref); return self; diff --git a/src/libsysprof-ui/sysprof-depth-visualizer.c b/src/libsysprof-ui/sysprof-depth-visualizer.c index 39ebf37d..118489d7 100644 --- a/src/libsysprof-ui/sysprof-depth-visualizer.c +++ b/src/libsysprof-ui/sysprof-depth-visualizer.c @@ -55,16 +55,11 @@ static void sysprof_depth_visualizer_reload (SysprofDepthVisualizer *self); G_DEFINE_TYPE (SysprofDepthVisualizer, sysprof_depth_visualizer, SYSPROF_TYPE_VISUALIZER) static void -state_clear (State *st) +state_free (State *st) { g_clear_pointer (&st->reader, sysprof_capture_reader_unref); g_clear_pointer (&st->pc, point_cache_unref); -} - -static void -state_unref (State *st) -{ - g_atomic_rc_box_release_full (st, (GDestroyNotify) state_clear); + g_slice_free (State, st); } static gboolean @@ -201,7 +196,7 @@ sysprof_depth_visualizer_reload (SysprofDepthVisualizer *self) gtk_widget_get_allocation (GTK_WIDGET (self), &alloc); - st = g_atomic_rc_box_new0 (State); + st = g_slice_new0 (State); st->reader = sysprof_capture_reader_ref (self->reader); st->pc = point_cache_new (); st->max_n_addrs = 0; @@ -215,7 +210,7 @@ sysprof_depth_visualizer_reload (SysprofDepthVisualizer *self) task = g_task_new (self, NULL, apply_point_cache_cb, NULL); g_task_set_source_tag (task, sysprof_depth_visualizer_reload); - g_task_set_task_data (task, st, (GDestroyNotify) state_unref); + g_task_set_task_data (task, st, (GDestroyNotify) state_free); g_task_run_in_thread (task, sysprof_depth_visualizer_worker); }