summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuho Hämäläinen <jusa@hilvi.org>2016-05-13 17:39:41 +0300
committerArun Raghavan <arun@arunraghavan.net>2016-06-22 12:55:55 +0530
commita5f71d1c5453191d1a529633748cbdf69e16f665 (patch)
treeaea175b9ea88793884ab6415e00bf4a73c239601
parentbe4619e3f7b98a0595418bd7d13b7504ffb5136f (diff)
pulsecore: Don't allow unreferencing linked object.
Sink(-input) and source(-output) called unlink function when reference count dropped to zero. This would result in unlink hooks being called with an object having a reference count of zero, and this is not a situation we want modules to have to deal with. It is better to just remove the redundant unlinking code from sink(-input) and source(-output) and assert on reference count in unlink functions as well. It is expected that in well behaving code the owner of an object will always unlink the object before unreferencing. Signed-off-by: Arun Raghavan <arun@arunraghavan.net>
-rw-r--r--src/pulsecore/sink-input.c6
-rw-r--r--src/pulsecore/sink.c6
-rw-r--r--src/pulsecore/source-output.c7
-rw-r--r--src/pulsecore/source.c6
4 files changed, 9 insertions, 16 deletions
diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index c7d99efbf..a7f6d5512 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -645,7 +645,7 @@ void pa_sink_input_unlink(pa_sink_input *i) {
bool linked;
pa_source_output *o, PA_UNUSED *p = NULL;
- pa_assert(i);
+ pa_sink_input_assert_ref(i);
pa_assert_ctl_context();
/* See pa_sink_unlink() for a couple of comments how this function
@@ -721,9 +721,7 @@ static void sink_input_free(pa_object *o) {
pa_assert(i);
pa_assert_ctl_context();
pa_assert(pa_sink_input_refcnt(i) == 0);
-
- if (PA_SINK_INPUT_IS_LINKED(i->state))
- pa_sink_input_unlink(i);
+ pa_assert(!PA_SINK_INPUT_IS_LINKED(i->state));
pa_log_info("Freeing input %u \"%s\"", i->index,
i->proplist ? pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_MEDIA_NAME)) : "");
diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index 3f1ef725b..9bdf9be08 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -669,7 +669,7 @@ void pa_sink_unlink(pa_sink* s) {
bool linked;
pa_sink_input *i, PA_UNUSED *j = NULL;
- pa_assert(s);
+ pa_sink_assert_ref(s);
pa_assert_ctl_context();
/* Please note that pa_sink_unlink() does more than simply
@@ -722,9 +722,7 @@ static void sink_free(pa_object *o) {
pa_assert(s);
pa_assert_ctl_context();
pa_assert(pa_sink_refcnt(s) == 0);
-
- if (PA_SINK_IS_LINKED(s->state))
- pa_sink_unlink(s);
+ pa_assert(!PA_SINK_IS_LINKED(s->state));
pa_log_info("Freeing sink %u \"%s\"", s->index, s->name);
diff --git a/src/pulsecore/source-output.c b/src/pulsecore/source-output.c
index 6af1543ac..9e951ff61 100644
--- a/src/pulsecore/source-output.c
+++ b/src/pulsecore/source-output.c
@@ -548,7 +548,8 @@ static void source_output_set_state(pa_source_output *o, pa_source_output_state_
/* Called from main context */
void pa_source_output_unlink(pa_source_output*o) {
bool linked;
- pa_assert(o);
+
+ pa_source_output_assert_ref(o);
pa_assert_ctl_context();
/* See pa_sink_unlink() for a couple of comments how this function
@@ -614,9 +615,7 @@ static void source_output_free(pa_object* mo) {
pa_assert(o);
pa_assert_ctl_context();
pa_assert(pa_source_output_refcnt(o) == 0);
-
- if (PA_SOURCE_OUTPUT_IS_LINKED(o->state))
- pa_source_output_unlink(o);
+ pa_assert(!PA_SOURCE_OUTPUT_IS_LINKED(o->state));
pa_log_info("Freeing output %u \"%s\"", o->index,
o->proplist ? pa_strnull(pa_proplist_gets(o->proplist, PA_PROP_MEDIA_NAME)) : "");
diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c
index 98374ae92..8a527d8a9 100644
--- a/src/pulsecore/source.c
+++ b/src/pulsecore/source.c
@@ -612,7 +612,7 @@ void pa_source_unlink(pa_source *s) {
bool linked;
pa_source_output *o, PA_UNUSED *j = NULL;
- pa_assert(s);
+ pa_source_assert_ref(s);
pa_assert_ctl_context();
/* See pa_sink_unlink() for a couple of comments how this function
@@ -661,9 +661,7 @@ static void source_free(pa_object *o) {
pa_assert(s);
pa_assert_ctl_context();
pa_assert(pa_source_refcnt(s) == 0);
-
- if (PA_SOURCE_IS_LINKED(s->state))
- pa_source_unlink(s);
+ pa_assert(!PA_SOURCE_IS_LINKED(s->state));
pa_log_info("Freeing source %u \"%s\"", s->index, s->name);