From ce40b83bb660a416adfafb38b60f5bbb8f21dbb4 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Mon, 1 Jun 2026 23:33:25 +0200 Subject: [PATCH] Establish DataSink identity and fix remaining tests The test suite is now **green** again. The design rework and clean-up of unnecessary test-driven functionality in the `DiagnosticBufferProvider` and `DiagnosticOutputSlot` required to break some very old test-setup, using fake instances of the relevant context facilities. This setup however was used by the newer family of test support facilities, notable the `MockJob`, `MockSegmentation` and `MockDispatcher`. These required a set of `DataSink` handles to be present (even while they are not used currently). This could be fixed easily now, relying on the simplified internal structure of the `OutputSlot`: by re-arranging the types, the implied identity of the `DataSink` handles could be made explicit, allowing for equality comparison. __Remark__: even while `DataSink` with only a single abstracted function, using function notation turned out to be rather confusing at usage site. Naming this function as `lockFrame(frameNo)` clarifies its purpose nicely. That call is effectively abstracted by means of the ''buffer type'', relying on the VTable in the `BufferProvider` implementation. --- doc/devel/uml/OutputSlot_components.svg | 6227 +++++++++-------- doc/devel/uml/OutputSlot_sequence.svg | 928 +-- src/steam/engine/calc-stream.hpp | 2 +- src/steam/engine/dispatcher.hpp | 3 +- src/steam/engine/engine-service.cpp | 9 +- src/steam/engine/engine-service.hpp | 2 +- src/steam/engine/job-planning.hpp | 3 +- src/vault/mem/buffer-provider-setup.hpp | 13 +- src/vault/mem/buffhandle.hpp | 1 + src/vault/mem/engine-buffer-metadata.hpp | 3 - src/vault/out/output-slot-connection.hpp | 14 +- src/vault/out/output-slot.hpp | 90 +- tests/steam/engine/mock-dispatcher.hpp | 5 +- tests/steam/engine/mock-support-test.cpp | 11 - tests/steam/play/dummy-builder-context.hpp | 3 +- tests/steam/play/dummy-play-connection.hpp | 5 +- tests/vault/gear/test-chain-load-test.cpp | 2 +- tests/vault/out/output-alloc-state-test.cpp | 2 +- tests/vault/out/output-slot-protocol-test.cpp | 8 +- wiki/renderengine.html | 15 +- wiki/thinkPad.ichthyo.mm | 376 +- 21 files changed, 4235 insertions(+), 3487 deletions(-) diff --git a/doc/devel/uml/OutputSlot_components.svg b/doc/devel/uml/OutputSlot_components.svg index 98dca4bee..91077e005 100644 --- a/doc/devel/uml/OutputSlot_components.svg +++ b/doc/devel/uml/OutputSlot_components.svg @@ -11,27 +11,20 @@ xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> OutputSlot components + id="titz">OutputSlot components Generated with Qt + id="defz" /> + id="UML"> + id="g1" + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g2" + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g3" + style="fill-rule:evenodd" /> + id="g4" + style="fill-rule:evenodd"> + id="g5" + style="fill-rule:evenodd" /> + id="g6" + style="fill-rule:evenodd" /> + id="g7" + style="fill-rule:evenodd"> + id="g8" + style="fill-rule:evenodd" /> + id="g9" + style="fill-rule:evenodd" /> + id="g10" + style="fill-rule:evenodd" /> + id="g11" + style="fill-rule:evenodd" /> + id="g12" + style="fill-rule:evenodd"> + id="g13" + style="fill-rule:evenodd" /> + id="g14" + style="fill-rule:evenodd" /> + id="g15" + style="fill-rule:evenodd"> + id="g16" + style="fill-rule:evenodd" /> + id="g17" + style="fill-rule:evenodd" /> + id="g18" + style="fill-rule:evenodd" /> + id="g19" + style="fill-rule:evenodd" /> + id="g20" + style="fill-rule:evenodd"> + id="g21" + style="fill-rule:evenodd" /> + id="g22" + style="fill-rule:evenodd" /> + id="g23" + style="fill-rule:evenodd"> + id="g24" + style="fill-rule:evenodd" /> + id="g25" + style="fill-rule:evenodd" /> + id="g26" + style="fill-rule:evenodd" /> + id="g27" + style="fill-rule:evenodd" /> + id="g28" + style="fill-rule:evenodd"> + id="g29" + style="fill-rule:evenodd" /> + id="g30" + style="fill-rule:evenodd" /> + id="g31" + style="fill-rule:evenodd"> + id="g32" + style="fill-rule:evenodd" /> + id="g33" + style="fill-rule:evenodd" /> + id="g34" + style="fill-rule:evenodd" /> + id="g35" + style="fill-rule:evenodd" /> + id="g36" + style="fill-rule:evenodd"> + id="g37" + style="fill-rule:evenodd" /> + id="g38" + style="fill-rule:evenodd" /> + id="g39" + style="fill-rule:evenodd"> + id="g40" + style="fill-rule:evenodd" /> + id="g41" + style="fill-rule:evenodd" /> + id="g42" + style="fill-rule:evenodd" /> + id="g43" + style="fill-rule:evenodd"> create + id="g44" + style="fill-rule:evenodd" /> + id="g45" + style="fill-rule:evenodd" /> + id="g46" + style="fill-rule:evenodd" /> + id="g47" + style="fill-rule:evenodd" /> + id="g48" + style="fill-rule:evenodd"> + id="g49" + style="fill-rule:evenodd" /> + id="g50" + style="fill-rule:evenodd" /> + id="g51" + style="fill-rule:evenodd"> + id="g52" + style="fill-rule:evenodd" /> + id="g53" + style="fill-rule:evenodd" /> + id="g54" + style="fill-rule:evenodd" /> + id="g55" + style="fill-rule:evenodd" /> + id="g56" + style="fill-rule:evenodd"> + id="g57" + style="fill-rule:evenodd" /> + id="g58" + style="fill-rule:evenodd" /> + id="g59" + style="fill-rule:evenodd"> + id="g60" + style="fill-rule:evenodd" /> + id="g61" + style="fill-rule:evenodd" /> + id="g62" + style="fill-rule:evenodd" /> + id="g63" + style="fill-rule:evenodd"> + id="g64" + style="fill-rule:evenodd" /> + id="g65" + style="fill-rule:evenodd" /> + id="g66" + style="fill-rule:evenodd" /> + id="g67" + style="fill-rule:evenodd" /> + id="g68" + style="fill-rule:evenodd"> + id="g69" + style="fill-rule:evenodd" /> + id="g70" + style="fill-rule:evenodd" /> + id="g71" + style="fill-rule:evenodd"> + id="g72" + style="fill-rule:evenodd" /> + id="g73" + style="fill-rule:evenodd" /> + id="g74" + style="fill-rule:evenodd" /> + id="g75" + style="fill-rule:evenodd" /> + id="g76" + style="fill-rule:evenodd"> + id="g77" + style="fill-rule:evenodd" /> + id="g78" + style="fill-rule:evenodd" /> + id="g79" + style="fill-rule:evenodd"> + id="g80" + style="fill-rule:evenodd" /> + id="g81" + style="fill-rule:evenodd" /> + id="g82" + style="fill-rule:evenodd" /> + id="g83" + style="fill-rule:evenodd" /> + id="g84" + style="fill-rule:evenodd"> + id="g85" + style="fill-rule:evenodd" /> + id="g86" + style="fill-rule:evenodd" /> + id="g87" + style="fill-rule:evenodd"> + id="g88" + style="fill-rule:evenodd" /> + id="g89" + style="fill-rule:evenodd" /> + id="g90" + style="fill-rule:evenodd" /> + id="g91" + style="fill-rule:evenodd"> 1 + id="g92" + style="fill-rule:evenodd" /> + id="g93" + style="fill-rule:evenodd" /> + id="g94" + style="fill-rule:evenodd" /> + id="g95" + style="fill-rule:evenodd"> «active» + id="g96" + style="fill-rule:evenodd" /> + id="g97" + style="fill-rule:evenodd" /> + id="g98" + style="fill-rule:evenodd" /> + id="g99" + style="fill-rule:evenodd" /> + id="g100" + style="fill-rule:evenodd"> + id="g101" + style="fill-rule:evenodd" /> + id="g102" + style="fill-rule:evenodd" /> + id="g103" + style="fill-rule:evenodd"> + id="g104" + style="fill-rule:evenodd" /> + id="g105" + style="fill-rule:evenodd" /> + id="g106" + style="fill-rule:evenodd" /> + id="g107" + style="fill-rule:evenodd" /> + id="g108" + style="fill-rule:evenodd"> + id="g109" + style="fill-rule:evenodd" /> + id="g110" + style="fill-rule:evenodd" /> + id="g111" + style="fill-rule:evenodd"> + id="g112" + style="fill-rule:evenodd" /> + id="g113" + style="fill-rule:evenodd" /> + id="g114" + style="fill-rule:evenodd" /> + id="g115" + style="fill-rule:evenodd" /> + id="g116" + style="fill-rule:evenodd"> + id="g117" + style="fill-rule:evenodd" /> + id="g118" + style="fill-rule:evenodd" /> + id="g119" + style="fill-rule:evenodd"> + id="g120" + style="fill-rule:evenodd" /> + id="g121" + style="fill-rule:evenodd" /> + id="g122" + style="fill-rule:evenodd" /> + id="g123" + style="fill-rule:evenodd" /> + id="g124" + style="fill-rule:evenodd"> + id="g125" + style="fill-rule:evenodd" /> + id="g126" + style="fill-rule:evenodd" /> + id="g127" + style="fill-rule:evenodd"> + id="g128" + style="fill-rule:evenodd" /> + id="g129" + style="fill-rule:evenodd" /> + id="g130" + style="fill-rule:evenodd" /> + id="g131" + style="fill-rule:evenodd" /> + id="g132" + style="fill-rule:evenodd"> + id="g133" + style="fill-rule:evenodd" /> + id="g134" + style="fill-rule:evenodd" /> + id="g135" + style="fill-rule:evenodd" /> + id="g136" + style="fill-rule:evenodd" /> + id="g137" + style="fill-rule:evenodd"> + id="g138" + style="fill-rule:evenodd" /> + id="g139" + style="fill-rule:evenodd" /> + id="g140" + style="fill-rule:evenodd"> + id="g141" + style="fill-rule:evenodd" /> + id="g142" + style="fill-rule:evenodd" /> + id="g143" + style="fill-rule:evenodd" /> + id="g144" + style="fill-rule:evenodd"> + id="g145" + style="fill-rule:evenodd" /> + id="g146" + style="fill-rule:evenodd" /> + id="g147" + style="fill-rule:evenodd"> + id="g148" + style="fill-rule:evenodd" /> + id="g149" + style="fill-rule:evenodd" /> + id="g150" + style="fill-rule:evenodd"> + id="g151" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g153" + style="fill-rule:evenodd" /> + id="g154" + style="fill-rule:evenodd"> + id="g155" + style="fill-rule:evenodd"> + id="g156" + style="fill-rule:evenodd" /> + id="g157" + style="fill-rule:evenodd" /> + id="g158" + style="fill-rule:evenodd" /> + id="g159" + style="fill-rule:evenodd"> getDescriptor() @@ -2427,127 +2581,136 @@ + id="g160" + style="fill-rule:evenodd" /> + id="g161" + style="fill-rule:evenodd" /> + id="g162" + style="fill-rule:evenodd" /> + id="g163" + style="fill-rule:evenodd" /> + id="g164" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g166" + style="fill-rule:evenodd" /> + id="g167" + style="fill-rule:evenodd" /> + id="g168" + style="fill-rule:evenodd"> + id="g169" + style="fill-rule:evenodd" /> + id="g170" + style="fill-rule:evenodd" /> + id="g171" + style="fill-rule:evenodd"> BufferProvider @@ -2614,59 +2780,63 @@ + id="g172" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g174" + style="fill-rule:evenodd" /> + id="g175" + style="fill-rule:evenodd"> + id="g176" + style="fill-rule:evenodd"> + id="g177" + style="fill-rule:evenodd" /> + id="g178" + style="fill-rule:evenodd" /> + id="g179" + style="fill-rule:evenodd" /> + id="g180" + style="fill-rule:evenodd"> getDescriptor() @@ -2765,96 +2940,102 @@ + id="g181" + style="fill-rule:evenodd" /> + id="g182" + style="fill-rule:evenodd" /> + id="g183" + style="fill-rule:evenodd" /> + id="g184" + style="fill-rule:evenodd" /> + id="g185" + style="fill-rule:evenodd" /> + id="g186" + style="fill-rule:evenodd"> lockBuffer() @@ -2862,113 +3043,121 @@ + id="g187" + style="fill-rule:evenodd" /> + id="g188" + style="fill-rule:evenodd" /> + id="g189" + style="fill-rule:evenodd" /> + id="g190" + style="fill-rule:evenodd" /> + id="g191" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g193" + style="fill-rule:evenodd" /> + id="g194" + style="fill-rule:evenodd" /> + id="g195" + style="fill-rule:evenodd"> + id="g196" + style="fill-rule:evenodd" /> + id="g197" + style="fill-rule:evenodd" /> + id="g198" + style="fill-rule:evenodd"> OutputManager @@ -3049,45 +3242,48 @@ + id="g199" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g201" + style="fill-rule:evenodd" /> + id="g202" + style="fill-rule:evenodd"> + id="g203" + style="fill-rule:evenodd"> + id="g204" + style="fill-rule:evenodd" /> + id="g205" + style="fill-rule:evenodd" /> + id="g206" + style="fill-rule:evenodd" /> + id="g207" + style="fill-rule:evenodd"> openOutput() @@ -3200,113 +3402,121 @@ + id="g208" + style="fill-rule:evenodd" /> + id="g209" + style="fill-rule:evenodd" /> + id="g210" + style="fill-rule:evenodd" /> + id="g211" + style="fill-rule:evenodd" /> + id="g212" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g214" + style="fill-rule:evenodd" /> + id="g215" + style="fill-rule:evenodd" /> + id="g216" + style="fill-rule:evenodd"> + id="g217" + style="fill-rule:evenodd" /> + id="g218" + style="fill-rule:evenodd" /> + id="g219" + style="fill-rule:evenodd"> + id="g220" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g222" + style="fill-rule:evenodd" /> + id="g223" + style="fill-rule:evenodd"> + id="g224" + style="fill-rule:evenodd"> + id="g225" + style="fill-rule:evenodd" /> + id="g226" + style="fill-rule:evenodd" /> + id="g227" + style="fill-rule:evenodd" /> + id="g228" + style="fill-rule:evenodd"> claimBufferFor() @@ -3538,96 +3761,102 @@ + id="g229" + style="fill-rule:evenodd" /> + id="g230" + style="fill-rule:evenodd" /> + id="g231" + style="fill-rule:evenodd" /> + id="g232" + style="fill-rule:evenodd" /> + id="g233" + style="fill-rule:evenodd" /> + id="g234" + style="fill-rule:evenodd"> publish() @@ -3635,96 +3864,102 @@ + id="g235" + style="fill-rule:evenodd" /> + id="g236" + style="fill-rule:evenodd" /> + id="g237" + style="fill-rule:evenodd" /> + id="g238" + style="fill-rule:evenodd" /> + id="g239" + style="fill-rule:evenodd" /> + id="g240" + style="fill-rule:evenodd"> release() @@ -3732,127 +3967,136 @@ + id="g241" + style="fill-rule:evenodd" /> + id="g242" + style="fill-rule:evenodd" /> + id="g243" + style="fill-rule:evenodd" /> + id="g244" + style="fill-rule:evenodd" /> + id="g245" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g247" + style="fill-rule:evenodd" /> + id="g248" + style="fill-rule:evenodd" /> + id="g249" + style="fill-rule:evenodd"> + id="g250" + style="fill-rule:evenodd" /> + id="g251" + style="fill-rule:evenodd" /> + id="g252" + style="fill-rule:evenodd"> BuffHandle @@ -3919,59 +4166,63 @@ + id="g253" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g255" + style="fill-rule:evenodd" /> + id="g256" + style="fill-rule:evenodd"> + id="g257" + style="fill-rule:evenodd"> + id="g258" + style="fill-rule:evenodd" /> + id="g259" + style="fill-rule:evenodd" /> + id="g260" + style="fill-rule:evenodd" /> + id="g261" + style="fill-rule:evenodd"> emit() @@ -4070,96 +4326,102 @@ + id="g262" + style="fill-rule:evenodd" /> + id="g263" + style="fill-rule:evenodd" /> + id="g264" + style="fill-rule:evenodd" /> + id="g265" + style="fill-rule:evenodd" /> + id="g266" + style="fill-rule:evenodd" /> + id="g267" + style="fill-rule:evenodd"> release() @@ -4167,127 +4429,136 @@ + id="g268" + style="fill-rule:evenodd" /> + id="g269" + style="fill-rule:evenodd" /> + id="g270" + style="fill-rule:evenodd" /> + id="g271" + style="fill-rule:evenodd" /> + id="g272" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g274" + style="fill-rule:evenodd" /> + id="g275" + style="fill-rule:evenodd" /> + id="g276" + style="fill-rule:evenodd"> + id="g277" + style="fill-rule:evenodd" /> + id="g278" + style="fill-rule:evenodd" /> + id="g279" + style="fill-rule:evenodd"> Connection @@ -4354,59 +4628,63 @@ + id="g280" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g282" + style="fill-rule:evenodd" /> + id="g283" + style="fill-rule:evenodd"> + id="g284" + style="fill-rule:evenodd"> + id="g285" + style="fill-rule:evenodd" /> + id="g286" + style="fill-rule:evenodd" /> + id="g287" + style="fill-rule:evenodd" /> + id="g288" + style="fill-rule:evenodd"> getBufferSize() @@ -4505,96 +4788,102 @@ + id="g289" + style="fill-rule:evenodd" /> + id="g290" + style="fill-rule:evenodd" /> + id="g291" + style="fill-rule:evenodd" /> + id="g292" + style="fill-rule:evenodd" /> + id="g293" + style="fill-rule:evenodd" /> + id="g294" + style="fill-rule:evenodd"> claimBufferFor() @@ -4602,96 +4891,102 @@ + id="g295" + style="fill-rule:evenodd" /> + id="g296" + style="fill-rule:evenodd" /> + id="g297" + style="fill-rule:evenodd" /> + id="g298" + style="fill-rule:evenodd" /> + id="g299" + style="fill-rule:evenodd" /> + id="g300" + style="fill-rule:evenodd"> publish() @@ -4699,96 +4994,102 @@ + id="g301" + style="fill-rule:evenodd" /> + id="g302" + style="fill-rule:evenodd" /> + id="g303" + style="fill-rule:evenodd" /> + id="g304" + style="fill-rule:evenodd" /> + id="g305" + style="fill-rule:evenodd" /> + id="g306" + style="fill-rule:evenodd"> release() @@ -4796,96 +5097,102 @@ + id="g307" + style="fill-rule:evenodd" /> + id="g308" + style="fill-rule:evenodd" /> + id="g309" + style="fill-rule:evenodd" /> + id="g310" + style="fill-rule:evenodd" /> + id="g311" + style="fill-rule:evenodd" /> + id="g312" + style="fill-rule:evenodd"> shutDown() @@ -4893,127 +5200,136 @@ + id="g313" + style="fill-rule:evenodd" /> + id="g314" + style="fill-rule:evenodd" /> + id="g315" + style="fill-rule:evenodd" /> + id="g316" + style="fill-rule:evenodd" /> + id="g317" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g319" + style="fill-rule:evenodd" /> + id="g320" + style="fill-rule:evenodd" /> + id="g321" + style="fill-rule:evenodd"> + id="g322" + style="fill-rule:evenodd" /> + id="g323" + style="fill-rule:evenodd" /> + id="g324" + style="fill-rule:evenodd"> OutputSlot @@ -5080,59 +5399,63 @@ + id="g325" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g327" + style="fill-rule:evenodd" /> + id="g328" + style="fill-rule:evenodd"> + id="g329" + style="fill-rule:evenodd" /> + id="g330" + style="fill-rule:evenodd" /> + id="g331" + style="fill-rule:evenodd" /> + id="g332" + style="fill-rule:evenodd"> alloc_ @@ -5211,73 +5538,78 @@ + id="g333" + style="fill-rule:evenodd" /> + id="g334" + style="fill-rule:evenodd" /> + id="g335" + style="fill-rule:evenodd" /> + id="g336" + style="fill-rule:evenodd" /> + id="g337" + style="fill-rule:evenodd"> + id="g338" + style="fill-rule:evenodd" /> + id="g339" + style="fill-rule:evenodd" /> + id="g340" + style="fill-rule:evenodd" /> + id="g341" + style="fill-rule:evenodd" /> + id="g342" + style="fill-rule:evenodd"> isActive() @@ -5370,96 +5707,102 @@ + id="g343" + style="fill-rule:evenodd" /> + id="g344" + style="fill-rule:evenodd" /> + id="g345" + style="fill-rule:evenodd" /> + id="g346" + style="fill-rule:evenodd" /> + id="g347" + style="fill-rule:evenodd" /> + id="g348" + style="fill-rule:evenodd"> getTimings() @@ -5467,96 +5810,102 @@ + id="g349" + style="fill-rule:evenodd" /> + id="g350" + style="fill-rule:evenodd" /> + id="g351" + style="fill-rule:evenodd" /> + id="g352" + style="fill-rule:evenodd" /> + id="g353" + style="fill-rule:evenodd" /> + id="g354" + style="fill-rule:evenodd"> getOpenedSinks() @@ -5564,127 +5913,136 @@ + id="g355" + style="fill-rule:evenodd" /> + id="g356" + style="fill-rule:evenodd" /> + id="g357" + style="fill-rule:evenodd" /> + id="g358" + style="fill-rule:evenodd" /> + id="g359" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g361" + style="fill-rule:evenodd" /> + id="g362" + style="fill-rule:evenodd" /> + id="g363" + style="fill-rule:evenodd"> + id="g364" + style="fill-rule:evenodd" /> + id="g365" + style="fill-rule:evenodd" /> + id="g366" + style="fill-rule:evenodd"> DataSink @@ -5751,59 +6112,63 @@ + id="g367" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g369" + style="fill-rule:evenodd" /> + id="g370" + style="fill-rule:evenodd"> + id="g371" + style="fill-rule:evenodd" /> + id="g372" + style="fill-rule:evenodd" /> + id="g373" + style="fill-rule:evenodd" /> + id="g374" + style="fill-rule:evenodd"> descriptor @@ -5882,73 +6251,78 @@ + id="g375" + style="fill-rule:evenodd" /> + id="g376" + style="fill-rule:evenodd" /> + id="g377" + style="fill-rule:evenodd" /> + id="g378" + style="fill-rule:evenodd" /> + id="g379" + style="fill-rule:evenodd"> + id="g380" + style="fill-rule:evenodd" /> + id="g381" + style="fill-rule:evenodd" /> + id="g382" + style="fill-rule:evenodd" /> + id="g383" + style="fill-rule:evenodd" /> + id="g384" + style="fill-rule:evenodd"> invoke() + id="text383" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.5px;font-family:'DejaVu Sans Condensed';-inkscape-font-specification:'DejaVu Sans Condensed, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:black;fill-opacity:1;stroke:none">lockFrame(#) + id="g385" + style="fill-rule:evenodd" /> + id="g386" + style="fill-rule:evenodd" /> + id="g387" + style="fill-rule:evenodd" /> + id="g388" + style="fill-rule:evenodd" /> + id="g389" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g391" + style="fill-rule:evenodd" /> + id="g392" + style="fill-rule:evenodd" /> + id="g393" + style="fill-rule:evenodd"> + id="g394" + style="fill-rule:evenodd" /> + id="g395" + style="fill-rule:evenodd" /> + id="g396" + style="fill-rule:evenodd"> Allocation @@ -6228,59 +6623,63 @@ + id="g397" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g399" + style="fill-rule:evenodd" /> + id="g400" + style="fill-rule:evenodd"> + id="g401" + style="fill-rule:evenodd"> + id="g402" + style="fill-rule:evenodd" /> + id="g403" + style="fill-rule:evenodd" /> + id="g404" + style="fill-rule:evenodd" /> + id="g405" + style="fill-rule:evenodd"> connect() @@ -6379,96 +6783,102 @@ + id="g406" + style="fill-rule:evenodd" /> + id="g407" + style="fill-rule:evenodd" /> + id="g408" + style="fill-rule:evenodd" /> + id="g409" + style="fill-rule:evenodd" /> + id="g410" + style="fill-rule:evenodd" /> + id="g411" + style="fill-rule:evenodd"> release() @@ -6476,96 +6886,102 @@ + id="g412" + style="fill-rule:evenodd" /> + id="g413" + style="fill-rule:evenodd" /> + id="g414" + style="fill-rule:evenodd" /> + id="g415" + style="fill-rule:evenodd" /> + id="g416" + style="fill-rule:evenodd" /> + id="g417" + style="fill-rule:evenodd"> getTimings() @@ -6573,127 +6989,136 @@ + id="g418" + style="fill-rule:evenodd" /> + id="g419" + style="fill-rule:evenodd" /> + id="g420" + style="fill-rule:evenodd" /> + id="g421" + style="fill-rule:evenodd" /> + id="g422" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g424" + style="fill-rule:evenodd" /> + id="g425" + style="fill-rule:evenodd" /> + id="g426" + style="fill-rule:evenodd"> + id="g427" + style="fill-rule:evenodd" /> + id="g428" + style="fill-rule:evenodd" /> + id="g429" + style="fill-rule:evenodd"> BuffDescr @@ -6760,59 +7188,63 @@ + id="g430" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g432" + style="fill-rule:evenodd" /> + id="g433" + style="fill-rule:evenodd"> + id="g434" + style="fill-rule:evenodd"> + id="g435" + style="fill-rule:evenodd" /> + id="g436" + style="fill-rule:evenodd" /> + id="g437" + style="fill-rule:evenodd" /> + id="g438" + style="fill-rule:evenodd"> lock() @@ -6911,127 +7348,136 @@ + id="g439" + style="fill-rule:evenodd" /> + id="g440" + style="fill-rule:evenodd" /> + id="g441" + style="fill-rule:evenodd" /> + id="g442" + style="fill-rule:evenodd" /> + id="g443" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g445" + style="fill-rule:evenodd" /> + id="g446" + style="fill-rule:evenodd" /> + id="g447" + style="fill-rule:evenodd"> + id="g448" + style="fill-rule:evenodd"> + id="g449" + style="fill-rule:evenodd" /> + id="g450" + style="fill-rule:evenodd" /> + id="g451" + style="fill-rule:evenodd"> CON @@ -7122,96 +7572,102 @@ + id="g452" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g454" + style="fill-rule:evenodd" /> + id="g455" + style="fill-rule:evenodd" /> + id="g456" + style="fill-rule:evenodd" /> + id="g457" + style="fill-rule:evenodd"> AllocState @@ -7219,59 +7675,63 @@ + id="g458" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g460" + style="fill-rule:evenodd" /> + id="g461" + style="fill-rule:evenodd"> + id="g462" + style="fill-rule:evenodd" /> + id="g463" + style="fill-rule:evenodd" /> + id="g464" + style="fill-rule:evenodd" /> + id="g465" + style="fill-rule:evenodd"> connections_ @@ -7350,73 +7814,78 @@ + id="g466" + style="fill-rule:evenodd" /> + id="g467" + style="fill-rule:evenodd" /> + id="g468" + style="fill-rule:evenodd" /> + id="g469" + style="fill-rule:evenodd" /> + id="g470" + style="fill-rule:evenodd"> + id="g471" + style="fill-rule:evenodd" /> + id="g472" + style="fill-rule:evenodd" /> + id="g473" + style="fill-rule:evenodd" /> + id="g474" + style="fill-rule:evenodd" /> + id="g475" + style="fill-rule:evenodd"> AllocState() «constructor» @@ -7509,96 +7983,102 @@ + id="g476" + style="fill-rule:evenodd" /> + id="g477" + style="fill-rule:evenodd" /> + id="g478" + style="fill-rule:evenodd" /> + id="g479" + style="fill-rule:evenodd" /> + id="g480" + style="fill-rule:evenodd" /> + id="g481" + style="fill-rule:evenodd"> connect() @@ -7606,96 +8086,102 @@ + id="g482" + style="fill-rule:evenodd" /> + id="g483" + style="fill-rule:evenodd" /> + id="g484" + style="fill-rule:evenodd" /> + id="g485" + style="fill-rule:evenodd" /> + id="g486" + style="fill-rule:evenodd" /> + id="g487" + style="fill-rule:evenodd"> release() @@ -7703,96 +8189,102 @@ + id="g488" + style="fill-rule:evenodd" /> + id="g489" + style="fill-rule:evenodd" /> + id="g490" + style="fill-rule:evenodd" /> + id="g491" + style="fill-rule:evenodd" /> + id="g492" + style="fill-rule:evenodd" /> + id="g493" + style="fill-rule:evenodd"> getTimings() @@ -7800,139 +8292,149 @@ + id="g494" + style="fill-rule:evenodd" /> + id="g495" + style="fill-rule:evenodd" /> + id="g496" + style="fill-rule:evenodd" /> + id="g497" + style="fill-rule:evenodd" /> + id="g498" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g500" + style="fill-rule:evenodd" /> + id="g501" + style="fill-rule:evenodd" /> + id="g502" + style="fill-rule:evenodd" /> + id="g503" + style="fill-rule:evenodd"> + id="g504" + style="fill-rule:evenodd" /> + id="g505" + style="fill-rule:evenodd" /> + id="g506" + style="fill-rule:evenodd" /> + id="g507" + style="fill-rule:evenodd"> + id="g508" + style="fill-rule:evenodd" /> + id="g509" + style="fill-rule:evenodd" /> + id="g510" + style="fill-rule:evenodd"> + id="g511" + style="fill-rule:evenodd" /> + id="g512" + style="fill-rule:evenodd" /> + id="g513" + style="fill-rule:evenodd"> Knowledge specific + id="g514" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g516" + style="fill-rule:evenodd" /> + id="g517" + style="fill-rule:evenodd" /> + id="g518" + style="fill-rule:evenodd"> for this kind of + id="g519" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g521" + style="fill-rule:evenodd" /> + id="g522" + style="fill-rule:evenodd" /> + id="g523" + style="fill-rule:evenodd"> output driver + id="g524" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g526" + style="fill-rule:evenodd" /> + id="g527" + style="fill-rule:evenodd" /> + id="g528" + style="fill-rule:evenodd" /> + id="g529" + style="fill-rule:evenodd"> + id="g530" + style="fill-rule:evenodd" /> + id="g531" + style="fill-rule:evenodd" /> + id="g532" + style="fill-rule:evenodd"> Client + id="g533" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g535" + style="fill-rule:evenodd" /> + id="g536" + style="fill-rule:evenodd" /> + id="g537" + style="fill-rule:evenodd"> front-end + id="g538" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> + id="g540" + style="fill-rule:evenodd" /> + id="g541" + style="fill-rule:evenodd" /> + transform="matrix(0.78998551,0,0,0.78995862,19.497785,9.0421374)" + style="fill-rule:evenodd" /> diff --git a/doc/devel/uml/OutputSlot_sequence.svg b/doc/devel/uml/OutputSlot_sequence.svg index 5a70461b5..aac67408d 100644 --- a/doc/devel/uml/OutputSlot_sequence.svg +++ b/doc/devel/uml/OutputSlot_sequence.svg @@ -1,8 +1,8 @@ + style="stroke-width:1.61792;stroke-dasharray:none" + transform="matrix(1.2360651,0,0,1.2362466,-1.0395181,-4.7079327)"> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill:none;fill-rule:evenodd;stroke:#a087c0;stroke-width:1.61792;stroke-linecap:square;stroke-linejoin:bevel;stroke-dasharray:none;stroke-opacity:1" /> loop [N] + id="g380" + style="stroke-width:0.808959" + transform="matrix(1.2360651,0,0,1.2362466,-1.0395181,-4.7079327)"> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans Condensed';fill:#ffffc0;fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:0.806633;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" /> : OutputManager + id="g374" + style="stroke-width:0.808959" + transform="matrix(1.2360651,0,0,1.2362466,-1.0395181,-4.7079327)"> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans Condensed';fill:#ffffc0;fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:0.806633;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" /> : Client + id="g377" + style="stroke-width:0.808959" + transform="matrix(1.2360651,0,0,1.2362466,-1.0395181,-4.7079327)"> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans Condensed';fill:#ffffc0;fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:0.806633;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" /> : BuffHandle + id="g379" + style="stroke-width:0.808959" + transform="matrix(1.2360651,0,0,1.2362466,-1.0395181,-4.7079327)"> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans Condensed';fill:#ffffc0;fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:0.806633;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" /> : DataSink + id="g375" + style="stroke-width:0.808959" + transform="matrix(1.2360651,0,0,1.2362466,-1.0395181,-4.7079327)"> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans Condensed';fill:#ffffc0;fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:0.806633;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" /> : OutputSlot + id="g376" + style="stroke-width:0.808959" + transform="matrix(1.2360651,0,0,1.2362466,-1.0395181,-4.7079327)"> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans Condensed';fill:#ffffc0;fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:0.806633;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" /> : AllocState + id="g373" + style="stroke-width:0.808959" + transform="matrix(1.2360651,0,0,1.2362466,-1.0395181,-4.7079327)"> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans Condensed';fill:#ffffc0;fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:0.806633;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" /> : BufferProxy + id="g378" + style="stroke-width:0.808959" + transform="matrix(1.2360651,0,0,1.2362466,-1.0395181,-4.7079327)"> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans Condensed';fill:#ffffc0;fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:0.806633;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" /> : Connection + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans Condensed';fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.10514;stroke-linecap:butt;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,63.241769,55.588907)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans Condensed';fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.10514;stroke-linecap:butt;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,469.26241,96.190045)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans Condensed';fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.10514;stroke-linecap:butt;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,554.97769,109.72385)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,88.505279,434.55774)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,88.505279,434.55774)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,88.505279,434.55774)" /> mark_emitted() + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">mark_emitted() destroy + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">destroy + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,203.99538,434.55774)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,203.99538,434.55774)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,203.99538,434.55774)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans Condensed';fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.10514;stroke-linecap:butt;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,167.00263,258.59478)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans Condensed';fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.10514;stroke-linecap:butt;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,825.65764,141.30211)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans Condensed';fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.10514;stroke-linecap:butt;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,293.32018,55.588907)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans Condensed';fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.10514;stroke-linecap:butt;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,225.64974,177.39286)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,261.74033,239.6527)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,261.74033,239.6527)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,261.74033,239.6527)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-dasharray:0.808959, 1.61792;stroke-dashoffset:0;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,261.74033,239.6527)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,692.12197,258.05367)" /> + style="font-size:11.5px;font-family:'DejaVu Sans';vector-effect:non-scaling-stroke;fill:none;fill-rule:evenodd;stroke:#00004f;stroke-width:0.997121;stroke-linecap:square;stroke-linejoin:bevel;stroke-dasharray:0.729889, 1.45978" + d="m 701.63118,273.39188 h 153.80108 m -150.19201,-2.70674 -3.60907,2.70674 3.60907,2.70675" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,203.99538,311.78985)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,203.99538,311.78985)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,203.99538,311.78985)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,239.58302)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,239.58302)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,239.58302)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-dasharray:0.808959, 1.61792;stroke-dashoffset:0;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,239.58302)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,308.47268)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,308.47268)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,308.47268)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-dasharray:0.808959, 1.61792;stroke-dashoffset:0;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,308.47268)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,589.26309,134.53566)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,589.26309,134.53566)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-dasharray:0.808959, 1.61792;stroke-dashoffset:0;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,589.26309,134.53566)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-dasharray:0.808959, 1.61792;stroke-dashoffset:0;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,240.08598,269.8728)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,240.08598,269.8728)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,240.08598,269.8728)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,589.26309,152.58105)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,589.26309,152.58105)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-dasharray:0.808959, 1.61792;stroke-dashoffset:0;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,589.26309,152.58105)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,506.25516,121.00187)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,506.25516,121.00187)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-dasharray:0.808959, 1.61792;stroke-dashoffset:0;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,506.25516,121.00187)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,161.25491)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,161.25491)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,161.25491)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-dasharray:0.808959, 1.61792;stroke-dashoffset:0;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,161.25491)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,98.429542)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,98.429542)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,98.429542)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-dasharray:0.808959, 1.61792;stroke-dashoffset:0;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,98.429542)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,298.73309,188.67088)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,298.73309,188.67088)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-dasharray:0.808959, 1.61792;stroke-dashoffset:0;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,298.73309,188.67088)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,341.13965,107.46806)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,341.13965,107.46806)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-dasharray:0.808959, 1.61792;stroke-dashoffset:0;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,341.13965,107.46806)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,692.12197,434.5333)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,649.89061)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,505.353,682.65152)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,588.36093,696.18532)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,588.36093,696.18532)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,588.36093,696.18532)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-dasharray:0.808959, 1.61792;stroke-dashoffset:0;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,588.36093,696.18532)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,524.11682)" /> publish() + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">publish() + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:2.2103;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,54.219165,-16.590928)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:2.2103;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,54.219165,-16.590928)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:2.2103;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,54.219165,-16.590928)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:2.2103;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,54.219165,-16.590928)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:2.2103;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,54.219165,-16.590928)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:2.2103;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,54.219165,-16.590928)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:2.2103;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,54.219165,-16.590928)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:2.2103;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,54.219165,-16.590928)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:2.2103;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,54.219165,-16.590928)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:2.2103;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,54.219165,-16.590928)" /> lockBuffer + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">lockBuffer claimBufferFor() + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">claimBufferFor() access buffer + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">access buffer frame() + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.376px;font-family:'DejaVu Sans Condensed';-inkscape-font-specification:'DejaVu Sans Condensed, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">lockFrame(#) accessAs() + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">accessAs() getOpenedSinks() + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">getOpenedSinks() getOutput + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">getOutput new + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">new allocate() + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">allocate() generate data + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">generate data emit() + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">emit() release() + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">release() detachBuffer() + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">detachBuffer() destroy + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">destroy shutDown() + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">shutDown() + transform="matrix(1.2360651,0,0,1.2362466,-1.0395181,49.237495)" + style="stroke-width:0.808959"> @@ -1394,56 +1396,56 @@ vector-effect="non-scaling-stroke" points="125,4 121,1 " id="polyline337" - style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.36613;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" - transform="matrix(0.72995086,0,0,0.72982833,72.443431,409.02237)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,88.505279,500.94458)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,88.505279,500.94458)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,88.505279,500.94458)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,203.99538,501.91096)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,203.99538,501.91096)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,203.99538,501.91096)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,87.603036,663.97094)" /> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,505.353,664.60615)" /> release() + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">release() done + style="fill-rule:evenodd;stroke-width:0.997124;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1">done + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill-opacity:1;fill-rule:evenodd;stroke:#00004f;stroke-width:1.10514;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" + transform="matrix(0.90226678,0,0,0.90224779,692.12197,501.98878)" /> + id="g381" + style="stroke-width:0.808959" + transform="matrix(1.2360651,0,0,1.2362466,-1.0395181,-4.7079327)"> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill:#b8ffb4;fill-opacity:1;stroke:#004f43;stroke-width:0.806633;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" /> Data producer + id="g382" + style="stroke-width:0.808959" + transform="matrix(1.2360651,0,0,1.2362466,-1.0395181,-4.7079327)"> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill:#b8ffb4;fill-opacity:1;stroke:#004f43;stroke-width:0.806633;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" /> Output Slot + id="g383" + style="stroke-width:0.808959" + transform="matrix(1.2360651,0,0,1.2362466,-1.0395181,-4.7079327)"> + style="font-style:normal;font-weight:400;font-size:11.5px;font-family:'DejaVu Sans';fill:#b8ffb4;fill-opacity:1;stroke:#004f43;stroke-width:0.806633;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1" /> Output implementation diff --git a/src/steam/engine/calc-stream.hpp b/src/steam/engine/calc-stream.hpp index 359cd80a8..7a343272c 100644 --- a/src/steam/engine/calc-stream.hpp +++ b/src/steam/engine/calc-stream.hpp @@ -97,7 +97,7 @@ namespace engine{ void - sendToOutput (vault::out::DataSink) + sendToOutput (vault::out::OutputSlot::DataSink&) { UNIMPLEMENTED ("set up dispatcher to start calculating and feeding to the given output sink"); } diff --git a/src/steam/engine/dispatcher.hpp b/src/steam/engine/dispatcher.hpp index 82ffd1f63..f5db3416c 100644 --- a/src/steam/engine/dispatcher.hpp +++ b/src/steam/engine/dispatcher.hpp @@ -48,13 +48,14 @@ namespace engine { using std::make_pair; using mobject::ModelPort; using vault::out::Timings; - using vault::out::DataSink; using lib::time::TimeValue; using lib::time::TimeSpan; using lib::time::FrameCnt; using lib::time::FSecs; using lib::time::Time; + using DataSink = vault::out::OutputSlot::DataSink; + /** * Internal abstraction: a service within the engine diff --git a/src/steam/engine/engine-service.cpp b/src/steam/engine/engine-service.cpp index 7a9dee174..dc1890d01 100644 --- a/src/steam/engine/engine-service.cpp +++ b/src/steam/engine/engine-service.cpp @@ -31,9 +31,10 @@ using std::function; using std::placeholders::_1; using lib::iter_source::transform; using lib::append_all; -using vault::out::DataSink; + +using DataSink = vault::out::OutputSlot::DataSink; -namespace steam { +namespace steam { namespace engine{ @@ -73,7 +74,7 @@ namespace engine{ Quality serviceQuality) { //////////////////////////////////////////////////TICKET #1301 : prepare proper Dispatcher here, including translation ModelPort -> portIDX RenderEnvironment& renderConfig = configureCalculation (mPort,nominalTimings,serviceQuality); - function triggerRenderStart = bind (activateCalculation, _1, ref(renderConfig)); + function triggerRenderStart = bind (activateCalculation, _1, ref(renderConfig)); CalcStreams runningCalculations; append_all (transform (outputSlot.getOpenedSinks() @@ -106,7 +107,7 @@ namespace engine{ * to be re-configured and adjusted while running. */ CalcStream - EngineService::activateCalculation (DataSink sink, RenderEnvironment& engineCallback) + EngineService::activateCalculation (DataSink& sink, RenderEnvironment& engineCallback) { CalcStream calcStream(engineCallback); calcStream.sendToOutput (sink); ////////////////////////////////////////////////////TICKET #1297 : need to re-think the association ModelPort ⟷ output sink diff --git a/src/steam/engine/engine-service.hpp b/src/steam/engine/engine-service.hpp index dd4c77de3..c220fe79d 100644 --- a/src/steam/engine/engine-service.hpp +++ b/src/steam/engine/engine-service.hpp @@ -159,7 +159,7 @@ namespace engine{ friend class EngineDiagnostics; private: - static CalcStream activateCalculation (vault::out::DataSink, RenderEnvironment&); + static CalcStream activateCalculation (vault::out::OutputSlot::DataSink&, RenderEnvironment&); }; diff --git a/src/steam/engine/job-planning.hpp b/src/steam/engine/job-planning.hpp index d9e5528fb..7a45b5af5 100644 --- a/src/steam/engine/job-planning.hpp +++ b/src/steam/engine/job-planning.hpp @@ -77,10 +77,11 @@ namespace engine { using lib::time::Time; using lib::time::TimeVar; using lib::time::Duration; - using vault::out::DataSink; using vault::out::Timings; using vault::gear::Job; + using DataSink = vault::out::OutputSlot::DataSink; + /** diff --git a/src/vault/mem/buffer-provider-setup.hpp b/src/vault/mem/buffer-provider-setup.hpp index 4b5f8f7ba..a70c74b42 100644 --- a/src/vault/mem/buffer-provider-setup.hpp +++ b/src/vault/mem/buffer-provider-setup.hpp @@ -47,8 +47,19 @@ namespace mem { /** * Framework for configuring the actual BufferPovider backend implementation. + * The functionality is provided by the »two pillars«: BufferState (metadata) + * and BufferStore (storage provider). The actual functionality exposed through + * this API can be adapted in a wide range by using suitable back-ends + * - the NaiveBufferSetup ignores aspects of performance and concurrency, + * but allows to investigate each requested buffer after the fact + * - a _production-grade implementation_ uses thread-local services + * in concert with the EngineBufferMetadata and EngineBufferManager. + * Allocations are exchanged via asynchronous messaging. * - * @todo WIP-WIP-WIP as of 2/2026 -- reworking BufferProvider implementation ////////////////////////////TICKET #1410 + * Generally speaking, this template controls the actual setup by delegating + * to the CONF policy passed as template argument. Furthermore, proxying + * of already instantiated back-ends is [supported](\ref #decorate) + * for subclasses (notably the DiagnosticBufferProvider) */ class BufferProviderSetup : public BufferProvider diff --git a/src/vault/mem/buffhandle.hpp b/src/vault/mem/buffhandle.hpp index 4b272ed18..5b408d2f0 100644 --- a/src/vault/mem/buffhandle.hpp +++ b/src/vault/mem/buffhandle.hpp @@ -112,6 +112,7 @@ namespace mem { size_t buffSize() const; operator HashVal() const { return subClassification_; } + friend bool operator== (BuffDescr const&, BuffDescr const&) =default; /** callback to engage buffer handling cycle */ uint announce (uint count); diff --git a/src/vault/mem/engine-buffer-metadata.hpp b/src/vault/mem/engine-buffer-metadata.hpp index d03e6d93e..f34284de7 100644 --- a/src/vault/mem/engine-buffer-metadata.hpp +++ b/src/vault/mem/engine-buffer-metadata.hpp @@ -53,8 +53,6 @@ #include "lib/error.hpp" -//#include "lib/hash-value.h" -#include "include/logging.h" #include "vault/mem/buffer-metadata.hpp" #include "lib/nocopy.hpp" #include "lib/sync.hpp" @@ -64,7 +62,6 @@ namespace vault{ namespace mem { -// namespace err = lumiera::error; using std::move; using util::unConst; diff --git a/src/vault/out/output-slot-connection.hpp b/src/vault/out/output-slot-connection.hpp index ccdf4876f..d4eb91f7c 100644 --- a/src/vault/out/output-slot-connection.hpp +++ b/src/vault/out/output-slot-connection.hpp @@ -199,7 +199,7 @@ namespace out { * where each element is a DataSink functor that uses this connection * to start an output cycle by locking a buffer by invoking Connection::claimBufferFor(FrameID) * @param lifecycleManager the ref-counting shared_ptr which controls the lifecycle of this Allocation - * @note two statefull objects are embedded into the DataSink functor + * @note two statefull objects are embedded into the DataSink handle * - a BuffDescr preconfigured to point into this connection, using the proper buffer size * - the \a lifecycleManager, so that the DataSink participates in the ref-count */ @@ -207,14 +207,8 @@ namespace out { connect (PAlloc& lifecycleManager) override { auto buildDataSink = [&](CON& connection) - { // setup functor to lock a buffer using this output connection - return DataSink{[bufferDescriptor = bufferProxy_.getDescriptorFor (connection) - ,lifecycleManager - ] - (FrameID frame) mutable -> BuffHandle - { - return bufferDescriptor.lockBuffer (frame); - }}; + { // attach to ref-count preconfigure output connection to address + return DataSink{lifecycleManager, bufferProxy_.getDescriptorFor (connection)}; }; return lib::explore (connections_) @@ -261,7 +255,7 @@ namespace out { } /** - * @remark in moste cases this variant is preferable, + * @remark for most cases this variant is preferable, * since it creates all connection objects from the same set of constructor arguments * @note args will be copied into a _populator functor_ that is then applied for each connection to create */ diff --git a/src/vault/out/output-slot.hpp b/src/vault/out/output-slot.hpp index 50b53ccf7..b64778295 100644 --- a/src/vault/out/output-slot.hpp +++ b/src/vault/out/output-slot.hpp @@ -82,6 +82,7 @@ namespace vault { namespace out { + using vault::mem::BuffDescr; using vault::mem::BuffHandle; using lib::time::FrameCnt; using std::unique_ptr; @@ -90,37 +91,6 @@ namespace out { using FrameID = FrameCnt; - /** - * Handle to represent an opened connection ready to receive media data for output. - * Each DataSink (handle) corresponds to an OutputSlot::Connection entry. Data is - * published frame wise in a two-phase protocol: in the first stage, the client - * gets exclusive access to an output buffer. Once the data is ready for output, - * the client signals `emit()` and the buffer enters the second stage, where the - * intern output mechanism of that specific connection gets exclusive access. - * - * The DataSink handle is a _functor_ and can be invoked with a frame number, - * to start such a two-phase transaction for _this specific frame._ The result - * is a BuffHandle, to be used in the usual way as with a BufferProvider: - * - the client can access the buffer memory, either raw or with a forced cast - * - the client invokes BuffHandle::emit() to indicate that data is ready for output - * - once the client is done with that handle, it **must** invoke BuffHandle::release() - * Each output mechanism defines specific constraints regarding the time window when - * to get such a BuffHandle and when `emit()` must have been called. These constraints - * are indicated by the vault::out::Timings, that can be retrieved from the OutputSlot. - * - * @note DataSink embeds a ref-counting handle to detect automatically when some - * connection can be released; the _allocation of an OutputSlot_ is released - * once all connections were discarded. - */ - class DataSink - : public std::function - { - public: - /////////////////////////////////////////////TICKET #1377 : presumably we want some stream-type hash ID here -- to allow building a processing-ID for each Render Node invocation - }; - - - /****************************************************************************//** * Interface: Generic output sink. * An OutputSlot represents the possibility to send data through multiple @@ -143,6 +113,7 @@ namespace out { { public: + class DataSink; using OpenedSinks = lib::IterSource::iterator; OpenedSinks getOpenedSinks(); @@ -217,6 +188,63 @@ namespace out { template static OutputSlot allocate (size_t cnt, FUN&& populator); + + + + /* ========== Data Sink handles ========== */ + + /** + * Handle to represent an opened connection ready to receive media data for output. + * Each DataSink (handle) corresponds to an OutputSlot::Connection entry. Data is + * published frame wise in a two-phase protocol: in the first stage, the client + * gets exclusive access to an output buffer. Once the data is ready for output, + * the client signals `emit()` and the buffer enters the second stage, where the + * intern output mechanism of that specific connection gets exclusive access. + * + * The DataSink handle is essentially a _functor_ and can be invoked with some + * frame number, to start such a two-phase transaction for _this specific frame._ + * The result is a BuffHandle, to be used in the usual way as with a BufferProvider: + * - the client can access the buffer memory, either raw or with a forced cast + * - the client invokes BuffHandle::emit() to indicate that data is ready for output + * - once the client is done with that handle, it **must** invoke BuffHandle::release() + * Each output mechanism defines specific constraints regarding the time window when + * to get such a BuffHandle and when `emit()` must have been called. These constraints + * are indicated by the vault::out::Timings, that can be retrieved from the OutputSlot. + * @remark DataSink has reference semantics and thus an implied identity, that is + * tied to the backing active output configuration and the data feed number. + * @note DataSink embeds a ref-counting handle to detect automatically when some + * connection can be released; the _allocation of an OutputSlot_ is released + * once all connections were discarded. + */ + class DataSink + : util::NonAssign + { + PAlloc lifeCount_; + BuffDescr outputBufferType_; + + template + friend class AllocState; // created with back-link + + DataSink (PAlloc const& instance, BuffDescr type) + : lifeCount_{instance} + , outputBufferType_{type} + { } + + public: + BuffHandle + lockFrame (FrameID frame) + { + return outputBufferType_.lockBuffer (frame); + } + + /////////////////////////////////////////////TICKET #1377 : presumably we want some stream-type hash ID here -- to allow building a processing-ID for each Render Node invocation + friend bool + operator== (DataSink const& s1, DataSink const& s2) + { + return s1.lifeCount_ == s2.lifeCount_ + and s1.outputBufferType_ == s2.outputBufferType_; + } + }; }; diff --git a/tests/steam/engine/mock-dispatcher.hpp b/tests/steam/engine/mock-dispatcher.hpp index 62f5ba897..c3964f777 100644 --- a/tests/steam/engine/mock-dispatcher.hpp +++ b/tests/steam/engine/mock-dispatcher.hpp @@ -79,11 +79,12 @@ namespace test { using util::isnil; using util::isSameObject; using fixture::Segmentation; - using vault::out::DataSink; using vault::RealClock; using vault::gear::Job; using vault::gear::JobClosure; + using DataSink = vault::out::OutputSlot::DataSink; + @@ -405,7 +406,7 @@ namespace test { /** * Test support: verify the given Job is consistent with this Dispatcher. */ - bool verify(Job const& job, ModelPort const& port, vault::out::DataSink const& sink) + bool verify(Job const& job, ModelPort const& port, DataSink const& sink) { if (not dummySetup_.isSupported (port, sink)) return false; diff --git a/tests/steam/engine/mock-support-test.cpp b/tests/steam/engine/mock-support-test.cpp index 4dccb1a84..215934f20 100644 --- a/tests/steam/engine/mock-support-test.cpp +++ b/tests/steam/engine/mock-support-test.cpp @@ -389,21 +389,10 @@ namespace test { auto [port0,sink0] = dispatcher.getDummyConnection(0); auto [port1,sink1] = dispatcher.getDummyConnection(1); CHECK (port0 != port1); - UNIMPLEMENTED ("Identity of a DataSink"); -#if false //////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1410 : disabled code to allow refactoring of OutputSlot CHECK (sink0 != sink1); -#endif /////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1410 : (end) disabled code CHECK (port0.isValid()); CHECK (port1.isValid()); -#if false //////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1410 : disabled code to allow refactoring of OutputSlot - /////////////////////////OOO seemingly this is no longer possible (and unnecessary), since DataSink participates in the ref-count now - CHECK (sink0.isValid()); - CHECK (sink1.isValid()); -#endif /////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1410 : (end) disabled code CHECK (not ModelPort().isValid()); -#if false //////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1410 : disabled code to allow refactoring of OutputSlot - CHECK (not DataSink().isValid()); -#endif /////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1410 : (end) disabled code CHECK (0 == dispatcher.resolveModelPort(port0)); CHECK (1 == dispatcher.resolveModelPort(port1)); diff --git a/tests/steam/play/dummy-builder-context.hpp b/tests/steam/play/dummy-builder-context.hpp index 1a728f5fd..61571b58b 100644 --- a/tests/steam/play/dummy-builder-context.hpp +++ b/tests/steam/play/dummy-builder-context.hpp @@ -79,11 +79,12 @@ namespace test { using fixture::ModelPortRegistry; using vault::mem::Buff; using vault::mem::BuffHandle; - using vault::out::DataSink; using vault::out::FrameID; using lib::time::TimeValue; using util::_Fmt; + using DataSink = vault::out::OutputSlot::DataSink; + diff --git a/tests/steam/play/dummy-play-connection.hpp b/tests/steam/play/dummy-play-connection.hpp index efaee3bc8..15169993b 100644 --- a/tests/steam/play/dummy-play-connection.hpp +++ b/tests/steam/play/dummy-play-connection.hpp @@ -88,8 +88,8 @@ namespace steam{ namespace play { namespace test { -// using std::string; using lib::time::Duration; + using DataSink = vault::out::OutputSlot::DataSink; @@ -143,11 +143,8 @@ namespace test { if (port == *it) { auto [refPort, refSink] = getModelPort(i); - UNIMPLEMENTED ("need a fake OutputSlot and need to place some Stream-ID into the data sink"); -#if false //////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1410 : disabled code to allow refactoring of the OutputSlot default implementation if (refSink == sink) return true; -#endif /////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1410 : (end) disabled code } return false; } diff --git a/tests/vault/gear/test-chain-load-test.cpp b/tests/vault/gear/test-chain-load-test.cpp index 09ede91da..c09a76036 100644 --- a/tests/vault/gear/test-chain-load-test.cpp +++ b/tests/vault/gear/test-chain-load-test.cpp @@ -891,7 +891,7 @@ namespace test { CHECK (micros > 80); micros = cpuLoad.benchmark(); - CHECK (micros < 110); + CHECK (micros < 115); CHECK (micros > 90); cpuLoad.timeBase = 1ms; diff --git a/tests/vault/out/output-alloc-state-test.cpp b/tests/vault/out/output-alloc-state-test.cpp index 1760a7a47..58bd3df32 100644 --- a/tests/vault/out/output-alloc-state-test.cpp +++ b/tests/vault/out/output-alloc-state-test.cpp @@ -149,7 +149,7 @@ namespace vault::out::test { CHECK (not sinks); log.event("lock buffer"); - BuffHandle han = sink(FRA_NO); + BuffHandle han = sink.lockFrame (FRA_NO); CHECK (han); CHECK (han.size() == sizeof(DUMMY_BUFF)); CHECK (isSameAdr (han.rawStorage(), &DUMMY_BUFF)); diff --git a/tests/vault/out/output-slot-protocol-test.cpp b/tests/vault/out/output-slot-protocol-test.cpp index 9b2380251..7c8c6af8b 100644 --- a/tests/vault/out/output-slot-protocol-test.cpp +++ b/tests/vault/out/output-slot-protocol-test.cpp @@ -34,6 +34,8 @@ namespace vault{ namespace out { namespace test { + using DataSink = vault::out::OutputSlot::DataSink; + /***************************************************************//** @@ -80,15 +82,15 @@ namespace test { // within the frame-calculation "loop" // we perform a data exchange cycle auto MARK_0 = markTime(); - BuffHandle buff00 = sink0(START); - BuffHandle buff10 = sink1(START); + BuffHandle buff00 = sink0.lockFrame (START); + BuffHandle buff10 = sink1.lockFrame (START); // rendering process calculates content.... buff00.emplace (testData(0,0)); // while further frames might be processed in parallel auto MARK_1 = markTime(); - BuffHandle buff11 = sink1(START+1); + BuffHandle buff11 = sink1.lockFrame (START+1); buff11.emplace (testData(1,1)); buff10.emplace (testData(1,0)); diff --git a/wiki/renderengine.html b/wiki/renderengine.html index eae00ff56..4106d9709 100644 --- a/wiki/renderengine.html +++ b/wiki/renderengine.html @@ -5179,7 +5179,7 @@ Thus the mapping is a copyable value object, using an associative array. It may First and foremost, mapping can be seen as a //functional abstraction.// As it's used at implementation level, encapsulation of detail types in't the primary concern, so it's a candidate for generic programming: For each of those use cases outlined above, a distinct mapping type is created by instantiating the {{{OutputMapping<DEF>}}} template with a specifically tailored definition context ({{{DEF}}}), which takes on the role of a strategy. Individual instances of this concrete mapping type may be default created and copied freely. This instantiation process includes picking up the concrete result type and building a functor object for resolving on the fly. Thus, in the way typical for generic programming, the more involved special details are moved out of sight, while being still in scope for the purpose of inlining. But there //is// a concern better to be encapsulated and concealed at the usage site, namely accessing the rules system. Thus mapping leads itself to the frequently used implementation pattern where there is a generic frontend as header, calling into opaque functions embedded within a separate compilation unit. -
+
Within the Lumiera player and output subsystem, actually sending data to an external output requires to allocate an ''output slot''
 This is the central metaphor for the organisation of actual (system level) outputs; using this concept allows to separate and abstract the data calculation and the organisation of playback and rendering from the specifics of the actual output sink. Actual output possibilities (video in GUI window, video fullscreen, using a beamer, sound, Jack, rendering to file) can be added and removed dynamically from various components (Vault, Stage), all using the same resolution and mapping mechanisms (&rarr; OutputManagement)
 
@@ -5237,7 +5237,7 @@ Thus there are two serious problem situations
 &rarr; OutputSlotImpl
 
-
+
The OutputSlot interface describes a point where generated media data can actually be sent to the external world. It is expected to be implemented by adapters and bridges to existing drivers or external interface libraries, like a viewer widget in the GUI, ALSA or Jack sound output, rendering to file, using an external media format library. The design of this core facility was rather difficult and stretched out over quite some time span -- this page documents the considerations and the decisions taken.
 
 !intention
@@ -5272,7 +5272,8 @@ Besides the sink handles, allocation of an output slot defines some timing const
 
 {{red{WIP 3/2026}}} after a long break, we are now facing the problem how to make BufferProvider and OutputSlot work together. Both define a protocol and data exchange models -- and both exhibit a weakness regarding the releasing of buffers. At which time is it safe to release a buffer, when the handover didn't happen? This is similar to the problem of closing a network connection, i.e. the problem is generally unsolvable, but can be handled pragmatically within certain limits.
 * For handles in the Render Engine we can generally assume that the regular call path is always completed, which ensures that every handle gets released. Exceptions may happen, but are //not handled// -- rather the Engine will be shut down in such a case, which could be arranged to discard all buffer memory unconditionally
-* Regarding the »Output Slot Protocol« it is not clear yet which part will be responsible for checking the [[timing constraints|Timings]]; the actual {{{Connection}}} implementation looks like a plausible candidate. Furthermore, it is not clear yet {{red{3/26}}} where precisely an underlying buffer provider will be integrated, and if doing so is mandatory
+* Regarding the »Output Slot Protocol« it is not clear yet which part will be responsible for checking the [[timing constraints|Timings]]; the actual {{{Connection}}} implementation looks like a plausible candidate. The latter is also responsible for providing the actual data buffer, which is deemed an implementation detail.
+* The {{{DataSink}}} handle obtained for each data feed is the //actual access point// for clients to deliver data for output; in this case it seems adequate to rely on a ref-count, in order to ensure that the output configuration is available as long as any client processing is underway
 
 -----
 !Implementation / design problems
@@ -5317,18 +5318,16 @@ So the problem is that BufferProvider is conceived as a central service facility
 !!! Establish a proper Lifecycle
 While the original design for OutputSlot seems //elegant, on a theoretical level,// the implementation was constantly plagued with complexities related to the lifecycle. Some relevant aspects could not be settled at all -- which was not noticed until the recent attempts to integrate the OutputSlot into the (likewise reworked) Render Engine implementation. A turning point in all this evolution of design is to remove the //state abstraction// -- in favour of representing the progression of state directly as a sequence of context data frames. The deeper change, which motivated this shift, was to abandon the idea of a single, global, overarching and final scheme of »Rendering«. It is acknowledged rather that the actual rendering for some unspecified »rendering« will be done by an external library -- and each such library establishes its own terminology, processing scheme and conventions, which finally are rooted in some specific ''Domain Ontology''. The Lumiera Render Engine is now understood as a connected graph of //adaptors//, organised around some minimal common denominator, like the fact that data frames are calculated, and that each such frame can be addressed by a media type and a point in time.
 
-In line with this shift in focus, the OutputSlot is seen as yet another element of representational state: it is a token to embody an allocated output connection. This implies to unify the notion of the {{{OutputSlot}}} with the {{{Allocation}}}, and turn both into a handle passed to the client process. All aspects of lifecycle can be managed automatically with such ref-counting handles. This has some cost in terms of performance (thread contention when accessing the atomic ref count), but that is deemed acceptable, since output is handled on a rather slow time scale, like producing a data frame every 10 milliseconds. The specific output mechanism remains »allocated« thus as long as some element of the client processing still holds onto any such handle, either the {{{OutputSlot}}} or some {{{DataSink}}}. The latter is reduced into a //named function//, which however also embeds a shared handle to the common allocation state. With this rearrangement in the design, there is now a cohesive domain of connection management, while the actual, technical connection is separated out and packaged behind the {{{Connection}}} interface.
+In line with this shift in focus, the OutputSlot is seen as yet another element of representational state: it is a token to embody an allocated output connection. This implies to unify the notion of the {{{OutputSlot}}} with the {{{Allocation}}}, and turn both into a handle passed to the client process. All aspects of lifecycle can be managed automatically with such ref-counting handles. This has some cost in terms of performance (thread contention when accessing the atomic ref count), but that is deemed acceptable, since output is handled on a rather slow time scale, like producing a data frame every 10 milliseconds. The specific output mechanism remains »allocated« thus as long as some element of the client processing still holds onto any such handle, either the {{{OutputSlot}}} or some {{{DataSink}}}. The latter is a copyable value, which however also embeds a shared handle to the common allocation state. From a given {{{DataSink}}}, it is thus possible to start the computation cycle for each frame within the individual data feed of the corresponding {{{Connection}}}. With this rearrangement in the design, there is now a cohesive domain of connection management, while the actual, technical connection is separated out and packaged behind the {{{Connection}}} interface.
 
 !!! How actually to arrange the delegation
-Taken together, this implies that the {{{OutputSlot::AllocState<CON>}}} turns into a delegation hub. It has to maintain the active connections and can thus be used to back a custom made {{{BufferStore}}} implementation, using the information embedded into the {{{LocalTag}}} to select the proper {{{Connection}}} for delegation -- which provides the actual implementation of all buffer management and state handling for the specific output mechanism. Yet this does not imply to route every actual call through the {{{AllocState}}} -- while this is possible, and could be characterised as the naive solution, it would lead to several delegation chains, with a set of delegation methods at each intermediary step. Furthermore, it would require to wire a back-reference to this {{{AllocState}}} through the proxy-{{{BufferProvider}}}.
-
-Since the entrance point to each buffer usage cycle is the functor in the {{{DataSink}}}, a direct call-path can be established. For one, the C++ standard library offers an [[aliasing-constructor|https://cppreference.com/w/cpp/memory/shared_ptr/shared_ptr.html]]; this is a rather obscure feature, yet allows to setup a subordinate shared-ptr, that participates in the lifecycle management (ref-count) of the main pointer, while pointing at some //alias object//, which typically is a subclass, sub-object or otherwise a part of the automatically managed compound. In the case at hand here, a shared-pointer //to the individual connection// can be established within the λ-capture. Furthermore, the {{{OutputBufferProxy}}} (the proxy-{{{BufferProvider}}}) can be constructed such as to delegate //directly to that {{{Connection}}}.//
+Taken together, this implies that the {{{OutputSlot::AllocState<CON>}}} turns into a delegation hub. It has to maintain the active connections and can thus be used to back a custom made {{{BufferStore}}} implementation, using the information embedded into the {{{LocalTag}}} to select the proper {{{Connection}}} for delegation -- which provides the actual implementation of all buffer management and state handling for the specific output mechanism. Yet this does not imply to route every actual call through the {{{AllocState}}} -- in fact it is sufficient to forward the buffer lifecycle calls directly to the //corresponding connection//, which is implicitly available through the {{{LocalTag}}} in the buffer type. Besides that, this buffer type (which is a hash), together with the identity of the reference counting handle, constitutes an //identity of the {{{DataSink}}}, so that equality comparisons can be supported.
 
 And this raises another intricate question of design: //shall {{{Connection}}} be a ''concept''?//
 This would be a very elegant, and modern solution, offering much flexibility for the Implementer of said {{{Connection}}}. The {{{OutputBufferProxy}}} could be templated to that {{{Connection}}} type and thus allow the optimiser to inline and reduce the callback functionality. However -- C++ concepts are a rather new and arcane feature, as they rely on very special syntax and semantics that still requires some time in practical use to catch on and prove its viability. A further objection that can be raised is the fact that compliance to a concept leaves no traces within the implementation -- quite contrary to a classical ~OO-style interface, where the implementation is very obviously marked as such. These considerations bring me to the decision to //reject the use of a concept// here, and to rely on a conventional interface for {{{Connection}}}. Notably it can be expected that new kinds of connection will be added frequently, and so the task for a developer not familiar with all fine points of this design should be reasonably straight forward: „You have to implement the {{{Connection}}} interface“
 
-
+
OutputSlot is an abstraction, allowing unified treatment of various physical output connections from within the render jobs. 
 
 Each distinct output capability must be registered through an OutputManager. When a client wants to output data, it obtains a suitable OutputSlot through the OutputDirector. This OutputSlot is created and initialised properly for this single use by the {{{OutputManager}}} in charge for that kind of output capability; notably it must be outfitted with an actual implementation of the {{{OutputSlot::Allocation}}} interface, and typically {{{OutputSlot::AllocState<CON>}}} will be used for that purpose.
diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm
index f0f327d7a..649116ea1 100644
--- a/wiki/thinkPad.ichthyo.mm
+++ b/wiki/thinkPad.ichthyo.mm
@@ -90478,7 +90478,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + @@ -90497,11 +90497,12 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + - + + @@ -90533,8 +90534,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - + + @@ -90561,24 +90562,123 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- +

- Ha: wir kommen vorwärts.... + Ha! wir kommen vorwärts....

- size_t getBufferSize() const  override { UNIMPLEMENTED ("getBufferSize()");  } + size_t getBufferSize() const  override { UNIMPLEMENTED ("getBufferSize()");  }

+ + + + + + +

+ ich hab nämlich nicht wirklich einen Überblick, wofür das schon verwendet wird, geschweige denn, wofür es sinnvollerweise noch verwendet werden könnte; im ersten Schritt erscheint es sinnvoll, die output-Sinks wenigstens mal irgendwie verwenden zu können +

+ +
+ + + + + + +

+ zumindest damit man versteht, wie die Datenstruktur gedacht war — weiß immer noch nicht, ob sowas jemals gebraucht wird +

+ +
+
+
+ + + + +

+ Achtung: komplett ungetestet +

+ +
+ +
+
+ + + + + + + +

+ aber DataSink ist jetzt ein opaque-funktor und nicht mehr vergleichbar... +

+ +
+
+ + + + +

+ Das sind alles Zusammenhänge, die ich wohl mal bedacht habe, aber dann in die Zukunft verschoben — denn aktuell müßte ich würfeln, und würde dabei mit hoher Wahrscheinlichkeit was falsches festlegen. In der Tat hat eine DataSink eine Identität (sie hat ja Referenz-Semantik) und in der Tat verbirgt sich auch ein sehr spezieller StreamType dahinter. Aber haben wir nicht auch deshalb unseren Builder, damit das alles einmal gecheckt wird, und dann paßt es?? Produktiver Code sollte doch ganz explizit keine Entscheidungslogik mehr haben. Wobei mir natürlich klar ist, daß es hier um ein Test-Setup geht, und ich aus purer Verzweiflung eine isValid()-Funktion erfunden habe, damit der Test nicht eine völlig sinfreie Veranstaltung ist, die nichts tatsächlich verifizieren kann. Das ist nämlich der »Haken« an diesem Design mit dem Builder: man muß sich darauf verlassen, daß sein Output korrekt ist — aber die Datenstrukturen, die er erzeugt, müssen auch irgendwo mal für sich konstruiert und verifiziert werden, wiewohl eine Überprüfung an diesen Daten gar nicht vorgesehen ist. Überprüfen ließe sich nur eine Ende-zu-Ende-Kette (ganz abstrakt gesagt, denn ich hab keine Ahnung, wie eine solche Kette funktionieren soll, geschweige denn, wie man sie zweifelsfrei prüft). Bei einem Language-Compiler kommt wenigstens Assembly raus, die man für sich verifizieren kann, weil sie für sich alleine auch klar spezifiziert ist. Aber bei unserem Design hier, bezieht sich das alles zirkulär auf sich selbst.... +

+ +
+ + + + + + + + + + + + + + + + + +
+ + + + + + + + +

+ Und zwar auf Basis der dahinter stehenden Laufzeit-Konfiguration (geöffnete Connections). +

+ +
+
+ + + +
+
+
+ + +
@@ -91375,9 +91475,6 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - @@ -91387,6 +91484,12 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + @@ -91538,8 +91641,17 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + + + + + + + + + + @@ -91726,9 +91838,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + - + @@ -91737,13 +91849,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + - + @@ -91754,11 +91866,11 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - + + - - + + @@ -92131,7 +92243,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + @@ -92143,7 +92255,11 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + + + + + @@ -98698,13 +98814,14 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - + + + - + + @@ -99636,7 +99753,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + @@ -111004,11 +111121,11 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - - + + - + @@ -111025,6 +111142,9 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) + + + @@ -112868,7 +112988,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -113612,7 +113732,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -115398,7 +115518,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -115467,7 +115587,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -116334,6 +116454,10 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) + + + + @@ -116473,7 +116597,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -116482,6 +116606,13 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)

+ + + + + + + @@ -116489,6 +116620,9 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) + + + @@ -116801,11 +116935,11 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + - - + + @@ -116824,7 +116958,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -117596,7 +117730,10 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + + + + @@ -117606,7 +117743,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)

- + @@ -117644,7 +117781,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
- + + @@ -117656,7 +117794,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -117679,34 +117817,34 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + - - + + - + - + - + - - - + + + - - - + + + @@ -118078,7 +118216,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -123875,15 +124013,15 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + - + - + @@ -123938,7 +124076,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
- + @@ -123963,7 +124101,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -124002,7 +124140,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -124024,6 +124162,10 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) + + + + @@ -124078,9 +124220,9 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - - - + + + @@ -124101,20 +124243,27 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) + + + - - - - + + + + + + + - - + + + - + @@ -124147,10 +124296,10 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - - + + - + @@ -124173,11 +124322,11 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - - + + - + @@ -124192,15 +124341,15 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + - + - + @@ -124251,7 +124400,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -124261,7 +124410,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -124277,15 +124426,15 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + - - - + + + @@ -124339,7 +124488,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -144008,6 +144157,10 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) + + + + @@ -144034,7 +144187,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -149831,7 +149984,9 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + + + @@ -150788,6 +150943,28 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) + + + + +

+ es erschien elegant, das als Funktor zu definieren — ist aber in der Verwendung nicht so klar und erzwingt eine unnötige weitere Indirektion. Konkret aber stört die komplett opaque Definition, weil man damit an die (sehr wohl vorhandene) Identität nicht mehr rankommt +

+ +
+ + + + + + + + + + + + + @@ -151911,7 +152088,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + + @@ -171879,7 +172057,7 @@ std::cout << tmpl.render({"what", "World"}) << s - + @@ -171930,7 +172108,7 @@ std::cout << tmpl.render({"what", "World"}) << s

- Einschränkung: ausgepräfte Tendenz zum down-Scaling + Einschränkung: ausgeprägte Tendenz zum down-Scaling

@@ -172988,13 +173166,13 @@ std::cout << tmpl.render({"what", "World"}) << s - + - - + + - + @@ -205459,8 +205637,8 @@ runner.run(test_suite())
- - + +