diff --git a/include/kpn/pool_node.hpp b/include/kpn/pool_node.hpp index 4fe37f2..1938302 100644 --- a/include/kpn/pool_node.hpp +++ b/include/kpn/pool_node.hpp @@ -400,12 +400,15 @@ private: ch->push_sentinel(std::move(val)); return; } - try { - ch->push(std::move(val)); - } catch (const ChannelOverflowError&) { - throw ChannelOverflowError(ch->capacity(), - "pool node '" + name_ + "' " + output_port_label()); - } + // Backpressure, not loss. A full downstream channel means the consumer + // is behind, and the correct response is for this producer to run + // slower — not to discard a value. A dropped frame does not degrade a + // result, it silently changes one, and the caller has no way to tell. + // + // Safe here because sentinels are handled above, out-of-band: this + // blocks only on data, so the EOF token that unwinds the network can + // always overtake a stalled data path. + ch->push_blocking(std::move(val)); } template @@ -706,12 +709,8 @@ private: ch->push_sentinel(std::move(val)); return; } - try { - ch->push(std::move(val)); - } catch (const ChannelOverflowError&) { - throw ChannelOverflowError(ch->capacity(), - "pool node '" + name_ + "'"); - } + // See the note on the typed overload above: block rather than drop. + ch->push_blocking(std::move(val)); } Obj& obj_;