diff --git a/Sources/ComputeCxx/Subgraph/IAGSubgraph.cpp b/Sources/ComputeCxx/Subgraph/IAGSubgraph.cpp index da54c36..ad57db3 100644 --- a/Sources/ComputeCxx/Subgraph/IAGSubgraph.cpp +++ b/Sources/ComputeCxx/Subgraph/IAGSubgraph.cpp @@ -157,7 +157,7 @@ IAGUniqueID IAGSubgraphAddObserver(IAGSubgraphRef subgraph, void IAGSubgraphRemoveObserver(IAGSubgraphRef subgraph, IAGUniqueID observer_id) { if (IAG::Subgraph::from_cf(subgraph) == nullptr) { - IAG::precondition_failure("accessing invalidated subgraph"); + return; } IAG::Subgraph::from_cf(subgraph)->remove_observer(observer_id); diff --git a/Tests/ComputeTests/Shared/Subgraph/SubgraphTests.swift b/Tests/ComputeTests/Shared/Subgraph/SubgraphTests.swift index 6ddcd8d..5d4b3bc 100644 --- a/Tests/ComputeTests/Shared/Subgraph/SubgraphTests.swift +++ b/Tests/ComputeTests/Shared/Subgraph/SubgraphTests.swift @@ -80,6 +80,39 @@ struct SubgraphTests { #expect(notifiedCount == 0) } + + @Test + func removeObserverAfterInvalidation() { + let graph = Graph() + let subgraph = Subgraph(graph: graph) + var notifiedCount = 0 + let observerID = subgraph.addObserver { + notifiedCount += 1 + } + + subgraph.invalidate() + subgraph.removeObserver(observerID) + + #expect(subgraph.isValid == false) + #expect(notifiedCount == 1) + } + + @Test + func removeObserverDuringInvalidation() { + let graph = Graph() + let subgraph = Subgraph(graph: graph) + var notifiedCount = 0 + var observerID = 0 + observerID = subgraph.addObserver { + notifiedCount += 1 + subgraph.removeObserver(observerID) + } + + subgraph.invalidate() + + #expect(subgraph.isValid == false) + #expect(notifiedCount == 1) + } } @Suite