Skip to content

Commit

Permalink
Remove weak pointers on dispose
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
ProMarbler14 authored and raveit65 committed Sep 18, 2023
1 parent 83021fd commit e9995a7
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 0 deletions.
17 changes: 17 additions & 0 deletions libmatemixer/matemixer-device-switch.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;

Expand Down Expand Up @@ -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
Expand Down
15 changes: 15 additions & 0 deletions libmatemixer/matemixer-stream-control.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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;
Expand Down Expand Up @@ -284,6 +286,19 @@ mate_mixer_stream_control_init (MateMixerStreamControl *control)
control->priv = mate_mixer_stream_control_get_instance_private (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)
{
Expand Down
17 changes: 17 additions & 0 deletions libmatemixer/matemixer-stream-switch.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;

Expand Down Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions libmatemixer/matemixer-stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit e9995a7

Please sign in to comment.