diff --git a/src/steam/engine/buffer-proxy-provider.hpp b/src/steam/engine/buffer-proxy-provider.hpp index e74877c1b..4b724f242 100644 --- a/src/steam/engine/buffer-proxy-provider.hpp +++ b/src/steam/engine/buffer-proxy-provider.hpp @@ -15,7 +15,7 @@ ** Adapter to expose a given memory block through a BuffHandle. ** This allows to integrate a specific data access (e.g. related to input / output) ** with the buffer lifecycle protocol as defined by BufferProvider. - ** @see state.hpp + ** @todo BROKEN as of 12/2024 //////////////////////////////////////////////////////////////////////////////TICKET #1387 : can not properly compose BufferProvider ** @see output-slot.hpp */ @@ -54,21 +54,64 @@ namespace engine { * @todo WIP-WIP 12/2024 this is a design sketch to explore extension capabilities of BufferProvider */ class BufferProxyProvider - : util::MoveOnly + : util::NonCopyable { - std::function listener_; + using Listener = std::function; + + class ForwardingBufferProvider + : public BufferProvider + { + Listener listener_; + + /* === BufferProvider API === */ + + uint + prepareBuffers (uint, HashVal) override + { + NOTREACHED ("this part of the API should not be used"); + return 1; // can not sensibly do anything for "pre-allocation", + } // other than telling the caller that we only "have one buffer to provide" + + BuffHandle + provideLockedBuffer (HashVal typeID) override + { + /////////////////////////////////////////////////////////////////////////////////////TICKET #1387 : BufferProvider default impl. is lacking means to compose and delegate +// return buildHandle (typeID, asBuffer(newBlock.accessMemory()), &newBlock); + } + + void + mark_emitted (HashVal, LocalTag const&) override + { + + } + + void + detachBuffer (HashVal, LocalTag const&, Buff&) override + { + + } + public: + ForwardingBufferProvider (Listener listener) + : BufferProvider{"BufferProxyProvider"} + , listener_{std::move (listener)} + { } + }; + + ForwardingBufferProvider passThroughProvider_; + public: template> BufferProxyProvider (LIS&& listener) - : listener_{std::forward (listener)} + : passThroughProvider_{std::forward (listener)} { } template BuffHandle lockBuffer (TAR& dataBlock) { + //////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1387 : impossible due to inner contradictions in BufferProvider and OutputSlot UNIMPLEMENTED ("setup type handler and then create a locked BuffHandle"); } diff --git a/tests/core/steam/engine/buffer-proxy-provider-test.cpp b/tests/core/steam/engine/buffer-proxy-provider-test.cpp index 6ecc4b3b9..4a0635bec 100644 --- a/tests/core/steam/engine/buffer-proxy-provider-test.cpp +++ b/tests/core/steam/engine/buffer-proxy-provider-test.cpp @@ -32,11 +32,11 @@ namespace test { /***************************************************************//** - * @test verify the OutputSlot interface and base implementation - * by performing full data exchange cycle. This is a - * kind of "dry run" for documentation purposes, - * both the actual OutputSlot implementation - * as the client using this slot are Mocks. + * @test verify the design of OutputSlot and BufferProvider by + * implementing a delegating BufferProvider to expose + * output data buffers provided from _some implementation._ + * @todo WIP-WIP 12/2024 this turned out to be impossible, + * due to inconsistencies in the default implementation. /////////////////////////////////////////////TICKET #1387 : need to consolidate BufferProvider default implementation */ class OutputProxyProvider_test : public Test { @@ -60,7 +60,7 @@ namespace test { TestFrame dataBlock (frameNr); CHECK ( dataBlock.isPristine()); - BuffHandle handle = proxPro.lockBuffer (dataBlock); + BuffHandle handle = proxPro.lockBuffer (dataBlock); ///////////////////////////////////////////////TICKET #1387 : unable to implement this // Now a »client« can do awful things to the buffer... CHECK (handle.isValid()); diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 6ab98ebf3..10d78b996 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -28459,9 +28459,7 @@ - - - +

aber es bleibt bei diesem Prinzip. @@ -29130,9 +29128,7 @@ - - - +

...weil man stets noch einen Layer darübersetzt? @@ -29691,9 +29687,7 @@ - - - +

|o| cH(line=0) += (14,14) @@ -30878,9 +30872,7 @@ - - - +

nicht alles wird gezeichnet @@ -30962,9 +30954,7 @@ - - - +

manchmal ist die alte Lösung besser @@ -31985,9 +31975,7 @@ - - - +

TiddlyWiki + doc/technical/stage/style/Timeline.txt @@ -32430,9 +32418,7 @@ - - - +

und mehrfach gekapselt. @@ -33328,9 +33314,7 @@ - - - +

tatsächlich ist es dann ein Sub-Interface: der CanvasHook. Und dieser @@ -88166,6 +88150,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + @@ -94715,8 +94703,34 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - + + + + + +

    +
  • + DataSink liefert ein BuffHandle, hat dann aber eine eigne Methode DataSink::emit() +
  • +
  • + die BuffHandle::emit()-Methode ist nicht richtig integriert... +
  • +
  • + deshalb kann derzeit (12/2024) der Render-Node-Code nicht korrekt mit Output-Buffern umgehen! +
  • +
  • + Grund ist zu enge Verkopplung mit der Default-Implementierung. Siehe #1387 +
  • +
+ +
+ + +
+ + + + @@ -94796,8 +94810,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - + + @@ -95165,7 +95179,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + + @@ -95190,6 +95205,24 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + + + + + + + + + + + + +
@@ -97845,6 +97878,16 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + + + + + @@ -97870,7 +97913,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + @@ -97878,8 +97921,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
brauche also nur noch ein BuffHandle hier

- -
+ +
@@ -97905,8 +97948,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
das würde mir eigentlich gefallen ⟹ packe ich diesen Schritt JETZT?

- - + @@ -98039,8 +98081,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
Das könnte ggfs. sogar eine automatische Transformation sein, auf Basis des jetzt definierten Node-Modells; man würde dann eine DAG ⟼ Tree -Transformation machen und dann die jeweilge ausführbare Node über ein Lambda-Binding über eine Prototyp-Node erzeugen.

- - +
@@ -98057,11 +98098,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
alles andere würde eine Art Kollaboration oder Protokoll implizieren

- - +
- - + + @@ -98105,8 +98145,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
Deshalb möchte ich nun doch einmal aus-implementieren, was denn erforderlich wäre, einen frei-stehenden Buffer-Provider neu zu implementieren, welcher an einen dahinter liegenden OutputSlot delegiert....

- - + @@ -98149,8 +98188,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
...und zwar schon längere Zeit bezüglich der Implementierung  des BufferProvider — das Konzept halte ich für sehr wichtig und auch gelngen. Aber immer wieder, wenn ich dann die Implementierung anschaue, dann springt man irgendwo zwischen dieser Default-Implementierung und dem TrackingHeapBlockProvider hin und her — und der ganze Code „riecht schief“, irgendwie (weiß aber nicht warum) ... Hinzu kommen Probleme (und, wie ich inzwischen weiß, tatsächliche Bugs) in der Typ-Registrierung, also BufferMetadata

- - +
@@ -98163,8 +98201,171 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - + + + + + + + +

+ ...es sind ja nur vier abstrakte Methoden zu implementieren, die die tatsächlichen Zustandsübergänge markieren +

+ +
+
+ + + + +

+ die Idee war damals wohl, daß die BufferProvider-Basis-Impl einen Sicherheits-Layer  bietet +

+ +
+ + + +

+ ...will sagen, die Implementierung muß sich bloß noch um ihr eigenes Memory-Management kümmern, aber nicht mehr darum, Typen und Lifecycle-Phasen zu tracken. Das erscheint mir nun durchaus ein plausibler Ansatz zu sein (hätte man bloß besser dokumentieren sollen) +

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

+ und das Ergebnis, das BuffHandle "ist es dann auch" +

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

+ allerdings war das Design nie etwas anderes als vorläufig +

+ + +
+ + + +

+ ...denn in all honesty, die Prämisse war und ist, daß man auf dieser Basis einen echten BufferProvider implementieren können dürfen sollte +

+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -100036,6 +100237,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + +
@@ -148844,6 +149049,10 @@ unsigned int ThreadIdAsInt = *static_cast<unsigned int*>(static_cast<vo + + + +