From f1a5e2b2e205cd397f4a4860bd691a19c88b7187 Mon Sep 17 00:00:00 2001 From: Joey Yakimowich-Payne Date: Fri, 30 Jan 2026 14:01:15 -0700 Subject: [PATCH] Fix boot rule link --- src/warppipe.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/warppipe.cpp b/src/warppipe.cpp index 9a97e9d..2e74367 100644 --- a/src/warppipe.cpp +++ b/src/warppipe.cpp @@ -345,6 +345,7 @@ struct Client::Impl { uint32_t policy_sync_seq = 0; bool policy_sync_pending = false; std::vector> auto_link_proxies; + std::vector> auto_link_claimed_pairs; std::vector> saved_link_proxies; pw_proxy* metadata_proxy = nullptr; @@ -557,6 +558,8 @@ void Client::Impl::CoreDone(void* data, uint32_t, int seq) { if (impl->policy_sync_pending && seq >= static_cast(impl->policy_sync_seq)) { impl->policy_sync_pending = false; + fprintf(stderr, "[WP] CoreDone policy sync seq=%d, pending_auto=%zu saved=%zu\n", + seq, impl->pending_auto_links.size(), impl->saved_links.size()); impl->ProcessPendingAutoLinks(); impl->ProcessSavedLinks(); } @@ -598,6 +601,7 @@ void Client::Impl::ClearCache() { ports.clear(); links.clear(); pending_auto_links.clear(); + auto_link_claimed_pairs.clear(); policy_sync_pending = false; } @@ -946,6 +950,8 @@ void Client::Impl::ProcessPendingAutoLinks() { } } if (target_node_id == 0) { + fprintf(stderr, "[WP] AutoLink: target '%s' not found for src node %u\n", + it->target_node_name.c_str(), it->source_node_id); ++it; continue; } @@ -968,6 +974,9 @@ void Client::Impl::ProcessPendingAutoLinks() { } if (src_ports.empty() || tgt_ports.empty()) { + fprintf(stderr, "[WP] AutoLink: src_ports=%zu tgt_ports=%zu for src=%u target=%u('%s')\n", + src_ports.size(), tgt_ports.size(), it->source_node_id, + target_node_id, it->target_node_name.c_str()); ++it; continue; } @@ -988,8 +997,14 @@ void Client::Impl::ProcessPendingAutoLinks() { break; } } + auto_link_claimed_pairs.emplace_back(src_ports[i].id, tgt_ports[i].id); if (!exists) { links_to_create.push_back({src_ports[i].id, tgt_ports[i].id}); + fprintf(stderr, "[WP] AutoLink: will create %u->%u\n", + src_ports[i].id, tgt_ports[i].id); + } else { + fprintf(stderr, "[WP] AutoLink: already exists %u->%u (claimed)\n", + src_ports[i].id, tgt_ports[i].id); } } @@ -1060,6 +1075,9 @@ void Client::Impl::ProcessSavedLinks() { if (covered_by_rule) break; } if (covered_by_rule) { + fprintf(stderr, "[WP] SavedLink: covered_by_rule, skipping %s:%s -> %s:%s\n", + it->out_node.c_str(), it->out_port.c_str(), + it->in_node.c_str(), it->in_port.c_str()); it = saved_links.erase(it); continue; } @@ -1091,6 +1109,9 @@ void Client::Impl::ProcessSavedLinks() { } } if (exists) { + fprintf(stderr, "[WP] SavedLink: already exists %s:%s -> %s:%s\n", + it->out_node.c_str(), it->out_port.c_str(), + it->in_node.c_str(), it->in_port.c_str()); it = saved_links.erase(it); continue; } @@ -1101,6 +1122,7 @@ void Client::Impl::ProcessSavedLinks() { } } + fprintf(stderr, "[WP] SavedLink: %zu links to create\n", to_create.size()); if (to_create.empty()) return; std::unordered_map> saved_port_map; @@ -1132,6 +1154,14 @@ void Client::Impl::ProcessSavedLinks() { proxy->input_port == in_port) { is_ours = true; break; } } } + if (!is_ours) { + uint32_t out_port = link_entry.second.output_port.value; + for (const auto& pair : auto_link_claimed_pairs) { + if (pair.first == out_port && pair.second == in_port) { + is_ours = true; break; + } + } + } if (!is_ours) { uint32_t out_port = link_entry.second.output_port.value; for (const auto& proxy : saved_link_proxies) { @@ -1140,7 +1170,12 @@ void Client::Impl::ProcessSavedLinks() { } } if (!is_ours) { + fprintf(stderr, "[WP] Competing: link %u (%u->%u) has no owner, will destroy\n", + link_id, link_entry.second.output_port.value, in_port); competing_link_ids.push_back(link_id); + } else { + fprintf(stderr, "[WP] Competing: link %u (%u->%u) is ours, keeping\n", + link_id, link_entry.second.output_port.value, in_port); } } } @@ -2084,6 +2119,7 @@ Status Client::RemoveRouteRule(RuleId id) { ++pending_it; } } + impl_->auto_link_claimed_pairs.clear(); } impl_->AutoSave(); @@ -2373,6 +2409,9 @@ Status Client::LoadConfig(std::string_view path) { in_node.empty() || in_port.empty()) { continue; } + fprintf(stderr, "[WP] Config: loaded saved link %s:%s -> %s:%s\n", + out_node.c_str(), out_port.c_str(), + in_node.c_str(), in_port.c_str()); impl_->saved_links.push_back({out_node, out_port, in_node, in_port}); } catch (...) { continue;