[pulseaudio-discuss] [PATCH 03/15] node: Set the unlinked flag earlier in pa_node_unlink()

Tanu Kaskinen tanu.kaskinen at linux.intel.com
Thu Feb 13 19:35:48 CET 2014


There's a risk that unlink() gets called recursively, and if that
happens, it's best to exit the function as soon as possible.

I removed the check from pa_node_free(), because it's really pretty
redundant.
---
 src/pulsecore/node.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/pulsecore/node.c b/src/pulsecore/node.c
index 5d1397b..3ef35e3 100644
--- a/src/pulsecore/node.c
+++ b/src/pulsecore/node.c
@@ -158,8 +158,7 @@ fail:
 void pa_node_free(pa_node *node) {
     pa_assert(node);
 
-    if (!node->unlinked)
-        pa_node_unlink(node);
+    pa_node_unlink(node);
 
     pa_xfree(node->description);
 
@@ -406,8 +405,12 @@ int pa_node_put(pa_node *node, pa_node **requested_connections, unsigned n_reque
 void pa_node_unlink(pa_node *node) {
     pa_assert(node);
 
-    if (node->unlinked)
+    if (node->unlinked) {
+        pa_log_debug("Unlinking node %s (already unlinked, this is a no-op).", node->name);
         return;
+    }
+
+    node->unlinked = true;
 
     pa_log_debug("Unlinking node %s.", node->name);
 
@@ -416,7 +419,6 @@ void pa_node_unlink(pa_node *node) {
 
     pa_assert_se(pa_idxset_remove_by_index(node->core->nodes, node->index));
 
-    node->unlinked = true;
 }
 
 void pa_node_active_changed(pa_node *node, bool new_active) {
-- 
1.8.3.1



More information about the pulseaudio-discuss mailing list