summaryrefslogtreecommitdiff
path: root/libmatemixer
diff options
context:
space:
mode:
authorAdric Blake <[email protected]>2023-09-01 21:30:19 -0400
committerraveit65 <[email protected]>2023-09-18 12:07:43 +0200
commite9995a70b1ff951cca3471894db2c289d9b0e4f9 (patch)
tree87ff8e92b3d868bf0c1afb696bedf38c4556d5cb /libmatemixer
parent83021fd2d62601a3ea66e8d7bad28856ee3102db (diff)
downloadlibmatemixer-e9995a70b1ff951cca3471894db2c289d9b0e4f9.tar.bz2
libmatemixer-e9995a70b1ff951cca3471894db2c289d9b0e4f9.tar.xz
Remove weak pointers on dispose
A weak pointer has a callback that will happily overwrite freed object memory if the weakly referenced object outlives the object storing the reference. Remove those callbacks when they are no longer needed.
Diffstat (limited to 'libmatemixer')
-rw-r--r--libmatemixer/matemixer-device-switch.c17
-rw-r--r--libmatemixer/matemixer-stream-control.c15
-rw-r--r--libmatemixer/matemixer-stream-switch.c17
-rw-r--r--libmatemixer/matemixer-stream.c4
4 files changed, 53 insertions, 0 deletions
diff --git a/libmatemixer/matemixer-device-switch.c b/libmatemixer/matemixer-device-switch.c
index 51e946e..a8fa18c 100644
--- a/libmatemixer/matemixer-device-switch.c
+++ b/libmatemixer/matemixer-device-switch.c
@@ -53,6 +53,8 @@ static void mate_mixer_device_switch_set_property (GObject *o
const GValue *value,
GParamSpec *pspec);
+static void mate_mixer_device_switch_dispose (GObject *object);
+
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MateMixerDeviceSwitch, mate_mixer_device_switch, MATE_MIXER_TYPE_SWITCH)
static void
@@ -61,6 +63,7 @@ mate_mixer_device_switch_class_init (MateMixerDeviceSwitchClass *klass)
GObjectClass *object_class;
object_class = G_OBJECT_CLASS (klass);
+ object_class->dispose = mate_mixer_device_switch_dispose;
object_class->get_property = mate_mixer_device_switch_get_property;
object_class->set_property = mate_mixer_device_switch_set_property;
@@ -143,6 +146,20 @@ mate_mixer_device_switch_init (MateMixerDeviceSwitch *swtch)
swtch->priv = mate_mixer_device_switch_get_instance_private (swtch);
}
+static void
+mate_mixer_device_switch_dispose (GObject *object)
+{
+ MateMixerDeviceSwitch *swtch;
+
+ swtch = MATE_MIXER_DEVICE_SWITCH (object);
+
+ if (swtch->priv->device != NULL)
+ g_object_remove_weak_pointer(G_OBJECT (swtch->priv->device),
+ (gpointer *) &swtch->priv->device);
+
+ G_OBJECT_CLASS (mate_mixer_device_switch_parent_class)->dispose (object);
+}
+
/**
* mate_mixer_device_switch_get_role:
* @swtch: a #MateMixerDeviceSwitch
diff --git a/libmatemixer/matemixer-stream-control.c b/libmatemixer/matemixer-stream-control.c
index df02df1..fa1829a 100644
--- a/libmatemixer/matemixer-stream-control.c
+++ b/libmatemixer/matemixer-stream-control.c
@@ -75,6 +75,7 @@ static void mate_mixer_stream_control_set_property (GObject
const GValue *value,
GParamSpec *pspec);
+static void mate_mixer_stream_control_dispose (GObject *object);
static void mate_mixer_stream_control_finalize (GObject *object);
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MateMixerStreamControl, mate_mixer_stream_control, G_TYPE_OBJECT)
@@ -85,6 +86,7 @@ mate_mixer_stream_control_class_init (MateMixerStreamControlClass *klass)
GObjectClass *object_class;
object_class = G_OBJECT_CLASS (klass);
+ object_class->dispose = mate_mixer_stream_control_dispose;
object_class->finalize = mate_mixer_stream_control_finalize;
object_class->get_property = mate_mixer_stream_control_get_property;
object_class->set_property = mate_mixer_stream_control_set_property;
@@ -285,6 +287,19 @@ mate_mixer_stream_control_init (MateMixerStreamControl *control)
}
static void
+mate_mixer_stream_control_dispose (GObject *object)
+{
+ MateMixerStreamControl *control;
+
+ control = MATE_MIXER_STREAM_CONTROL (object);
+ if (control->priv->stream != NULL)
+ g_object_remove_weak_pointer(G_OBJECT (control->priv->stream),
+ (gpointer *) &control->priv->stream);
+
+ G_OBJECT_CLASS (mate_mixer_stream_control_parent_class)->dispose (object);
+}
+
+static void
mate_mixer_stream_control_finalize (GObject *object)
{
MateMixerStreamControl *control;
diff --git a/libmatemixer/matemixer-stream-switch.c b/libmatemixer/matemixer-stream-switch.c
index 814918d..cfb74c8 100644
--- a/libmatemixer/matemixer-stream-switch.c
+++ b/libmatemixer/matemixer-stream-switch.c
@@ -55,6 +55,8 @@ static void mate_mixer_stream_switch_set_property (GObject *o
const GValue *value,
GParamSpec *pspec);
+static void mate_mixer_stream_switch_dispose (GObject *object);
+
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MateMixerStreamSwitch, mate_mixer_stream_switch, MATE_MIXER_TYPE_SWITCH)
static void
@@ -63,6 +65,7 @@ mate_mixer_stream_switch_class_init (MateMixerStreamSwitchClass *klass)
GObjectClass *object_class;
object_class = G_OBJECT_CLASS (klass);
+ object_class->dispose = mate_mixer_stream_switch_dispose;
object_class->get_property = mate_mixer_stream_switch_get_property;
object_class->set_property = mate_mixer_stream_switch_set_property;
@@ -161,6 +164,20 @@ mate_mixer_stream_switch_init (MateMixerStreamSwitch *swtch)
swtch->priv = mate_mixer_stream_switch_get_instance_private (swtch);
}
+static void
+mate_mixer_stream_switch_dispose (GObject *object)
+{
+ MateMixerStreamSwitch *swtch;
+
+ swtch = MATE_MIXER_STREAM_SWITCH (object);
+
+ if (swtch->priv->stream != NULL)
+ g_object_remove_weak_pointer(G_OBJECT (swtch->priv->stream),
+ (gpointer *) &swtch->priv->stream);
+
+ G_OBJECT_CLASS (mate_mixer_stream_switch_parent_class)->dispose (object);
+}
+
/**
* mate_mixer_stream_switch_get_flags:
* @swtch: a #MateMixerStreamSwitch
diff --git a/libmatemixer/matemixer-stream.c b/libmatemixer/matemixer-stream.c
index ca7bc81..41da51b 100644
--- a/libmatemixer/matemixer-stream.c
+++ b/libmatemixer/matemixer-stream.c
@@ -281,6 +281,10 @@ mate_mixer_stream_dispose (GObject *object)
stream = MATE_MIXER_STREAM (object);
+ if (stream->priv->device != NULL)
+ g_object_remove_weak_pointer (G_OBJECT (stream->priv->device),
+ (gpointer *) &stream->priv->device);
+
g_clear_object (&stream->priv->control);
G_OBJECT_CLASS (mate_mixer_stream_parent_class)->dispose (object);