From f25ec2f5efb516c8452a0bb6ef6108164d3d9f1b Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sat, 10 Jun 2023 04:52:40 +0200 Subject: [PATCH] Dispatcher-Pipeline: switch JobTicket creation to use ExitNode directly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Up to now, a draft/mock implementation was used, relying on a »spec tuple«, which was fabricated by MockJobTicket. But with the introduction of NodeGraphAttachment, the MockSequence now generates a nested ExitNode structure, and thus the JobTicket will be created through the "real" ctor, and no longer via MockJobTicket. Thus it is possible to skip this whole interspersed »spec tuple«, since ExitNode *is* already this aggregated / abstracted Spec --- src/steam/engine/job-ticket.hpp | 28 ++++- src/steam/fixture/segment.hpp | 36 +----- src/steam/fixture/segmentation.cpp | 5 +- src/steam/fixture/segmentation.hpp | 2 +- tests/core/steam/engine/mock-dispatcher.hpp | 49 +++------ tests/core/steam/engine/mock-support-test.cpp | 2 +- .../steam/fixture/fixture-segment-test.cpp | 3 +- wiki/thinkPad.ichthyo.mm | 104 ++++++++++++++++-- 8 files changed, 142 insertions(+), 87 deletions(-) diff --git a/src/steam/engine/job-ticket.hpp b/src/steam/engine/job-ticket.hpp index 37c5d3b80..c8f532da6 100644 --- a/src/steam/engine/job-ticket.hpp +++ b/src/steam/engine/job-ticket.hpp @@ -100,9 +100,9 @@ using lib::LUID; struct Prerequisite { Prerequisite* next{nullptr}; - JobTicket& descriptor; + JobTicket const& descriptor; - Prerequisite (JobTicket& ticket) + Prerequisite (JobTicket const& ticket) : descriptor{ticket} { } }; @@ -131,6 +131,8 @@ using lib::LUID; template static LinkedElements buildProvisionSpec (IT); + static LinkedElements buildProvisionSpec (ExitNode const&); + private: JobTicket() { } ///< @internal as NIL marker, a JobTicket can be empty @@ -141,13 +143,16 @@ using lib::LUID; { } public: - class ExplorationState; - friend class ExplorationState; + JobTicket (ExitNode const& exitNode) + : provision_{buildProvisionSpec (exitNode)} + { } static const JobTicket NOP; + class ExplorationState; + friend class ExplorationState; ExplorationState startExploration() const; ////////////////////////////TICKET #1276 : likely to become obsolete ExplorationState discoverPrerequisites (uint channelNr =0) const; ////////////////////////////TICKET #1276 : likely to become obsolete @@ -250,7 +255,7 @@ using lib::LUID; } - JobTicket* + JobTicket const * operator->() const { REQUIRE (!empty() && toExplore_.top().isValid()); @@ -331,6 +336,19 @@ using lib::LUID; ENSURE (not isnil (provisionSpec)); return provisionSpec; } + inline LinkedElements + JobTicket::buildProvisionSpec (ExitNode const& exitNode) + { + REQUIRE (not isnil (exitNode)); // has valid functor + LinkedElements provisionSpec; + HashVal invoSeed = exitNode.getPipelineIdentity(); + JobFunctor& func = exitNode.getInvocationFunctor(); + auto& provision = provisionSpec.emplace (func, exitNode, invoSeed); + for (ExitNode const& preNode: exitNode.getPrerequisites()) + provision.requirements.emplace(preNode); /////////////////////////////////////////////TICKET #1292 : need to pass in Allocator as argument + //////////////////////////////////////////////////////////////////////OOO : where to ALLOCATE the prerequisite JobTickets ??!! + return provisionSpec; + } diff --git a/src/steam/fixture/segment.hpp b/src/steam/fixture/segment.hpp index 2c6dc51f2..15a784db2 100644 --- a/src/steam/fixture/segment.hpp +++ b/src/steam/fixture/segment.hpp @@ -68,7 +68,7 @@ namespace fixture { class Segment { using TicketAlloc = std::deque; - using PortTable = std::deque>; + using PortTable = std::deque>; protected: @@ -134,36 +134,6 @@ namespace fixture { private: - /** @internal Generate sequence of prerequisite JobTicket */ - auto - assemblePrerequisites (ExitNode const& exitNode) - { - return lib::transformIterator (exitNode.getPrerequisites() - ,[this](ExitNode const& prereq) -> engine::JobTicket& - { - tickets_.emplace_back( - assembleTicketSpec (prereq)); - return tickets_.back(); - }); - } - - - /** @internal Traverse ExitNode structure and prepare JobTicket */ - auto - assembleTicketSpec (ExitNode const& exitNode) - { - REQUIRE (not isnil (exitNode)); // has valid functor - using vault::engine::JobFunctor; - using Prereqs = decltype(assemblePrerequisites (exitNode)); - using SpecTuple = std::tuple; - return lib::singleValIterator( /////////////////////////////////////////TICKET #1297 : multiplicity per channel will be removed here - SpecTuple(exitNode - ,exitNode.getPipelineIdentity() - ,exitNode.getInvocationFunctor() - ,assemblePrerequisites (exitNode) - )); - } - void generateTickets_onDemand (size_t portNr) { @@ -172,8 +142,8 @@ namespace fixture { portTab_.emplace_back (engine::JobTicket::NOP); // disable this slot else {// Ticket was not generated yet... - tickets_.emplace_back (assembleTicketSpec (exitNode[portNr])); - portTab_.emplace_back (tickets_.back()); // ref to new ticket ‣ slot + tickets_.emplace_back (exitNode[portNr]); + portTab_.emplace_back (tickets_.back()); // ref to new ticket ‣ slot } } }; diff --git a/src/steam/fixture/segmentation.cpp b/src/steam/fixture/segmentation.cpp index 0c54202c0..071e51b3c 100644 --- a/src/steam/fixture/segmentation.cpp +++ b/src/steam/fixture/segmentation.cpp @@ -29,7 +29,6 @@ #include "lib/error.hpp" #include "steam/fixture/segmentation.hpp" -//#include "steam/mobject/builder/fixture-change-detector.hpp" ///////////TODO #include "lib/time/timevalue.hpp" #include "lib/split-splice.hpp" @@ -75,14 +74,14 @@ namespace fixture { * @see SplitSplice_test */ Segment const& - Segmentation::splitSplice (OptTime start, OptTime after, const engine::JobTicket* jobTicket) + Segmentation::splitSplice (OptTime start, OptTime after, engine::ExitNodes&& modelLink) { ASSERT (!start or !after or start != after); using Iter = typename list::iterator; auto getStart = [](Iter elm) -> Time { return elm->start(); }; auto getAfter = [](Iter elm) -> Time { return elm->after(); }; - auto createSeg= [&](Iter pos, Time start, Time after) -> Iter { return segments_.emplace (pos, TimeSpan{start, after}, jobTicket); }; + auto createSeg= [&](Iter pos, Time start, Time after) -> Iter { return segments_.emplace (pos, TimeSpan{start, after}, move(modelLink)); }; auto emptySeg = [&](Iter pos, Time start, Time after) -> Iter { return segments_.emplace (pos, TimeSpan{start, after}); }; auto cloneSeg = [&](Iter pos, Time start, Time after, Iter src) -> Iter { return segments_.emplace (pos, *src, TimeSpan{start, after}); }; auto discard = [&](Iter pos, Iter after) -> Iter { return segments_.erase (pos,after); }; diff --git a/src/steam/fixture/segmentation.hpp b/src/steam/fixture/segmentation.hpp index de71102e5..e09f9406d 100644 --- a/src/steam/fixture/segmentation.hpp +++ b/src/steam/fixture/segmentation.hpp @@ -121,7 +121,7 @@ namespace fixture { /** rework the existing Segmentation to include a new Segment as specified */ Segment const& - splitSplice (OptTime start, OptTime after, const engine::JobTicket* =nullptr); + splitSplice (OptTime start, OptTime after, engine::ExitNodes&& modelLink =ExitNodes{}); }; diff --git a/tests/core/steam/engine/mock-dispatcher.hpp b/tests/core/steam/engine/mock-dispatcher.hpp index 1878ff565..2f5c02f67 100644 --- a/tests/core/steam/engine/mock-dispatcher.hpp +++ b/tests/core/steam/engine/mock-dispatcher.hpp @@ -93,22 +93,12 @@ namespace test { /* ===== specify a mock JobTicket setup for tests ===== */ - template - inline auto - defineSpec (HashVal seed, IT&& prereq) - { - using SpecTuple = std::tuple; - return lib::singleValIterator( /////////////////////////////////////////////TICKET #1297 : multiplicity per channel will be removed here - SpecTuple(ExitNode::NIL - ,DummyJob::getFunctor() - , seed - , std::forward (prereq))); - } - - inline auto + inline ExitNode defineSimpleSpec (HashVal seed =0) { - return defineSpec (seed, lib::nilIterator()); + return ExitNode{seed + ,ExitNodes{} + ,& DummyJob::getFunctor()}; } }//(End)internal test helpers.... @@ -140,10 +130,10 @@ namespace test { : JobTicket{defineSimpleSpec (seed)} { } - template - MockJobTicket (HashVal seed, IT&& prereq) - : JobTicket{defineSpec (seed, std::forward (prereq))} - { } +// template +// MockJobTicket (HashVal seed, IT&& prereq) +// : JobTicket{defineSpec (seed, std::forward (prereq))} +// { } /* ===== Diagnostics ===== */ @@ -191,11 +181,11 @@ namespace test { { for (auto& spec : specs) { - JobTicket& newTicket = buildTicketFromSpec (spec); - auto start = spec.retrieveAttribute