Scheduler-test: a helper for one-time operations
Invent a special JobFunctor... - can be created / bound from a λ - self-manages its storage on the heap - can be invoked once, then discards itself Intention is to pass such one-time actions to the Scheduler to cause some ad-hoc transitions tied to curren circumstances; a notable example will be the callback after load-test completion.
This commit is contained in:
parent
030e9aa8a2
commit
7eca3ffe42
8 changed files with 485 additions and 20 deletions
|
|
@ -82,9 +82,15 @@ namespace lib {
|
||||||
* Typically this is followed by activating
|
* Typically this is followed by activating
|
||||||
* the handle by the managing service.
|
* the handle by the managing service.
|
||||||
*/
|
*/
|
||||||
Handle ( )
|
Handle() = default;
|
||||||
: smPtr_()
|
|
||||||
{ }
|
/** directly establish handle from an implementation,
|
||||||
|
* which typically way just heap allocated beforehand.
|
||||||
|
*/
|
||||||
|
explicit
|
||||||
|
Handle (IMP* imp)
|
||||||
|
: smPtr_{imp}
|
||||||
|
{ }
|
||||||
|
|
||||||
Handle (Handle const& r) = default;
|
Handle (Handle const& r) = default;
|
||||||
Handle (Handle && rr) = default;
|
Handle (Handle && rr) = default;
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ namespace test{
|
||||||
* i.e. to verify each created instance was properly destroyed after use.
|
* i.e. to verify each created instance was properly destroyed after use.
|
||||||
*/
|
*/
|
||||||
class Dummy
|
class Dummy
|
||||||
: util::NonCopyable
|
: util::MoveAssign
|
||||||
{
|
{
|
||||||
int val_;
|
int val_;
|
||||||
|
|
||||||
|
|
@ -57,6 +57,11 @@ namespace test{
|
||||||
static bool _throw_in_ctor;
|
static bool _throw_in_ctor;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
virtual ~Dummy() ///< can act as interface
|
||||||
|
{
|
||||||
|
checksum() -= val_;
|
||||||
|
}
|
||||||
|
|
||||||
Dummy ()
|
Dummy ()
|
||||||
: val_(1 + (rand() % 100000000))
|
: val_(1 + (rand() % 100000000))
|
||||||
{ init(); }
|
{ init(); }
|
||||||
|
|
@ -65,14 +70,24 @@ namespace test{
|
||||||
: val_(v)
|
: val_(v)
|
||||||
{ init(); }
|
{ init(); }
|
||||||
|
|
||||||
virtual ~Dummy()
|
Dummy (Dummy && oDummy)
|
||||||
|
: Dummy(0)
|
||||||
{
|
{
|
||||||
checksum() -= val_;
|
swap (*this, oDummy);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual long
|
Dummy&
|
||||||
|
operator= (Dummy && oDummy)
|
||||||
|
{
|
||||||
|
if (&oDummy != this)
|
||||||
|
swap (*this, oDummy);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
acc (int i) ///< dummy API operation
|
|
||||||
|
/** a dummy API operation */
|
||||||
|
virtual long
|
||||||
|
acc (int i)
|
||||||
{
|
{
|
||||||
return val_+i;
|
return val_+i;
|
||||||
}
|
}
|
||||||
|
|
@ -93,7 +108,7 @@ namespace test{
|
||||||
friend void
|
friend void
|
||||||
swap (Dummy& dum1, Dummy& dum2) ///< checksum neutral
|
swap (Dummy& dum1, Dummy& dum2) ///< checksum neutral
|
||||||
{
|
{
|
||||||
std::swap(dum1.val_, dum2.val_);
|
std::swap (dum1.val_, dum2.val_);
|
||||||
}
|
}
|
||||||
|
|
||||||
static long&
|
static long&
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ namespace gear {
|
||||||
JobKind
|
JobKind
|
||||||
getJobKind() const
|
getJobKind() const
|
||||||
{
|
{
|
||||||
return TEST_JOB;
|
return META_JOB;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
|
|
|
||||||
197
src/vault/gear/special-job-fun.hpp
Normal file
197
src/vault/gear/special-job-fun.hpp
Normal file
|
|
@ -0,0 +1,197 @@
|
||||||
|
/*
|
||||||
|
SPECIAL-JOB-FUN.hpp - a one-time render job to do something special
|
||||||
|
|
||||||
|
Copyright (C) Lumiera.org
|
||||||
|
2023, Hermann Vosseler <Ichthyostega@web.de>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of
|
||||||
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @file special-job-fun.hpp
|
||||||
|
** A configurable one-time job to invoke some _special_ function.
|
||||||
|
** The actual operation is configured as λ-function and the instance
|
||||||
|
** manages itself into heap storage and automatically destroys itself
|
||||||
|
** after the predetermined invocation. The intended usage is to supply
|
||||||
|
** a specifically wired one-time »fire-and-forget« action to the Scheduler
|
||||||
|
** as answer so some special processing situation. The front-end handle
|
||||||
|
** SpecialJobFun itself is disposable and only serves as builder; even
|
||||||
|
** after the front-end is gone, the actual JobFunctor will maintain
|
||||||
|
** one self-reference — unless it is invoked...
|
||||||
|
** @warning obviously this is a dangerous tool; the user *must ensure*
|
||||||
|
** that it is at most *invoked once* — after that, the instance
|
||||||
|
** will self-destroy, leaving a dangling reference.
|
||||||
|
** @todo WIP 12/2023 invented to help with Scheduler load testing as
|
||||||
|
** part of the »Playback Vertical Slice« — this idea however
|
||||||
|
** might be generally useful to handle one-time adjustments
|
||||||
|
** from within a play- or planning process.
|
||||||
|
** @see SpecialJobFun_test
|
||||||
|
** @see TestChainLoad::ScheduleCtx::continuation() usage example
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef VAULT_GEAR_SPECIAL_JOB_FUN_H
|
||||||
|
#define VAULT_GEAR_SPECIAL_JOB_FUN_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "lib/handle.hpp"
|
||||||
|
#include "vault/gear/nop-job-functor.hpp"
|
||||||
|
#include "lib/time/timevalue.hpp"
|
||||||
|
#include "lib/format-string.hpp"
|
||||||
|
#include "lib/format-obj.hpp"
|
||||||
|
#include "lib/meta/util.hpp"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <memory>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
|
||||||
|
namespace vault{
|
||||||
|
namespace gear {
|
||||||
|
namespace err = lumiera::error;
|
||||||
|
|
||||||
|
using util::_Fmt;
|
||||||
|
using lib::meta::disable_if_self;
|
||||||
|
using std::move;
|
||||||
|
using std::forward;
|
||||||
|
using std::make_shared;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface: JobFunctor configured to invoke a function a limited number of times.
|
||||||
|
*/
|
||||||
|
class SpecialFunPrototype
|
||||||
|
: public NopJobFunctor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual uint remainingInvocations() const =0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Front-end to configure a special job functor for one-time use.
|
||||||
|
*/
|
||||||
|
class SpecialJobFun
|
||||||
|
: protected lib::Handle<SpecialFunPrototype>
|
||||||
|
{
|
||||||
|
using _Handle = lib::Handle<SpecialFunPrototype>;
|
||||||
|
|
||||||
|
template<class FUN>
|
||||||
|
class SpecialExecutor
|
||||||
|
: SpecialFunPrototype
|
||||||
|
{
|
||||||
|
FUN fun_;
|
||||||
|
uint lives_{1};
|
||||||
|
_Handle selfHook_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit
|
||||||
|
SpecialExecutor (FUN theFun)
|
||||||
|
: fun_{move (theFun)}
|
||||||
|
, selfHook_(this)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
/** @internal allow the front-end to attach
|
||||||
|
* itself to the self-managing hook */
|
||||||
|
friend _Handle&
|
||||||
|
selfAttached (SpecialExecutor* instance)
|
||||||
|
{
|
||||||
|
REQUIRE (instance->selfHook_);
|
||||||
|
REQUIRE (instance->remainingInvocations());
|
||||||
|
// expose the self-managing handle
|
||||||
|
return instance->selfHook_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint
|
||||||
|
remainingInvocations() const
|
||||||
|
{
|
||||||
|
return lives_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* === JobFunctor Interface === */
|
||||||
|
|
||||||
|
void
|
||||||
|
invokeJobOperation (JobParameter param) override
|
||||||
|
{
|
||||||
|
if (not remainingInvocations())
|
||||||
|
throw err::Logic{"invoking deceased SpecialJobFun"
|
||||||
|
,err::LUMIERA_ERROR_LIFECYCLE};
|
||||||
|
fun_(param);
|
||||||
|
|
||||||
|
if (not --lives_)
|
||||||
|
selfHook_.close();
|
||||||
|
} // Suicide.
|
||||||
|
|
||||||
|
std::string
|
||||||
|
diagnostic() const override
|
||||||
|
{
|
||||||
|
return _Fmt{"SpecialJob(%d)-%s"}
|
||||||
|
% lives_
|
||||||
|
% util::showHash(size_t(this), 2);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
SpecialJobFun() = default;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Establish a new SpecialJobFun variation
|
||||||
|
* directly by wrapping a given functor.
|
||||||
|
* The JobFunctor instance itself will be heap allocated.
|
||||||
|
* @warning while a direct reference to this JobFunctor can be
|
||||||
|
* obtained through conversion, this reference must not be
|
||||||
|
* used after invoking the job one single time; after that,
|
||||||
|
* this reference is dangling and using it further will
|
||||||
|
* lead to SEGFAULT or memory corruption.
|
||||||
|
*/
|
||||||
|
template<class FUN, typename =disable_if_self<FUN, SpecialJobFun>>
|
||||||
|
explicit
|
||||||
|
SpecialJobFun (FUN&& someFun)
|
||||||
|
: _Handle{selfAttached (new SpecialExecutor(forward<FUN> (someFun)))}
|
||||||
|
{ }
|
||||||
|
|
||||||
|
// standard copy operations acceptable
|
||||||
|
|
||||||
|
explicit
|
||||||
|
operator bool() const
|
||||||
|
{
|
||||||
|
return _Handle::isValid()
|
||||||
|
and 0 < _Handle::impl().remainingInvocations();
|
||||||
|
}
|
||||||
|
|
||||||
|
operator JobClosure&() const
|
||||||
|
{
|
||||||
|
REQUIRE (operator bool());
|
||||||
|
return _Handle::impl();
|
||||||
|
}
|
||||||
|
|
||||||
|
long
|
||||||
|
use_count() const
|
||||||
|
{
|
||||||
|
return _Handle::smPtr_.use_count();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}} // namespace vault::gear
|
||||||
|
#endif /*VAULT_GEAR_SPECIAL_JOB_FUN_H*/
|
||||||
|
|
@ -44,6 +44,12 @@ END
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TEST "Self-managed one-time Job" SpecialJobFun_test <<END
|
||||||
|
return: 0
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
PLANNED "Synthetic Load for Test" TestChainLoad_test <<END
|
PLANNED "Synthetic Load for Test" TestChainLoad_test <<END
|
||||||
return: 0
|
return: 0
|
||||||
END
|
END
|
||||||
|
|
|
||||||
|
|
@ -333,6 +333,12 @@ namespace test {
|
||||||
return "JobFun-"+string{mockOperation_};
|
return "JobFun-"+string{mockOperation_};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JobKind
|
||||||
|
getJobKind() const
|
||||||
|
{
|
||||||
|
return TEST_JOB;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MockJobFunctor (MockOp mockedJobOperation)
|
MockJobFunctor (MockOp mockedJobOperation)
|
||||||
: mockOperation_{move (mockedJobOperation)}
|
: mockOperation_{move (mockedJobOperation)}
|
||||||
|
|
|
||||||
191
tests/vault/gear/special-job-fun-test.cpp
Normal file
191
tests/vault/gear/special-job-fun-test.cpp
Normal file
|
|
@ -0,0 +1,191 @@
|
||||||
|
/*
|
||||||
|
SpecialJobFun(Test) - verify a disposable configurable job functor
|
||||||
|
|
||||||
|
Copyright (C) Lumiera.org
|
||||||
|
2023, Hermann Vosseler <Ichthyostega@web.de>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of
|
||||||
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
* *****************************************************/
|
||||||
|
|
||||||
|
/** @file special-job-fun-test.cpp
|
||||||
|
** unit test \ref SpecialJobFun_test
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "lib/test/run.hpp"
|
||||||
|
#include "lib/test/test-helper.hpp"
|
||||||
|
//#include "vault/real-clock.hpp"
|
||||||
|
//#include "lib/time/timevalue.hpp"
|
||||||
|
#include "vault/gear/special-job-fun.hpp"
|
||||||
|
#include "lib/format-cout.hpp" ////////////////////////////////////TODO Moo-oh
|
||||||
|
#include "lib/test/diagnostic-output.hpp"//////////////////////////TODO TOD-oh
|
||||||
|
#include "lib/test/testdummy.hpp"
|
||||||
|
//#include "lib/util.hpp"
|
||||||
|
|
||||||
|
//#include <array>
|
||||||
|
//#include <functional>
|
||||||
|
|
||||||
|
//using lib::time::Time;
|
||||||
|
//using lib::time::FSecs;
|
||||||
|
|
||||||
|
//using util::isnil;
|
||||||
|
//using util::isSameObject;
|
||||||
|
//using lib::test::randStr;
|
||||||
|
//using lib::test::randTime;
|
||||||
|
using lib::test::Dummy;
|
||||||
|
//using std::array;
|
||||||
|
|
||||||
|
|
||||||
|
namespace vault{
|
||||||
|
namespace gear {
|
||||||
|
namespace test {
|
||||||
|
|
||||||
|
namespace { // shorthands and parameters for test...
|
||||||
|
|
||||||
|
|
||||||
|
}//(End)test definitions
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************//**
|
||||||
|
* @test verify a self-managing one-time render job functor.
|
||||||
|
* @see TestChainLoad_test::usageExample
|
||||||
|
* @see TestChainLoad::ScheduleCtx::continuation()
|
||||||
|
* @see special-job-fun.hpp
|
||||||
|
*/
|
||||||
|
class SpecialJobFun_test : public Test
|
||||||
|
{
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
run (Arg)
|
||||||
|
{
|
||||||
|
simpleUsage();
|
||||||
|
verifyLifecycle();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** @test demonstrate simple usage by λ-binding
|
||||||
|
* @todo WIP 12/23 🔁 define ⟶ ✔ implement
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
simpleUsage()
|
||||||
|
{
|
||||||
|
bool hit{false}; // create directly from λ
|
||||||
|
SpecialJobFun specialFun{[&](JobParameter){ hit=true; }};
|
||||||
|
|
||||||
|
CHECK (specialFun);
|
||||||
|
Job funJob{specialFun
|
||||||
|
,InvocationInstanceID()
|
||||||
|
,Time::ANYTIME
|
||||||
|
};
|
||||||
|
|
||||||
|
funJob.triggerJob();
|
||||||
|
CHECK (hit);
|
||||||
|
CHECK (not specialFun);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @test verify storage and lifecycle management
|
||||||
|
* - use a instance-tracking marker implanted into the functor
|
||||||
|
* - verify no memory is leaked and the tracker instance is deallocated
|
||||||
|
* - verify the single tracker instance indeed lives in the JobFunctor
|
||||||
|
* - investigate the usage count of the front-end handle
|
||||||
|
* - verify the front-end can be copied without impact on the JobFunctor
|
||||||
|
* - verify the heap allocated functor keeps itself alive
|
||||||
|
* even when the front-end handle is already gone.
|
||||||
|
* - verify the functor de-allocates itself after latst invocation
|
||||||
|
* @todo WIP 12/23 ✔ define ⟶ ✔ implement
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
verifyLifecycle()
|
||||||
|
{
|
||||||
|
CHECK (0 == Dummy::checksum());
|
||||||
|
{ // Note: ▽▽▽ tracker in λ-closure
|
||||||
|
SpecialJobFun funTrack{[tracker=Dummy(23)]
|
||||||
|
(JobParameter param) mutable
|
||||||
|
{
|
||||||
|
int mark = param.invoKey.part.a;
|
||||||
|
tracker.setVal (mark);
|
||||||
|
}}; // △△△ invocation should alter checksum
|
||||||
|
|
||||||
|
// one Dummy instance was implanted
|
||||||
|
CHECK (23 == Dummy::checksum());
|
||||||
|
InvocationInstanceID hiddenMessage;
|
||||||
|
hiddenMessage.part.a = 55;
|
||||||
|
Job funJob{funTrack
|
||||||
|
,hiddenMessage
|
||||||
|
,Time::ANYTIME
|
||||||
|
};
|
||||||
|
|
||||||
|
CHECK (23 == Dummy::checksum());
|
||||||
|
funJob.triggerJob();
|
||||||
|
CHECK (55 == Dummy::checksum()); // the `funJob` front-end handle still keeps it alive
|
||||||
|
} // but when this front-end goes out of scope...
|
||||||
|
CHECK (0 == Dummy::checksum()); // the implanted tracker is also gone
|
||||||
|
|
||||||
|
{ // another investigation with the same technique...
|
||||||
|
auto trackingLambda = [tracker=Dummy(23)]
|
||||||
|
(JobParameter param) mutable
|
||||||
|
{
|
||||||
|
int mark = param.invoKey.part.a;
|
||||||
|
tracker.setVal (mark);
|
||||||
|
};
|
||||||
|
CHECK (23 == Dummy::checksum());
|
||||||
|
|
||||||
|
SpecialJobFun frontEnd{move(trackingLambda)}; // this time the λ is moved in..
|
||||||
|
CHECK (23 == Dummy::checksum()); // the embedded tracker was copied into the Functor in heap memory
|
||||||
|
CHECK (2 == frontEnd.use_count()); // Note: both the front-end and the Functor in heap hold a use-reference
|
||||||
|
|
||||||
|
auto otherHandle = frontEnd; // copy of front-end...
|
||||||
|
CHECK (3 == frontEnd.use_count()); // ...so there are three usages of the front-end handle now
|
||||||
|
CHECK (23 == Dummy::checksum()); // ...but only one tracker instance (in heap)
|
||||||
|
|
||||||
|
frontEnd = SpecialJobFun(); // re-assign one front-end handle with an empty instance
|
||||||
|
CHECK (0 == frontEnd.use_count()); // thus `frontEnd` is no longer attached to the active instance
|
||||||
|
CHECK (2 == otherHandle.use_count()); // but the other copy still is
|
||||||
|
CHECK (not frontEnd);
|
||||||
|
CHECK (otherHandle);
|
||||||
|
|
||||||
|
InvocationInstanceID hiddenMessage;
|
||||||
|
hiddenMessage.part.a = 55;
|
||||||
|
Job funJob{otherHandle // Note: don't pass the handle here, rather a JobFunctor& is extracted
|
||||||
|
,hiddenMessage
|
||||||
|
,Time::ANYTIME
|
||||||
|
};
|
||||||
|
|
||||||
|
CHECK (2 == otherHandle.use_count());
|
||||||
|
CHECK (23 == Dummy::checksum());
|
||||||
|
|
||||||
|
otherHandle = SpecialJobFun(); // now kill even the last front-end handle we had
|
||||||
|
CHECK (0 == otherHandle.use_count()); // thus _we_ have no way to reach the Functor in heap
|
||||||
|
CHECK (23 == Dummy::checksum()); // yet it stays alive, since it was not invoked yet
|
||||||
|
|
||||||
|
funJob.triggerJob(); // after invocation, the Functor in heap memory self-destructs
|
||||||
|
CHECK (0 == Dummy::checksum()); // since it did hold the last reference
|
||||||
|
}
|
||||||
|
CHECK (0 == Dummy::checksum());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** Register this test class... */
|
||||||
|
LAUNCHER (SpecialJobFun_test, "unit engine");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}}} // namespace vault::gear::test
|
||||||
|
|
@ -101304,8 +101304,49 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
||||||
<font NAME="SansSerif" SIZE="8"/>
|
<font NAME="SansSerif" SIZE="8"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1701913043245" ID="ID_445438847" MODIFIED="1701913147737" TEXT="bessere Steuerung des Completion-Callback">
|
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1701913043245" ID="ID_445438847" MODIFIED="1701995114300" TEXT="bessere Steuerung des Completion-Callback">
|
||||||
<linktarget COLOR="#c62f45" DESTINATION="ID_445438847" ENDARROW="Default" ENDINCLINATION="-1207;75;" ID="Arrow_ID_1132943593" SOURCE="ID_1739832819" STARTARROW="None" STARTINCLINATION="-73;-483;"/>
|
<linktarget COLOR="#c62f45" DESTINATION="ID_445438847" ENDARROW="Default" ENDINCLINATION="-1207;75;" ID="Arrow_ID_1132943593" SOURCE="ID_1739832819" STARTARROW="None" STARTINCLINATION="-73;-483;"/>
|
||||||
|
<icon BUILTIN="pencil"/>
|
||||||
|
<node CREATED="1701995129106" ID="ID_1885461201" MODIFIED="1701995147012">
|
||||||
|
<richcontent TYPE="NODE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
soll <i>per Schedule </i>als Letztes laufen
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701995148607" ID="ID_1950736877" MODIFIED="1701995170924" TEXT="brauche dazu Hilfsmittel: λ-Job">
|
||||||
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1702004101716" ID="ID_908134373" MODIFIED="1702004108016" TEXT="SpecialJobFun....">
|
||||||
|
<icon BUILTIN="pencil"/>
|
||||||
|
<node COLOR="#338800" CREATED="1702004109424" ID="ID_1293442970" MODIFIED="1702004221556" TEXT="ist eine JobFunctor-Instanz">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1702004121881" ID="ID_1678320281" MODIFIED="1702004221556" TEXT="bettet das gegebene λ ein">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1702004142348" ID="ID_702114798" MODIFIED="1702004221556" TEXT="hält sich selber zirkulär per smart-ptr am Leben">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1702004163960" ID="ID_289314383" MODIFIED="1702004221557" TEXT="sägt sich selber ab — nach erfolgtem Aufruf">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1702004207926" ID="ID_82682167" MODIFIED="1702004221557" TEXT="front-End-Handle : als Builder und Accessor">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1702004224915" ID="ID_1713843451" MODIFIED="1702004237147" TEXT="SpecialJobFun_test">
|
||||||
|
<icon BUILTIN="pencil"/>
|
||||||
|
<node COLOR="#338800" CREATED="1702004230770" ID="ID_1088072058" MODIFIED="1702004234360" TEXT="simpleUsage">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1702008468565" ID="ID_1701934123" MODIFIED="1702008471652" TEXT="verifyLifecycle">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#338800" CREATED="1701814806243" ID="ID_1359675923" MODIFIED="1701823453699" TEXT="Job-Funktoren">
|
<node COLOR="#338800" CREATED="1701814806243" ID="ID_1359675923" MODIFIED="1701823453699" TEXT="Job-Funktoren">
|
||||||
|
|
@ -101389,15 +101430,16 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
||||||
<arrowlink COLOR="#bb1868" DESTINATION="ID_120274201" ENDARROW="Default" ENDINCLINATION="-730;116;" ID="Arrow_ID_573558112" STARTARROW="None" STARTINCLINATION="-428;0;"/>
|
<arrowlink COLOR="#bb1868" DESTINATION="ID_120274201" ENDARROW="Default" ENDINCLINATION="-730;116;" ID="Arrow_ID_573558112" STARTARROW="None" STARTINCLINATION="-428;0;"/>
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1701838598906" ID="ID_1235285916" MODIFIED="1701838619227" TEXT="bleibt hängen ⟶ Timeout">
|
<node COLOR="#435e98" CREATED="1701838598906" ID="ID_1235285916" MODIFIED="1701990865812" TEXT="bleibt hängen ⟶ Timeout">
|
||||||
<icon BUILTIN="broken-line"/>
|
<icon BUILTIN="broken-line"/>
|
||||||
<node CREATED="1701843677557" ID="ID_619867364" MODIFIED="1701879688239" TEXT="offensichtlicher Fehler: muß dem ersten Plan-Job natürlich einen Offset geben">
|
<node COLOR="#338800" CREATED="1701843677557" ID="ID_619867364" MODIFIED="1701990950803" TEXT="offensichtlicher Fehler: muß dem ersten Plan-Job natürlich einen Offset geben">
|
||||||
<arrowlink COLOR="#3c5b80" DESTINATION="ID_1631524816" ENDARROW="Default" ENDINCLINATION="84;-7;" ID="Arrow_ID_1725054435" STARTARROW="None" STARTINCLINATION="80;3;"/>
|
<arrowlink COLOR="#3c5b80" DESTINATION="ID_1631524816" ENDARROW="Default" ENDINCLINATION="84;-7;" ID="Arrow_ID_1725054435" STARTARROW="None" STARTINCLINATION="80;3;"/>
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
<node COLOR="#338800" CREATED="1701900943218" HGAP="39" ID="ID_1117609340" MODIFIED="1701900956080" TEXT="planningJob(calcNextLevel(0)-1)" VSHIFT="-1">
|
<node COLOR="#338800" CREATED="1701900943218" HGAP="39" ID="ID_1117609340" MODIFIED="1701900956080" TEXT="planningJob(calcNextLevel(0)-1)" VSHIFT="-1">
|
||||||
<icon BUILTIN="idea"/>
|
<icon BUILTIN="idea"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#435e98" CREATED="1701843700258" ID="ID_1562297081" MODIFIED="1701976295979" TEXT="aber dennoch sollte dann der Lauf irgendwann starten (dann halt 64ms später)">
|
<node COLOR="#435e98" CREATED="1701843700258" FOLDED="true" ID="ID_1562297081" MODIFIED="1701976295979" TEXT="aber dennoch sollte dann der Lauf irgendwann starten (dann halt 64ms später)">
|
||||||
<icon BUILTIN="messagebox_warning"/>
|
<icon BUILTIN="messagebox_warning"/>
|
||||||
<node CREATED="1701906561917" ID="ID_759675868" MODIFIED="1701906661639" TEXT="Situation: nur wenige Jobs zu Beginn — und die wedern sofort dispatched">
|
<node CREATED="1701906561917" ID="ID_759675868" MODIFIED="1701906661639" TEXT="Situation: nur wenige Jobs zu Beginn — und die wedern sofort dispatched">
|
||||||
<linktarget COLOR="#5c468c" DESTINATION="ID_759675868" ENDARROW="Default" ENDINCLINATION="-72;-107;" ID="Arrow_ID_845853929" SOURCE="ID_977051135" STARTARROW="None" STARTINCLINATION="424;27;"/>
|
<linktarget COLOR="#5c468c" DESTINATION="ID_759675868" ENDARROW="Default" ENDINCLINATION="-72;-107;" ID="Arrow_ID_845853929" SOURCE="ID_977051135" STARTARROW="None" STARTINCLINATION="424;27;"/>
|
||||||
|
|
@ -101428,7 +101470,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
||||||
<icon BUILTIN="ksmiletris"/>
|
<icon BUILTIN="ksmiletris"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1701900872050" ID="ID_693907147" MODIFIED="1701900908502" TEXT="Exception "Promise already satisfied"">
|
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1701900872050" FOLDED="true" ID="ID_693907147" MODIFIED="1701900908502" TEXT="Exception "Promise already satisfied"">
|
||||||
<icon BUILTIN="broken-line"/>
|
<icon BUILTIN="broken-line"/>
|
||||||
<node CREATED="1701900913850" ID="ID_1004033455" MODIFIED="1701900920193" TEXT="sichtbar nach dem ersten Bugfix"/>
|
<node CREATED="1701900913850" ID="ID_1004033455" MODIFIED="1701900920193" TEXT="sichtbar nach dem ersten Bugfix"/>
|
||||||
<node CREATED="1701900969591" ID="ID_1945329018" MODIFIED="1701900982346" TEXT="tritt auf unmittelbar nach dem Planen des 1.Chunk"/>
|
<node CREATED="1701900969591" ID="ID_1945329018" MODIFIED="1701900982346" TEXT="tritt auf unmittelbar nach dem Planen des 1.Chunk"/>
|
||||||
|
|
@ -101453,7 +101495,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1701879543468" ID="ID_1818772058" MODIFIED="1701879550999" TEXT="Beobachtung Scheduler-Gesamtverhalten">
|
<node COLOR="#435e98" CREATED="1701879543468" ID="ID_1818772058" MODIFIED="1701990872492" TEXT="Beobachtung Scheduler-Gesamtverhalten">
|
||||||
|
<icon BUILTIN="info"/>
|
||||||
<node COLOR="#338800" CREATED="1701879552131" ID="ID_1345942591" MODIFIED="1701879620762" TEXT="gemeinsame Time-Basis im DUMP-Log herstellen">
|
<node COLOR="#338800" CREATED="1701879552131" ID="ID_1345942591" MODIFIED="1701879620762" TEXT="gemeinsame Time-Basis im DUMP-Log herstellen">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head/>
|
<head/>
|
||||||
|
|
@ -101479,14 +101522,15 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
||||||
</p>
|
</p>
|
||||||
</body>
|
</body>
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
<arrowlink COLOR="#df2e4b" DESTINATION="ID_1285649422" ENDARROW="Default" ENDINCLINATION="67;0;" ID="Arrow_ID_1426953607" STARTARROW="None" STARTINCLINATION="-2;38;"/>
|
<arrowlink COLOR="#df2e4b" DESTINATION="ID_1285649422" ENDARROW="Default" ENDINCLINATION="53;2;" ID="Arrow_ID_1426953607" STARTARROW="None" STARTINCLINATION="2;30;"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1701879839628" ID="ID_576613689" MODIFIED="1701879852847" TEXT="wir bekommen hier 16 Level -> 16ms"/>
|
<node CREATED="1701879839628" ID="ID_576613689" MODIFIED="1701879852847" TEXT="wir bekommen hier 16 Level -> 16ms"/>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1701881012424" ID="ID_1173195975" MODIFIED="1701881019723" TEXT="einige Jobs laufen nicht">
|
<node COLOR="#435e98" CREATED="1701881012424" ID="ID_1173195975" MODIFIED="1701990880813" TEXT="einige Jobs laufen nicht">
|
||||||
<node CREATED="1701881022535" ID="ID_1285649422" MODIFIED="1701881051273" TEXT="Vermutung: die werden durch fehlende Dependencies geblockt">
|
<icon BUILTIN="messagebox_warning"/>
|
||||||
<linktarget COLOR="#df2e4b" DESTINATION="ID_1285649422" ENDARROW="Default" ENDINCLINATION="67;0;" ID="Arrow_ID_1426953607" SOURCE="ID_1372474269" STARTARROW="None" STARTINCLINATION="-2;38;"/>
|
<node CREATED="1701881022535" ID="ID_1285649422" MODIFIED="1701990931283" TEXT="Vermutung: die werden durch fehlende Dependencies geblockt">
|
||||||
|
<linktarget COLOR="#df2e4b" DESTINATION="ID_1285649422" ENDARROW="Default" ENDINCLINATION="53;2;" ID="Arrow_ID_1426953607" SOURCE="ID_1372474269" STARTARROW="None" STARTINCLINATION="2;30;"/>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1701881068248" ID="ID_1827795881" MODIFIED="1701881077251" TEXT="in einem Einzelfall bestätigt">
|
<node CREATED="1701881068248" ID="ID_1827795881" MODIFIED="1701881077251" TEXT="in einem Einzelfall bestätigt">
|
||||||
<node CREATED="1701881078359" ID="ID_1962795672" MODIFIED="1701882948416" TEXT="der Nachfolger wird gescheduled, nachdem der Vorläufer bereits aktiviert wurde">
|
<node CREATED="1701881078359" ID="ID_1962795672" MODIFIED="1701882948416" TEXT="der Nachfolger wird gescheduled, nachdem der Vorläufer bereits aktiviert wurde">
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue