BufferProvider: integrate the new race protection feature
This makes the test case pass, validating the theory. Each `AllocReceiver` now integrates a `lib::LiveMark` instance, and the callbacks are dispatched using the corresponding `LiveMark::SafeHandle`, so that it is no longer possible to dispatch allocation messages to a defunct receiver. Furthermore, the `LiveMark` is explicitly disengaged prior to unwinding a local pool, so that no further pending requests can be handled ans dispatched concurrently. The local pool sends back all the remaining allocations via async queue to the `EngineBufferManager` Not that such a shutdown can be triggered any time, since an exception or failure might cause a worker thread to unwind, thereby destroying the thread-local `LocalMemPool` without further notice.
This commit is contained in:
parent
cd7581ba76
commit
e32eec38dd
6 changed files with 188 additions and 91 deletions
|
|
@ -33,13 +33,10 @@
|
||||||
#include "lib/error.hpp"
|
#include "lib/error.hpp"
|
||||||
#include "lib/util-quant.hpp"
|
#include "lib/util-quant.hpp"
|
||||||
#include "lib/allocator-handle.hpp"
|
#include "lib/allocator-handle.hpp"
|
||||||
//#include "lib/hash-value.h"
|
|
||||||
#include "vault/mem/buffhandle.hpp"
|
#include "vault/mem/buffhandle.hpp"
|
||||||
#include "vault/mem/engine-buffer-manager.hpp"
|
#include "vault/mem/engine-buffer-manager.hpp"
|
||||||
#include "vault/mem/engine-buffer-allocator.hpp"
|
#include "vault/mem/engine-buffer-allocator.hpp"
|
||||||
//#include "vault/mem/buffer-local-tag.hpp"
|
|
||||||
#include "lib/nocopy.hpp"
|
#include "lib/nocopy.hpp"
|
||||||
//#include "lib/util.hpp"
|
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
@ -47,23 +44,11 @@
|
||||||
|
|
||||||
namespace vault{
|
namespace vault{
|
||||||
namespace mem {
|
namespace mem {
|
||||||
|
|
||||||
// using lib::HashVal;
|
|
||||||
// using util::unConst;
|
|
||||||
|
|
||||||
namespace err = lumiera::error;
|
namespace err = lumiera::error;
|
||||||
|
|
||||||
using std::byte;
|
using std::byte;
|
||||||
|
|
||||||
|
|
||||||
namespace { // config and internal helpers...
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
using BufferAllocator = HeapBufferAllocator;
|
using BufferAllocator = HeapBufferAllocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -84,9 +69,10 @@ namespace mem {
|
||||||
inQueue_ .consume_all ([this](Alloc alloc){ doRedeemAllocation (alloc); });
|
inQueue_ .consume_all ([this](Alloc alloc){ doRedeemAllocation (alloc); });
|
||||||
requestQueue_.consume_all ([this](AllocRequest request)
|
requestQueue_.consume_all ([this](AllocRequest request)
|
||||||
{
|
{
|
||||||
REQUIRE (request.receiver);
|
if (not request.receiver) return;
|
||||||
Alloc alloc = doPerformAllocation (request.sizRequest);
|
Alloc alloc = doPerformAllocation (request.sizRequest);
|
||||||
ENSURE (not alloc.empty());
|
ENSURE (not alloc.empty());
|
||||||
|
if (request.receiver)
|
||||||
request.receiver->supply (alloc);
|
request.receiver->supply (alloc);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,23 +40,16 @@
|
||||||
#define VAULT_MEM_ENGINE_BUFFR_MANAGA_H
|
#define VAULT_MEM_ENGINE_BUFFR_MANAGA_H
|
||||||
|
|
||||||
|
|
||||||
//#include "lib/hash-value.h"
|
|
||||||
#include "vault/mem/buffhandle.hpp"
|
#include "vault/mem/buffhandle.hpp"
|
||||||
//#include "vault/mem/type-handler.hpp"
|
#include "lib/live-mark.hpp"
|
||||||
//#include "vault/mem/buffer-local-tag.hpp"
|
|
||||||
#include "lib/nocopy.hpp"
|
#include "lib/nocopy.hpp"
|
||||||
#include "lib/sync.hpp"
|
#include "lib/sync.hpp"
|
||||||
//#include "lib/util.hpp"
|
|
||||||
|
|
||||||
#include <boost/lockfree/queue.hpp>
|
#include <boost/lockfree/queue.hpp>
|
||||||
|
|
||||||
|
|
||||||
namespace vault{
|
namespace vault{
|
||||||
namespace mem {
|
namespace mem {
|
||||||
|
|
||||||
// using lib::HashVal;
|
|
||||||
// using util::unConst;
|
|
||||||
|
|
||||||
namespace err = lumiera::error;
|
namespace err = lumiera::error;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -98,6 +91,8 @@ namespace mem {
|
||||||
: util::NonCopyable
|
: util::NonCopyable
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
lib::LiveMark mark_{*this};
|
||||||
|
|
||||||
using InQueue = boost::lockfree::queue<Alloc>;
|
using InQueue = boost::lockfree::queue<Alloc>;
|
||||||
InQueue inQueue_;
|
InQueue inQueue_;
|
||||||
|
|
||||||
|
|
@ -116,6 +111,21 @@ namespace mem {
|
||||||
inQueue_.push (alloc);
|
inQueue_.push (alloc);
|
||||||
alloc.discard();
|
alloc.discard();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** allow safe access through a smart-handle,
|
||||||
|
* to prevent interaction with an deceased partner */
|
||||||
|
auto
|
||||||
|
getSafeHandle()
|
||||||
|
{
|
||||||
|
return mark_.makeHandle (*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** accessor to allow verification of liveness state */
|
||||||
|
lib::LiveMark const&
|
||||||
|
getLiveMark() const
|
||||||
|
{
|
||||||
|
return mark_;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -130,7 +140,8 @@ namespace mem {
|
||||||
{
|
{
|
||||||
struct AllocRequest
|
struct AllocRequest
|
||||||
{
|
{
|
||||||
AllocReceiver* receiver;
|
using Handle = lib::LiveMark::SafeHandle<AllocReceiver>;
|
||||||
|
Handle receiver;
|
||||||
size_t sizRequest;
|
size_t sizRequest;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -196,7 +207,7 @@ namespace mem {
|
||||||
EngineBufferManager::async_requestAllocation (AllocReceiver& receiver, size_t sizRequest)
|
EngineBufferManager::async_requestAllocation (AllocReceiver& receiver, size_t sizRequest)
|
||||||
{
|
{
|
||||||
REQUIRE (sizRequest);
|
REQUIRE (sizRequest);
|
||||||
requestQueue_.push ({&receiver, sizRequest});
|
requestQueue_.push ({receiver.getSafeHandle(), sizRequest});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,22 @@
|
||||||
|
|
||||||
/** @file local-buffer-store.hpp
|
/** @file local-buffer-store.hpp
|
||||||
** Production-grade implementation of engine::BufferProvider memory handling.
|
** Production-grade implementation of engine::BufferProvider memory handling.
|
||||||
|
** All functionality is delegated to further components. Notably, each thread
|
||||||
|
** maintains a LocalMemPool so that allocations can preferably be satisfied
|
||||||
|
** by reusing memory blocks currently associated to this thread. Excess capacity
|
||||||
|
** or further allocation demand is coordinated with the EngineBufferManager via
|
||||||
|
** asynchronous messaging.
|
||||||
|
**
|
||||||
|
** However, in accordance with the architecture of the Render Engine, there is
|
||||||
|
** no dedicated _memory manager thread_ — rather, the worker threads perform
|
||||||
|
** the accrued memory management effort on-demand. Allocation requests are
|
||||||
|
** placed into the queue, yet whenever some worker runs into some actual
|
||||||
|
** memory demand not yet satisfied, it acquires a global lock and performs
|
||||||
|
** all the requests queued thus far, in one batch. This scheme allows to
|
||||||
|
** allocate all available cores to the workers, while preventing global
|
||||||
|
** management efforts to push aside some worker. The same pattern is
|
||||||
|
** also used for the scheduler: each worker performs a chunk of the
|
||||||
|
** necessary scheduler work, until the next runnable job is found.
|
||||||
**
|
**
|
||||||
** @see LocalBufferStore_test
|
** @see LocalBufferStore_test
|
||||||
** @see buffer-provider.hpp
|
** @see buffer-provider.hpp
|
||||||
|
|
@ -39,7 +55,22 @@ namespace mem {
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @todo type comment
|
* Production-grade implementation of buffer allocation
|
||||||
|
* based on a thread-local pool that is connected asynchronously
|
||||||
|
* to the central EngineBufferManager (global pooling allocator).
|
||||||
|
* - announcement will send an allocation request to the global pool
|
||||||
|
* - allocations will either be served from the local pool or force
|
||||||
|
* a blocking round-trip into the EngineBufferManagert to perform
|
||||||
|
* all currently pending allocation requests for all worker threads.
|
||||||
|
* - the `emit()` call has no effect here; this differs from the
|
||||||
|
* OutputSlot and the cache manager case, where emit() is crucial.
|
||||||
|
* - buffer de-allocation will trigger a heuristic clean-up, taking
|
||||||
|
* into account how successfully each allocation in the pool was
|
||||||
|
* used recently, to prevent accumulating excess allocations.
|
||||||
|
* This implementation of the BufferProvider::BufferStore interface
|
||||||
|
* deliberately skips further sanity checks, beyond what is enforced
|
||||||
|
* through the BufferMetadata lifecycle. Allocation requests are
|
||||||
|
* passed to the LocalMemPool for the current thread.
|
||||||
*/
|
*/
|
||||||
class LocalBufferStore
|
class LocalBufferStore
|
||||||
: public BufferProviderSetup::Store
|
: public BufferProviderSetup::Store
|
||||||
|
|
@ -75,6 +106,7 @@ namespace mem {
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ==== Implementation of the BufferStore interface ==== */
|
/* ==== Implementation of the BufferStore interface ==== */
|
||||||
|
|
||||||
/** API: announce demand for some buffer allocations.
|
/** API: announce demand for some buffer allocations.
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,8 @@ namespace mem {
|
||||||
using std::invocable;
|
using std::invocable;
|
||||||
using util::unConst;
|
using util::unConst;
|
||||||
using util::isLimited;
|
using util::isLimited;
|
||||||
|
using std::this_thread::sleep_for;
|
||||||
|
using std::chrono_literals::operator ""us;
|
||||||
|
|
||||||
class PoolDiagnostic;
|
class PoolDiagnostic;
|
||||||
|
|
||||||
|
|
@ -368,13 +370,20 @@ namespace mem {
|
||||||
|
|
||||||
/** unconditionally dispose of the pool's entire contents.
|
/** unconditionally dispose of the pool's entire contents.
|
||||||
* @warning there must not be any allocations in use when invoking this function
|
* @warning there must not be any allocations in use when invoking this function
|
||||||
|
* @remark This function is intended to be used when shutting down this pool;
|
||||||
|
* in theory, a dangerous race could happen when a worker thread unwinds
|
||||||
|
* due to an unexpected error in the middle of a computation.
|
||||||
|
* EngineBufferManager might process pending allocation requests sent
|
||||||
|
* shortly before the failure, thereby accessing an already destroyed pool.
|
||||||
|
* The lib::LiveMark is used to protect against that situation
|
||||||
*/
|
*/
|
||||||
template<invocable<Buff*,size_t> FUN>
|
template<invocable<Buff*,size_t> FUN>
|
||||||
void
|
void
|
||||||
purge (FUN&& consumer)
|
purge (FUN&& consumer)
|
||||||
{
|
{
|
||||||
|
mark_.disengage(); // »lock down« the in-queue at that point (do not accept further allocations)
|
||||||
|
sleep_for (100us); // pragmatic solution for race with a dispatch of further allocations;
|
||||||
ingest();
|
ingest();
|
||||||
///////////////////////////////////////OOO need a way to »lock down« the inqueue at that point
|
|
||||||
for (Block& block : blocks_)
|
for (Block& block : blocks_)
|
||||||
{
|
{
|
||||||
REQUIRE (not block.used);
|
REQUIRE (not block.used);
|
||||||
|
|
|
||||||
|
|
@ -18,19 +18,18 @@
|
||||||
|
|
||||||
#include "test/run.hpp"
|
#include "test/run.hpp"
|
||||||
#include "test/test-helper.hpp"
|
#include "test/test-helper.hpp"
|
||||||
//#include "vault/mem/engine-buffer-metadata.hpp"
|
|
||||||
#include "vault/mem/local-buffer-store.hpp"
|
#include "vault/mem/local-buffer-store.hpp"
|
||||||
#include "vault/mem/engine-buffer-manager.hpp"
|
#include "vault/mem/engine-buffer-manager.hpp"
|
||||||
#include "vault/mem/engine-buffer-allocator.hpp"
|
#include "vault/mem/engine-buffer-allocator.hpp"
|
||||||
#include "lib/depend-inject.hpp"
|
#include "lib/depend-inject.hpp"
|
||||||
#include "lib/thread.hpp"
|
#include "lib/thread.hpp"
|
||||||
//#include "lib/error.hpp"
|
|
||||||
#include "lib/util.hpp"
|
#include "lib/util.hpp"
|
||||||
#include "test/diagnostic-output.hpp"
|
#include "test/diagnostic-output.hpp"///////////////////////TODO
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
using util::isSameAdr;
|
using util::isSameAdr;
|
||||||
|
|
||||||
using lib::Thread;
|
using lib::Thread;
|
||||||
using std::this_thread::yield;
|
using std::this_thread::yield;
|
||||||
using std::this_thread::sleep_for;
|
using std::this_thread::sleep_for;
|
||||||
|
|
@ -80,7 +79,17 @@ namespace test {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @test */
|
/** @test demonstrate a typical usage cycle of the BufferStore in concurrent setup
|
||||||
|
* - the main thread provides a mock instance of the EngineBufferManager
|
||||||
|
* - furthermore, the LocalBufferStore instance is created here
|
||||||
|
* - yet note: LocalBufferStore includes a LocalMemPool per thread
|
||||||
|
* - a test thread is launched to issue some allocation requests
|
||||||
|
* - announce some memory allocation demand
|
||||||
|
* - claim and use one buffer
|
||||||
|
* - generate further demand to trigger further allocation supply
|
||||||
|
* - terminate the thread
|
||||||
|
* - verify the number of allocations seen in the EngineBufferManager
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
verify_API()
|
verify_API()
|
||||||
{
|
{
|
||||||
|
|
@ -163,18 +172,14 @@ namespace test {
|
||||||
// before shutdown, LocalMemPool has sent back all allocations;
|
// before shutdown, LocalMemPool has sent back all allocations;
|
||||||
// these should sit now in the EngineBufferManager's input queue,
|
// these should sit now in the EngineBufferManager's input queue,
|
||||||
// unprocessed yet; same for the additional buffer requested later.
|
// unprocessed yet; same for the additional buffer requested later.
|
||||||
SHOW_EXPR(watch(*globalPool).numAllocs());
|
// EngineBufferManager only sees the first CNT allocations actually dispatched
|
||||||
CHECK (CNT == watch(*globalPool).numAllocs());
|
CHECK (CNT == watch(*globalPool).numAllocs());
|
||||||
CHECK ((CNT)*ALLOC == watch(*globalPool).bytesLeased());
|
CHECK (CNT*ALLOC == watch(*globalPool).bytesLeased());
|
||||||
|
|
||||||
// process in-queue and retrieve all allocations..
|
// process the in-queue and retrieve all allocations...
|
||||||
SHOW_EXPR("Kaka")
|
|
||||||
globalPool->processPendingRequests();
|
globalPool->processPendingRequests();
|
||||||
SHOW_EXPR("Boom")
|
// everything should be cleaned-up by now...
|
||||||
SHOW_EXPR(watch(*globalPool).bytesLeased());
|
CHECK (0 == watch(*globalPool).bytesLeased());
|
||||||
// CHECK (0 == watch(*globalPool).bytesLeased());
|
|
||||||
sleep_for(1000ms);
|
|
||||||
SHOW_EXPR("bye")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -144998,7 +144998,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<node COLOR="#338800" CREATED="1778979188506" ID="ID_1435066016" MODIFIED="1779148168359" TEXT="Zugriff auf Thread-Local Mem-Pool und EngineBufferManager">
|
<node COLOR="#338800" CREATED="1778979188506" ID="ID_1435066016" MODIFIED="1779148168359" TEXT="Zugriff auf Thread-Local Mem-Pool und EngineBufferManager">
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1779128982798" ID="ID_1913652442" MODIFIED="1779128995471" TEXT="Problem Clean-up">
|
<node COLOR="#435e98" CREATED="1779128982798" ID="ID_1913652442" MODIFIED="1779578940844" TEXT="Problem Clean-up">
|
||||||
<icon BUILTIN="messagebox_warning"/>
|
<icon BUILTIN="messagebox_warning"/>
|
||||||
<node CREATED="1779128999922" ID="ID_1435970090" MODIFIED="1779129012818" TEXT="dieser wird vom thread-local Subobjekt getriggert"/>
|
<node CREATED="1779128999922" ID="ID_1435970090" MODIFIED="1779129012818" TEXT="dieser wird vom thread-local Subobjekt getriggert"/>
|
||||||
<node CREATED="1779129014668" ID="ID_978040113" MODIFIED="1779129075918" TEXT="der LocalBufferStore bekommt das nicht einmal mit">
|
<node CREATED="1779129014668" ID="ID_978040113" MODIFIED="1779129075918" TEXT="der LocalBufferStore bekommt das nicht einmal mit">
|
||||||
|
|
@ -145012,7 +145012,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1779129078429" ID="ID_1921726698" MODIFIED="1779129106317" TEXT="aber die Service-Verbindungen sind nur im LocalBuffer gegeben"/>
|
<node CREATED="1779129078429" ID="ID_1921726698" MODIFIED="1779129106317" TEXT="aber die Service-Verbindungen sind nur im LocalBuffer gegeben"/>
|
||||||
<node CREATED="1779130807327" ID="ID_1569602452" MODIFIED="1779131264472" TEXT="⟹ also wird ein shutdown-Hook notwendig">
|
<node COLOR="#435e98" CREATED="1779130807327" FOLDED="true" ID="ID_1569602452" MODIFIED="1779578931772" TEXT="⟹ also wird ein shutdown-Hook notwendig">
|
||||||
<linktarget COLOR="#8233d1" DESTINATION="ID_1569602452" ENDARROW="Default" ENDINCLINATION="-746;-38;" ID="Arrow_ID_1519809069" SOURCE="ID_1507803308" STARTARROW="None" STARTINCLINATION="-695;30;"/>
|
<linktarget COLOR="#8233d1" DESTINATION="ID_1569602452" ENDARROW="Default" ENDINCLINATION="-746;-38;" ID="Arrow_ID_1519809069" SOURCE="ID_1507803308" STARTARROW="None" STARTINCLINATION="-695;30;"/>
|
||||||
<node CREATED="1779130847250" ID="ID_222831030" MODIFIED="1779135184435" TEXT="das ganze Thema kommt mir bekannt vor...">
|
<node CREATED="1779130847250" ID="ID_222831030" MODIFIED="1779135184435" TEXT="das ganze Thema kommt mir bekannt vor...">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
|
@ -145024,7 +145024,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</body>
|
</body>
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1779130986850" ID="ID_1806655906" MODIFIED="1779131349575" TEXT="erneut stellt sich das Problem der effektiv-statischen Instanz">
|
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1779130986850" ID="ID_1806655906" MODIFIED="1779578919404" TEXT="erneut stellt sich das Problem der effektiv-statischen Instanz">
|
||||||
<icon BUILTIN="messagebox_warning"/>
|
<icon BUILTIN="messagebox_warning"/>
|
||||||
<node CREATED="1779131365999" ID="ID_660464086" MODIFIED="1779131414390">
|
<node CREATED="1779131365999" ID="ID_660464086" MODIFIED="1779131414390">
|
||||||
<richcontent TYPE="NODE"><html>
|
<richcontent TYPE="NODE"><html>
|
||||||
|
|
@ -145052,7 +145052,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<icon BUILTIN="smily_bad"/>
|
<icon BUILTIN="smily_bad"/>
|
||||||
<node CREATED="1779140476970" ID="ID_1853141177" MODIFIED="1779140488380" TEXT="führe also eine shutdown-function ein"/>
|
<node CREATED="1779140476970" ID="ID_1853141177" MODIFIED="1779140488380" TEXT="führe also eine shutdown-function ein"/>
|
||||||
<node CREATED="1779140489560" ID="ID_1942203871" MODIFIED="1779140502858" TEXT="verwende die Config von LocalSlice um die zu injizieren"/>
|
<node CREATED="1779140489560" ID="ID_1942203871" MODIFIED="1779140502858" TEXT="verwende die Config von LocalSlice um die zu injizieren"/>
|
||||||
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1779140507822" ID="ID_1541520016" MODIFIED="1779140836908" TEXT="weitere Komplikation: Race im Shutdown">
|
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1779140507822" ID="ID_1541520016" MODIFIED="1779578885634" TEXT="weitere Komplikation: Race im Shutdown">
|
||||||
<arrowlink COLOR="#e5024c" DESTINATION="ID_241014081" ENDARROW="Default" ENDINCLINATION="-1049;0;" ID="Arrow_ID_1884336660" STARTARROW="None" STARTINCLINATION="-946;65;"/>
|
<arrowlink COLOR="#e5024c" DESTINATION="ID_241014081" ENDARROW="Default" ENDINCLINATION="-1049;0;" ID="Arrow_ID_1884336660" STARTARROW="None" STARTINCLINATION="-946;65;"/>
|
||||||
<icon BUILTIN="broken-line"/>
|
<icon BUILTIN="broken-line"/>
|
||||||
<node CREATED="1779140860563" ID="ID_187364117" MODIFIED="1779216224446" TEXT="das zeigt: ein explizitesr Schutzmechanismus ist notwendig">
|
<node CREATED="1779140860563" ID="ID_187364117" MODIFIED="1779216224446" TEXT="das zeigt: ein explizitesr Schutzmechanismus ist notwendig">
|
||||||
|
|
@ -145064,11 +145064,14 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1779578897524" ID="ID_142601062" MODIFIED="1779578915636" TEXT="konnte das durch geeignetes Setup im LocalBufferStore lösen">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1779216016773" ID="ID_1356813075" MODIFIED="1779328952013" TEXT="Schutzmechanismus für die Async-Kommunikation">
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1779216016773" FOLDED="true" ID="ID_1356813075" MODIFIED="1779578936751" TEXT="Schutzmechanismus für die Async-Kommunikation">
|
||||||
<linktarget COLOR="#ad0057" DESTINATION="ID_1356813075" ENDARROW="Default" ENDINCLINATION="114;-220;" ID="Arrow_ID_1737519596" SOURCE="ID_187364117" STARTARROW="None" STARTINCLINATION="-1063;52;"/>
|
<linktarget COLOR="#ad0057" DESTINATION="ID_1356813075" ENDARROW="Default" ENDINCLINATION="114;-220;" ID="Arrow_ID_1737519596" SOURCE="ID_187364117" STARTARROW="None" STARTINCLINATION="-1063;52;"/>
|
||||||
<linktarget COLOR="#5000ad" DESTINATION="ID_1356813075" ENDARROW="Default" ENDINCLINATION="-430;843;" ID="Arrow_ID_1277922642" SOURCE="ID_1697479221" STARTARROW="None" STARTINCLINATION="-1130;69;"/>
|
<linktarget COLOR="#5000ad" DESTINATION="ID_1356813075" ENDARROW="Default" ENDINCLINATION="-430;843;" ID="Arrow_ID_1277922642" SOURCE="ID_1697479221" STARTARROW="None" STARTINCLINATION="-1130;69;"/>
|
||||||
<icon BUILTIN="pencil"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
<node CREATED="1779224920108" ID="ID_909246085" MODIFIED="1779328938586" TEXT="Anforderungen">
|
<node CREATED="1779224920108" ID="ID_909246085" MODIFIED="1779328938586" TEXT="Anforderungen">
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
<node CREATED="1779224928540" ID="ID_117163407" MODIFIED="1779224938270" TEXT="hat einen aktiv / geblockt-State"/>
|
<node CREATED="1779224928540" ID="ID_117163407" MODIFIED="1779224938270" TEXT="hat einen aktiv / geblockt-State"/>
|
||||||
|
|
@ -145082,7 +145085,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<node CREATED="1779225174394" ID="ID_964352880" MODIFIED="1779225199891" TEXT="dieser erzeugt aber einen Key, der an die Instanz gebunden ist"/>
|
<node CREATED="1779225174394" ID="ID_964352880" MODIFIED="1779225199891" TEXT="dieser erzeugt aber einen Key, der an die Instanz gebunden ist"/>
|
||||||
<node CREATED="1779225204246" ID="ID_773629611" MODIFIED="1779227167103" TEXT="darüber wird in einen speziellen Marker zugegriffen"/>
|
<node CREATED="1779225204246" ID="ID_773629611" MODIFIED="1779227167103" TEXT="darüber wird in einen speziellen Marker zugegriffen"/>
|
||||||
<node CREATED="1779225216669" ID="ID_1883744470" MODIFIED="1779225232126" TEXT="Lebenszyklus-Kopplung über Ctor/Dtor realisiert"/>
|
<node CREATED="1779225216669" ID="ID_1883744470" MODIFIED="1779225232126" TEXT="Lebenszyklus-Kopplung über Ctor/Dtor realisiert"/>
|
||||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1779227171937" ID="ID_857696487" MODIFIED="1779328111248" TEXT="Problem der Synchronisation">
|
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1779227171937" FOLDED="true" ID="ID_857696487" MODIFIED="1779578870402" TEXT="Problem der Synchronisation">
|
||||||
<icon BUILTIN="messagebox_warning"/>
|
<icon BUILTIN="messagebox_warning"/>
|
||||||
<node CREATED="1779227189574" ID="ID_697877195" MODIFIED="1779227476829">
|
<node CREATED="1779227189574" ID="ID_697877195" MODIFIED="1779227476829">
|
||||||
<richcontent TYPE="NODE"><html>
|
<richcontent TYPE="NODE"><html>
|
||||||
|
|
@ -145149,7 +145152,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<icon BUILTIN="messagebox_warning"/>
|
<icon BUILTIN="messagebox_warning"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1779236363484" ID="ID_1623305116" MODIFIED="1779238992369" TEXT="Nach einigem Nachdenken: weiß nicht ob das Sichtbarkeitsproblem ohne Lock lösbar ist">
|
<node BACKGROUND_COLOR="#e3cda4" COLOR="#a50125" CREATED="1779236363484" ID="ID_1623305116" MODIFIED="1779573180765" TEXT="Nach einigem Nachdenken: weiß nicht ob das Sichtbarkeitsproblem ohne Lock lösbar ist">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head/>
|
<head/>
|
||||||
<body>
|
<body>
|
||||||
|
|
@ -145215,12 +145218,12 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
<icon BUILTIN="help"/>
|
<icon BUILTIN="help"/>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1779241271672" ID="ID_826264580" MODIFIED="1779328158312" TEXT="demgegenüber erscheint nun ein Speichertrick mit client-seitigem Prüfwert doch attraktiv">
|
<node CREATED="1779241271672" ID="ID_826264580" MODIFIED="1779573256726" TEXT="demgegenüber erscheint nun ein Speichertrick mit client-seitigem Prüfwert doch attraktiv">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head/>
|
<head/>
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
Man müßte dazu also den AllocReceiver umformulieren und zudem auch noch die Requests im EngineBufferManager. Vermutlich läuft das auf einen speziellen smart-Handle-Typ hinaus. Dieser würde eine Prüfsumme beinhalten, die dann auf der Empfängerseite genauso im Speicher vorzufinden sein muß. Die Prüfsumme würde auf einer Nonce+der Ziel-Addresse beruhen, und könnte damit so nur ein einziges Mal pro Programmlauf auftreten (modulo 63-bit Hash-Kollision). Die Sperr-Flag bestünde dann einfach darin, die empfängerseitige Prüfsumme auf Null zu setzen (kein Match, kein Zugriff). Diese empfängerseitige Prüfsumme müßte ein Atomic sein, und beim Zugriff würde eine Lese-Barriere angewendet, beim Ändern eine Schreibbarriere. Das wäre völlig akzeptabel. Darüberhinaus gäbe es keine Contention (außer beim Neuerzeugen eines Objekts, weil dann die Nonce inkrementiert werden muß).
|
Man müßte dazu also den AllocReceiver umformulieren und zudem auch noch die Requests im EngineBufferManager. Vermutlich läuft das auf einen speziellen smart-Handle-Typ hinaus. Dieser würde eine Prüfsumme beinhalten, die dann auf der Empfängerseite genauso im Speicher vorzufinden sein muß. Die Prüfsumme würde auf einer Nonce plus der Ziel-Addresse beruhen, und könnte damit so nur ein einziges Mal pro Programmlauf auftreten (modulo 64-bit Hash-Kollision). Die Sperr-Flag bestünde dann einfach darin, die empfängerseitige Prüfsumme auf Null zu setzen (kein Match, kein Zugriff). Diese empfängerseitige Prüfsumme müßte ein Atomic sein, und beim Zugriff würde eine Lese-Barriere angewendet, beim Ändern eine Schreibbarriere. Das wäre völlig akzeptabel. Darüberhinaus gäbe es keine Contention (außer beim Neuerzeugen eines Objekts, weil dann die Nonce inkrementiert werden muß).
|
||||||
</p>
|
</p>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
@ -145233,7 +145236,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#338800" CREATED="1779225244553" ID="ID_33299173" MODIFIED="1779328092186" TEXT="Implementierung">
|
<node COLOR="#338800" CREATED="1779225244553" ID="ID_33299173" MODIFIED="1779328092186" TEXT="Implementierung">
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
<node COLOR="#435e98" CREATED="1779302502523" ID="ID_332907520" MODIFIED="1779328099815">
|
<node COLOR="#435e98" CREATED="1779302502523" ID="ID_332907520" MODIFIED="1779578150521">
|
||||||
<richcontent TYPE="NODE"><html>
|
<richcontent TYPE="NODE"><html>
|
||||||
<head/>
|
<head/>
|
||||||
<body>
|
<body>
|
||||||
|
|
@ -145242,6 +145245,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</p>
|
</p>
|
||||||
</body>
|
</body>
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
|
<linktarget COLOR="#3d7395" DESTINATION="ID_332907520" ENDARROW="Default" ENDINCLINATION="-1840;207;" ID="Arrow_ID_668417083" SOURCE="ID_1820292066" STARTARROW="None" STARTINCLINATION="-634;41;"/>
|
||||||
|
<linktarget COLOR="#3d7395" DESTINATION="ID_332907520" ENDARROW="Default" ENDINCLINATION="-1840;207;" ID="Arrow_ID_1142922633" SOURCE="ID_142165791" STARTARROW="None" STARTINCLINATION="-634;41;"/>
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
<node CREATED="1779302523581" ID="ID_272378166" MODIFIED="1779302536450" TEXT="wird inkorporiert"/>
|
<node CREATED="1779302523581" ID="ID_272378166" MODIFIED="1779302536450" TEXT="wird inkorporiert"/>
|
||||||
<node CREATED="1779302591078" ID="ID_1400105754" MODIFIED="1779302599488" TEXT="initialisiert sich automatisch mit einer Nonce"/>
|
<node CREATED="1779302591078" ID="ID_1400105754" MODIFIED="1779302599488" TEXT="initialisiert sich automatisch mit einer Nonce"/>
|
||||||
|
|
@ -145295,13 +145300,27 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<node CREATED="1779324980129" ID="ID_374081410" MODIFIED="1779325011161" TEXT="Empfänger deaktiviert die LiveMark und leert die Queue"/>
|
<node CREATED="1779324980129" ID="ID_374081410" MODIFIED="1779325011161" TEXT="Empfänger deaktiviert die LiveMark und leert die Queue"/>
|
||||||
<node CREATED="1779325012566" ID="ID_210063040" MODIFIED="1779325018696" TEXT="danach darf nichts mehr ankommen"/>
|
<node CREATED="1779325012566" ID="ID_210063040" MODIFIED="1779325018696" TEXT="danach darf nichts mehr ankommen"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1779325042993" ID="ID_344181114" MODIFIED="1779327324878" TEXT="das zeigt: hier besteht immer noch ein Race">
|
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1779325042993" ID="ID_344181114" MODIFIED="1779578840255" TEXT="das zeigt: hier besteht immer noch ein Race">
|
||||||
<arrowlink COLOR="#b00581" DESTINATION="ID_1664117186" ENDARROW="Default" ENDINCLINATION="-937;0;" ID="Arrow_ID_1984536453" STARTARROW="None" STARTINCLINATION="-349;22;"/>
|
<arrowlink COLOR="#b00581" DESTINATION="ID_1664117186" ENDARROW="Default" ENDINCLINATION="-937;0;" ID="Arrow_ID_1984536453" STARTARROW="None" STARTINCLINATION="-349;22;"/>
|
||||||
<icon BUILTIN="messagebox_warning"/>
|
<icon BUILTIN="messagebox_warning"/>
|
||||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1779325064012" ID="ID_266392583" MODIFIED="1779328078960" TEXT="zwischen dem Check und dem Zugriff auf die Queue">
|
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1779325064012" ID="ID_266392583" MODIFIED="1779328078960" TEXT="zwischen dem Check und dem Zugriff auf die Queue">
|
||||||
<icon BUILTIN="broken-line"/>
|
<icon BUILTIN="broken-line"/>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1779325191221" ID="ID_1731541361" MODIFIED="1779325216960" TEXT="kaum zu verhindern ohne ein Lock oder einen atomaren Bestätigungs-Mechanismus"/>
|
<node CREATED="1779325191221" ID="ID_1731541361" MODIFIED="1779325216960" TEXT="kaum zu verhindern ohne ein Lock oder einen atomaren Bestätigungs-Mechanismus"/>
|
||||||
|
<node COLOR="#435e98" CREATED="1779578618396" ID="ID_1461104900" MODIFIED="1779578640765" TEXT="extra dafür einen 100µs-Sleep eingebaut">
|
||||||
|
<icon BUILTIN="idea"/>
|
||||||
|
<node COLOR="#5f0a4d" CREATED="1779578645372" HGAP="29" ID="ID_41372706" MODIFIED="1779578834204" TEXT="»pragmatische Lösung« für ein »Restrisiko«" VSHIFT="8">
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
...da es sich um einen Grenzfall handelt, den ich durch theoretische Überlegung identifiziert habe, und der im regulären Betrieb niemals auftreten sollte. Wenn es dazu kommt, wird sehr wahrscheinlich die Applikation insgesamt terminieren, d.h. in dem Fall verhindern wir nur diese lästige Art von nicht-reproduzierbaren SEGFAULT on shutdown. Falls es aber doch mal ein anderes Szenario gibt, würde das zu Speicherlecks führen. Daher denke ich, es genügt, das Restrisiko zu drücken (denn eine tatsächliche Lösung wäre ziemlich schwierig und würde das ganze Konzept der asynchronen Kommunikation konterkarrieren)
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
<font NAME="SansSerif" SIZE="11"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
|
|
@ -145472,8 +145491,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<node CREATED="1778948633708" ID="ID_1152843800" MODIFIED="1778948643382" TEXT="Steuer-Heuristik beobachten"/>
|
<node CREATED="1778948633708" ID="ID_1152843800" MODIFIED="1778948643382" TEXT="Steuer-Heuristik beobachten"/>
|
||||||
<node CREATED="1778948730082" ID="ID_868291823" MODIFIED="1778948736909" TEXT="Grenzfälle / Lebenszyklus"/>
|
<node CREATED="1778948730082" ID="ID_868291823" MODIFIED="1778948736909" TEXT="Grenzfälle / Lebenszyklus"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1778948838374" ID="ID_1190893477" MODIFIED="1778979151352" TEXT="verify_API">
|
<node COLOR="#338800" CREATED="1778948838374" ID="ID_1190893477" MODIFIED="1779578606270" TEXT="verify_API">
|
||||||
<icon BUILTIN="pencil"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
<node CREATED="1779148191788" ID="ID_39449611" MODIFIED="1779148194561" TEXT="Schritte">
|
<node CREATED="1779148191788" ID="ID_39449611" MODIFIED="1779148194561" TEXT="Schritte">
|
||||||
<node CREATED="1778948874440" ID="ID_619417705" MODIFIED="1778948892430" TEXT="Allokation ankündigen"/>
|
<node CREATED="1778948874440" ID="ID_619417705" MODIFIED="1778948892430" TEXT="Allokation ankündigen"/>
|
||||||
<node CREATED="1778948897541" ID="ID_625050889" MODIFIED="1778948901900" TEXT="Allokation beziehen"/>
|
<node CREATED="1778948897541" ID="ID_625050889" MODIFIED="1778948901900" TEXT="Allokation beziehen"/>
|
||||||
|
|
@ -145562,11 +145581,14 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1779215763458" ID="ID_1073142525" MODIFIED="1779215781831" TEXT="Fazit. »eigene Dummheit«"/>
|
<node CREATED="1779215763458" ID="ID_1073142525" MODIFIED="1779215781831" TEXT="Fazit. »eigene Dummheit«"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1779215808575" ID="ID_536197148" MODIFIED="1779215834783" TEXT="Assertion-Failure: Lease bleibt offen">
|
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1779215808575" ID="ID_536197148" MODIFIED="1779578580360" TEXT="Assertion-Failure: Lease bleibt offen">
|
||||||
<icon BUILTIN="broken-line"/>
|
<icon BUILTIN="broken-line"/>
|
||||||
<node CREATED="1779215845829" ID="ID_1150970737" MODIFIED="1779215866852" TEXT="Grund ist eine »Zombie-Zustellung«"/>
|
<node CREATED="1779215845829" ID="ID_1150970737" MODIFIED="1779215866852" TEXT="Grund ist eine »Zombie-Zustellung«"/>
|
||||||
<node CREATED="1779215868024" ID="ID_182421878" MODIFIED="1779215990774" TEXT="Problem hatte ich bereits theoretisch vorhergesehen">
|
<node CREATED="1779215868024" ID="ID_182421878" MODIFIED="1779578600503" TEXT="Problem hatte ich bereits theoretisch vorhergesehen">
|
||||||
<arrowlink COLOR="#fe902e" DESTINATION="ID_931645192" ENDARROW="Default" ENDINCLINATION="-2428;97;" ID="Arrow_ID_1201055029" STARTARROW="None" STARTINCLINATION="659;35;"/>
|
<arrowlink COLOR="#fe902e" DESTINATION="ID_931645192" ENDARROW="Default" ENDINCLINATION="-2428;97;" ID="Arrow_ID_1201055029" STARTARROW="None" STARTINCLINATION="802;43;"/>
|
||||||
|
</node>
|
||||||
|
<node COLOR="#0b4759" CREATED="1779578559693" ID="ID_1483979505" MODIFIED="1779578593019" TEXT="nach Einbau des LiveMark + shutdown-Hook nun behoben">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
|
|
@ -145739,7 +145761,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</body>
|
</body>
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1776783536196" ID="ID_33829677" MODIFIED="1776783554130" TEXT="Betrachtung aus Sicht der Speicherverwaltung">
|
<node CREATED="1776783536196" FOLDED="true" ID="ID_33829677" MODIFIED="1779579301343" TEXT="Betrachtung aus Sicht der Speicherverwaltung">
|
||||||
|
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||||
<icon BUILTIN="edit"/>
|
<icon BUILTIN="edit"/>
|
||||||
<node CREATED="1776783636098" ID="ID_369280976" MODIFIED="1776783638425" TEXT="Builder">
|
<node CREATED="1776783636098" ID="ID_369280976" MODIFIED="1776783638425" TEXT="Builder">
|
||||||
<node CREATED="1776783732204" ID="ID_255731901" MODIFIED="1776783741763" TEXT="sieht einen Buffer-Typ vor">
|
<node CREATED="1776783732204" ID="ID_255731901" MODIFIED="1776783741763" TEXT="sieht einen Buffer-Typ vor">
|
||||||
|
|
@ -145891,7 +145914,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1776807130845" ID="ID_1245794656" MODIFIED="1776807136352" TEXT="Diskussion">
|
<node CREATED="1776807130845" ID="ID_1245794656" MODIFIED="1776807136352" TEXT="Diskussion">
|
||||||
<node CREATED="1776807151258" ID="ID_1373944107" MODIFIED="1776807903140" TEXT="betrachte eine Neu-Implementierung (»from scratch«)">
|
<node CREATED="1776807151258" FOLDED="true" ID="ID_1373944107" MODIFIED="1779579282817" TEXT="betrachte eine Neu-Implementierung (»from scratch«)">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head/>
|
<head/>
|
||||||
<body>
|
<body>
|
||||||
|
|
@ -145970,7 +145993,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<node CREATED="1776809193817" ID="ID_1697805600" MODIFIED="1776809208314" TEXT="MRU und Scores werden hier verwaltet"/>
|
<node CREATED="1776809193817" ID="ID_1697805600" MODIFIED="1776809208314" TEXT="MRU und Scores werden hier verwaltet"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1776809288741" ID="ID_421543225" MODIFIED="1776809295743" TEXT="Vergleich mit dem aktuellen Planungs-Stand">
|
<node CREATED="1776809288741" FOLDED="true" ID="ID_421543225" MODIFIED="1779579284558" TEXT="Vergleich mit dem aktuellen Planungs-Stand">
|
||||||
<node CREATED="1776809298955" ID="ID_1145369165" MODIFIED="1776809312397" TEXT="BufferMetadata enthält bereits eine State-Engine"/>
|
<node CREATED="1776809298955" ID="ID_1145369165" MODIFIED="1776809312397" TEXT="BufferMetadata enthält bereits eine State-Engine"/>
|
||||||
<node CREATED="1776809313293" ID="ID_16177595" MODIFIED="1776809331186" TEXT="damit ist eine sehr einfache Implementierung des Buffer-Store möglich">
|
<node CREATED="1776809313293" ID="ID_16177595" MODIFIED="1776809331186" TEXT="damit ist eine sehr einfache Implementierung des Buffer-Store möglich">
|
||||||
<node CREATED="1776809332407" ID="ID_634300630" MODIFIED="1776809342193" TEXT="für den »naiven« Fall"/>
|
<node CREATED="1776809332407" ID="ID_634300630" MODIFIED="1776809342193" TEXT="für den »naiven« Fall"/>
|
||||||
|
|
@ -146000,7 +146023,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<node CREATED="1776809679448" ID="ID_1620167252" MODIFIED="1776809696176" TEXT="wie werden Buffer-Allokationen zugeteilt / zurückgegeben?"/>
|
<node CREATED="1776809679448" ID="ID_1620167252" MODIFIED="1776809696176" TEXT="wie werden Buffer-Allokationen zugeteilt / zurückgegeben?"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#5b280f" CREATED="1776810818641" ID="ID_1990109101" MODIFIED="1778792564355" TEXT="Erweiterung der bestehenden Struktur">
|
<node COLOR="#5b280f" CREATED="1776810818641" FOLDED="true" ID="ID_1990109101" MODIFIED="1779579275062" TEXT="Erweiterung der bestehenden Struktur">
|
||||||
<icon BUILTIN="button_cancel"/>
|
<icon BUILTIN="button_cancel"/>
|
||||||
<node CREATED="1776810842916" ID="ID_1308910879" MODIFIED="1776810900632" TEXT="Ansatz: der Store bekommt eine Direkt-Verbindung zu BufferMetadata">
|
<node CREATED="1776810842916" ID="ID_1308910879" MODIFIED="1776810900632" TEXT="Ansatz: der Store bekommt eine Direkt-Verbindung zu BufferMetadata">
|
||||||
<node CREATED="1776810904516" ID="ID_467003761" MODIFIED="1776811035606" TEXT="läßt sich realisieren unter Ausnützung des LocalSlice">
|
<node CREATED="1776810904516" ID="ID_467003761" MODIFIED="1776811035606" TEXT="läßt sich realisieren unter Ausnützung des LocalSlice">
|
||||||
|
|
@ -146168,16 +146191,24 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1776814507533" ID="ID_189865287" MODIFIED="1776814576271" TEXT="Ownership / Transaktionelle Sicherheit">
|
<node CREATED="1776814507533" ID="ID_189865287" MODIFIED="1776814576271" TEXT="Ownership / Transaktionelle Sicherheit">
|
||||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1776816810560" ID="ID_1402352728" MODIFIED="1779140437311" TEXT="das System muß auch korrekt arbeiten, wenn ein Worker-Thread terminiert">
|
<node BACKGROUND_COLOR="#d9b592" COLOR="#5a0f69" CREATED="1776816810560" ID="ID_1402352728" MODIFIED="1779578509948" TEXT="das System muß auch korrekt arbeiten, wenn ein Worker-Thread terminiert">
|
||||||
<arrowlink COLOR="#e01436" DESTINATION="ID_609664480" ENDARROW="None" ENDINCLINATION="-1139;0;" ID="Arrow_ID_649333039" STARTARROW="Default" STARTINCLINATION="707;0;"/>
|
<arrowlink COLOR="#e01436" DESTINATION="ID_609664480" ENDARROW="None" ENDINCLINATION="-1139;0;" ID="Arrow_ID_649333039" STARTARROW="Default" STARTINCLINATION="1057;40;"/>
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
|
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1779578462799" ID="ID_141245900" MODIFIED="1779578541143" TEXT="nun theoretisch gelöst — aber schwer zu testen">
|
||||||
|
<arrowlink DESTINATION="ID_256080084" ENDARROW="Default" ENDINCLINATION="203;0;" ID="Arrow_ID_1543361263" STARTARROW="None" STARTINCLINATION="217;12;"/>
|
||||||
|
<icon BUILTIN="messagebox_warning"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1776816880663" ID="ID_233138855" MODIFIED="1776816975061" TEXT="das ist nicht-trivial — ohne weitere Maßnamen »verlieren« wir Buffer">
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1776816880663" ID="ID_233138855" MODIFIED="1779578302154" TEXT="das ist nicht-trivial — ohne weitere Maßnamen »verlieren« wir Buffer">
|
||||||
<icon BUILTIN="messagebox_warning"/>
|
<icon BUILTIN="messagebox_warning"/>
|
||||||
<node CREATED="1776816921522" ID="ID_1322737136" MODIFIED="1776816945259" TEXT="wenn auch die Ownership mitwandert, verlieren wir sie wirklich"/>
|
<node CREATED="1776816921522" ID="ID_1322737136" MODIFIED="1776816945259" TEXT="wenn auch die Ownership mitwandert, verlieren wir sie wirklich"/>
|
||||||
<node CREATED="1776816946503" ID="ID_1522146043" MODIFIED="1776816964208" TEXT="andernfalls bleiben sie im globalen Manager gesperrt"/>
|
<node CREATED="1776816946503" ID="ID_1522146043" MODIFIED="1776816964208" TEXT="andernfalls bleiben sie im globalen Manager gesperrt"/>
|
||||||
|
<node COLOR="#338800" CREATED="1779578018664" ID="ID_142165791" MODIFIED="1779578293554" TEXT="expliziter neuer Schutzmechanismus: LiveMark">
|
||||||
|
<arrowlink COLOR="#3d7395" DESTINATION="ID_332907520" ENDARROW="Default" ENDINCLINATION="-1840;207;" ID="Arrow_ID_1142922633" STARTARROW="None" STARTINCLINATION="-634;41;"/>
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1776817562925" ID="ID_1219928484" MODIFIED="1776817591586" TEXT="⟹ das wird eine explizite Verantwortlichkeit des BufferStore">
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1776817562925" ID="ID_1219928484" MODIFIED="1779578444334" TEXT="⟹ das wird eine explizite Verantwortlichkeit des BufferStore">
|
||||||
<font NAME="SansSerif" SIZE="12"/>
|
<font NAME="SansSerif" SIZE="12"/>
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
<node CREATED="1776817599497" ID="ID_1874411040" MODIFIED="1776817620997" TEXT="er muß einen nicht-trivialen Destruktor bereitstellen"/>
|
<node CREATED="1776817599497" ID="ID_1874411040" MODIFIED="1776817620997" TEXT="er muß einen nicht-trivialen Destruktor bereitstellen"/>
|
||||||
|
|
@ -146192,6 +146223,16 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</body>
|
</body>
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
</node>
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1779578335436" ID="ID_452117945" MODIFIED="1779578438818" TEXT="eingebaut...">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
<node CREATED="1779578349322" ID="ID_1132145779" MODIFIED="1779578365095" TEXT="LocalBufferStore konfiguriert LocalMemPool"/>
|
||||||
|
<node CREATED="1779578367804" ID="ID_1461756059" MODIFIED="1779578385657" TEXT="LocalMemPool hat einen shutdown-Hook"/>
|
||||||
|
<node CREATED="1779578387055" ID="ID_256080084" MODIFIED="1779578541143" TEXT="dieser sendet den Inhalt des Pool zurück">
|
||||||
|
<linktarget COLOR="#a9b4c1" DESTINATION="ID_256080084" ENDARROW="Default" ENDINCLINATION="203;0;" ID="Arrow_ID_1543361263" SOURCE="ID_141245900" STARTARROW="None" STARTINCLINATION="217;12;"/>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1779578405235" ID="ID_333707432" MODIFIED="1779578421861" TEXT="Zustellung noch schwebender Alloc-Requests wird unterbunden"/>
|
||||||
|
<node CREATED="1779578422716" ID="ID_698985096" MODIFIED="1779578434019" TEXT="dafür LiveMark in den LocalMemPool platziert"/>
|
||||||
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1776817873864" ID="ID_1964767554" MODIFIED="1778792259242" TEXT="Diskussion und Abwägung">
|
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1776817873864" ID="ID_1964767554" MODIFIED="1778792259242" TEXT="Diskussion und Abwägung">
|
||||||
|
|
@ -146847,7 +146888,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1776819109351" ID="ID_1998897998" MODIFIED="1778792397575" TEXT="EngineBufferManager">
|
<node BACKGROUND_COLOR="#a4c8cf" COLOR="#22695a" CREATED="1776819109351" ID="ID_1998897998" MODIFIED="1779579198844" TEXT="EngineBufferManager">
|
||||||
<linktarget COLOR="#1b1ac0" DESTINATION="ID_1998897998" ENDARROW="Default" ENDINCLINATION="15;-85;" ID="Arrow_ID_1964764365" SOURCE="ID_1791813360" STARTARROW="None" STARTINCLINATION="-438;24;"/>
|
<linktarget COLOR="#1b1ac0" DESTINATION="ID_1998897998" ENDARROW="Default" ENDINCLINATION="15;-85;" ID="Arrow_ID_1964764365" SOURCE="ID_1791813360" STARTARROW="None" STARTINCLINATION="-438;24;"/>
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
<node COLOR="#338800" CREATED="1776819156872" ID="ID_1476925601" MODIFIED="1778788622379" TEXT="Grundkonzeption schaffen">
|
<node COLOR="#338800" CREATED="1776819156872" ID="ID_1476925601" MODIFIED="1778788622379" TEXT="Grundkonzeption schaffen">
|
||||||
|
|
@ -146900,7 +146941,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#435e98" CREATED="1777326654102" ID="ID_499885447" MODIFIED="1778788640455" TEXT="Struktur">
|
<node COLOR="#435e98" CREATED="1777326654102" FOLDED="true" ID="ID_499885447" MODIFIED="1779579221965" TEXT="Struktur">
|
||||||
<icon BUILTIN="forward"/>
|
<icon BUILTIN="forward"/>
|
||||||
<node CREATED="1777326657789" ID="ID_831464061" MODIFIED="1777326715033" TEXT="Längerfristig: Policy-based-Design">
|
<node CREATED="1777326657789" ID="ID_831464061" MODIFIED="1777326715033" TEXT="Längerfristig: Policy-based-Design">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
|
@ -147058,9 +147099,9 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1778118771505" ID="ID_1314536256" MODIFIED="1778788608420" TEXT="also ⟹ sinnvollerweise die Eingangs- und Ausgangs-Seite dediziert und separat bauen">
|
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1778118771505" ID="ID_1314536256" MODIFIED="1778788608420" TEXT="also ⟹ sinnvollerweise die Eingangs- und Ausgangs-Seite dediziert und separat bauen">
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
<node CREATED="1778118817300" ID="ID_1259663169" MODIFIED="1778118842536" TEXT="Ausgang ≙ Allokations-Requests">
|
<node COLOR="#435e98" CREATED="1778118817300" ID="ID_1259663169" MODIFIED="1779579147974" TEXT="Ausgang ≙ Allokations-Requests">
|
||||||
<node CREATED="1778118984391" ID="ID_231045425" MODIFIED="1778118994533" TEXT="angefordert wird nur eine size"/>
|
<node CREATED="1778118984391" ID="ID_231045425" MODIFIED="1778118994533" TEXT="angefordert wird nur eine size"/>
|
||||||
<node CREATED="1778118995115" ID="ID_1837404142" MODIFIED="1778119005838" TEXT="Aber: der Callback ist eine Member-Funktion">
|
<node CREATED="1778118995115" FOLDED="true" ID="ID_1837404142" MODIFIED="1779579127416" TEXT="Aber: der Callback ist eine Member-Funktion">
|
||||||
<node CREATED="1778119010570" ID="ID_1042885761" MODIFIED="1778119024572" TEXT="mögliche Darstellung">
|
<node CREATED="1778119010570" ID="ID_1042885761" MODIFIED="1778119024572" TEXT="mögliche Darstellung">
|
||||||
<node COLOR="#5b280f" CREATED="1778119025799" ID="ID_582301331" MODIFIED="1778119039754" TEXT="als std::function">
|
<node COLOR="#5b280f" CREATED="1778119025799" ID="ID_582301331" MODIFIED="1778119039754" TEXT="als std::function">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
|
@ -147083,8 +147124,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</body>
|
</body>
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1778119348551" ID="ID_1733239947" MODIFIED="1778119367938" TEXT="als statische callback-Funktion mit »Instance«-Parameter">
|
<node CREATED="1778119348551" ID="ID_1733239947" MODIFIED="1779579068069" TEXT="als statische callback-Funktion mit »Instance«-Parameter">
|
||||||
<icon BUILTIN="forward"/>
|
<icon BUILTIN="help"/>
|
||||||
<node CREATED="1778119381603" ID="ID_954784730" MODIFIED="1778119390390" TEXT="Vorsicht! kein Over-Engineering"/>
|
<node CREATED="1778119381603" ID="ID_954784730" MODIFIED="1778119390390" TEXT="Vorsicht! kein Over-Engineering"/>
|
||||||
<node CREATED="1778119391222" ID="ID_1689068968" MODIFIED="1778119443403" TEXT="klar ist hier: es gibt nur eine einzige Implementierung des Empfängers">
|
<node CREATED="1778119391222" ID="ID_1689068968" MODIFIED="1778119443403" TEXT="klar ist hier: es gibt nur eine einzige Implementierung des Empfängers">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
|
@ -147097,10 +147138,14 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
|
<node COLOR="#435e98" CREATED="1779579069316" ID="ID_306667350" MODIFIED="1779579106439" TEXT="als Memberfunktion auf einer Basisklasse">
|
||||||
|
<arrowlink COLOR="#3a77be" DESTINATION="ID_1837745925" ENDARROW="Default" ENDINCLINATION="-340;-16;" ID="Arrow_ID_899315499" STARTARROW="None" STARTINCLINATION="146;9;"/>
|
||||||
|
<icon BUILTIN="forward"/>
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#338800" CREATED="1778119450587" FOLDED="true" ID="ID_1806367243" MODIFIED="1778788593642" TEXT="Anordnung im Code">
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1778119450587" ID="ID_1806367243" MODIFIED="1779579049327" TEXT="Anordnung im Code">
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
<node CREATED="1778119474043" ID="ID_898200002" MODIFIED="1778119501037">
|
<node CREATED="1778119474043" FOLDED="true" ID="ID_898200002" MODIFIED="1779579112826">
|
||||||
<richcontent TYPE="NODE"><html>
|
<richcontent TYPE="NODE"><html>
|
||||||
<head/>
|
<head/>
|
||||||
<body>
|
<body>
|
||||||
|
|
@ -147120,7 +147165,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<node CREATED="1778119639862" ID="ID_1359278383" MODIFIED="1778119728301" TEXT="Konsequenz: der EngineBufferManager muß den LocalBufferStore sehen"/>
|
<node CREATED="1778119639862" ID="ID_1359278383" MODIFIED="1778119728301" TEXT="Konsequenz: der EngineBufferManager muß den LocalBufferStore sehen"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#435e98" CREATED="1778199712170" ID="ID_334307615" MODIFIED="1778788535095" TEXT="auflösen durch getrennte Translation-Units">
|
<node COLOR="#435e98" CREATED="1778199712170" FOLDED="true" ID="ID_334307615" MODIFIED="1779579116409" TEXT="auflösen durch getrennte Translation-Units">
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
<node COLOR="#5b280f" CREATED="1778199840557" ID="ID_444542765" MODIFIED="1778200791662" TEXT="hier nochmal die Diskussion: Abstraktion einführen?">
|
<node COLOR="#5b280f" CREATED="1778199840557" ID="ID_444542765" MODIFIED="1778200791662" TEXT="hier nochmal die Diskussion: Abstraktion einführen?">
|
||||||
<linktarget COLOR="#694543" DESTINATION="ID_444542765" ENDARROW="Default" ENDINCLINATION="-442;-19;" ID="Arrow_ID_1733074661" SOURCE="ID_845392021" STARTARROW="None" STARTINCLINATION="183;9;"/>
|
<linktarget COLOR="#694543" DESTINATION="ID_444542765" ENDARROW="Default" ENDINCLINATION="-442;-19;" ID="Arrow_ID_1733074661" SOURCE="ID_845392021" STARTARROW="None" STARTINCLINATION="183;9;"/>
|
||||||
|
|
@ -147163,7 +147208,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<node CREATED="1778201747177" ID="ID_1235232289" MODIFIED="1778201802499" TEXT="⟹ engine-buffer-manager.hpp : sichtbares Backend-Service-Interface"/>
|
<node CREATED="1778201747177" ID="ID_1235232289" MODIFIED="1778201802499" TEXT="⟹ engine-buffer-manager.hpp : sichtbares Backend-Service-Interface"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1778203953066" ID="ID_570673188" MODIFIED="1778788509519" TEXT="brauche dann aber doch eine Konvention / Abstraktion für den Callback">
|
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1778203953066" FOLDED="true" ID="ID_570673188" MODIFIED="1778788509519" TEXT="brauche dann aber doch eine Konvention / Abstraktion für den Callback">
|
||||||
<icon BUILTIN="messagebox_warning"/>
|
<icon BUILTIN="messagebox_warning"/>
|
||||||
<node CREATED="1778203987341" ID="ID_384285004" MODIFIED="1778204998986" TEXT="und zwar gibt es eine zusätzliche Komplikation durch das Thread-Local-Slice">
|
<node CREATED="1778203987341" ID="ID_384285004" MODIFIED="1778204998986" TEXT="und zwar gibt es eine zusätzliche Komplikation durch das Thread-Local-Slice">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
|
@ -147213,7 +147258,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1778338086407" ID="ID_540821014" MODIFIED="1778338102529" TEXT="damit bleibt ein Interface als einzige Lösung übrig"/>
|
<node CREATED="1778338086407" ID="ID_540821014" MODIFIED="1778338102529" TEXT="damit bleibt ein Interface als einzige Lösung übrig"/>
|
||||||
<node CREATED="1778338455958" ID="ID_1837745925" MODIFIED="1778338481318" TEXT="Idee: einen AllocReceiver schaffen">
|
<node CREATED="1778338455958" ID="ID_1837745925" MODIFIED="1779579103387" TEXT="Idee: einen AllocReceiver schaffen">
|
||||||
|
<linktarget COLOR="#3a77be" DESTINATION="ID_1837745925" ENDARROW="Default" ENDINCLINATION="-340;-16;" ID="Arrow_ID_899315499" SOURCE="ID_306667350" STARTARROW="None" STARTINCLINATION="146;9;"/>
|
||||||
<icon BUILTIN="idea"/>
|
<icon BUILTIN="idea"/>
|
||||||
<node CREATED="1778338483900" ID="ID_886291553" MODIFIED="1778338496471" TEXT="der enthält bereits die Lock-free Queue"/>
|
<node CREATED="1778338483900" ID="ID_886291553" MODIFIED="1778338496471" TEXT="der enthält bereits die Lock-free Queue"/>
|
||||||
<node CREATED="1778338497805" ID="ID_642065562" MODIFIED="1778338510741" TEXT="EngineBufferManager würde den ebenfalls includieren"/>
|
<node CREATED="1778338497805" ID="ID_642065562" MODIFIED="1778338510741" TEXT="EngineBufferManager würde den ebenfalls includieren"/>
|
||||||
|
|
@ -147242,8 +147288,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1778205040426" ID="ID_609664480" MODIFIED="1779140437311" TEXT="weiteres Problem: Race mit Ende des Worker-Thread">
|
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1778205040426" FOLDED="true" ID="ID_609664480" MODIFIED="1779579131027" TEXT="weiteres Problem: Race mit Ende des Worker-Thread">
|
||||||
<linktarget COLOR="#e01436" DESTINATION="ID_609664480" ENDARROW="None" ENDINCLINATION="-1139;0;" ID="Arrow_ID_649333039" SOURCE="ID_1402352728" STARTARROW="Default" STARTINCLINATION="707;0;"/>
|
<linktarget COLOR="#e01436" DESTINATION="ID_609664480" ENDARROW="None" ENDINCLINATION="-1139;0;" ID="Arrow_ID_649333039" SOURCE="ID_1402352728" STARTARROW="Default" STARTINCLINATION="1057;40;"/>
|
||||||
<icon BUILTIN="messagebox_warning"/>
|
<icon BUILTIN="messagebox_warning"/>
|
||||||
<node CREATED="1778205127309" ID="ID_174843767" MODIFIED="1778205132800" TEXT="Beispiel-Szenario">
|
<node CREATED="1778205127309" ID="ID_174843767" MODIFIED="1778205132800" TEXT="Beispiel-Szenario">
|
||||||
<node CREATED="1778205135600" ID="ID_1730604347" MODIFIED="1778205230908" TEXT="neuer Job ⟹ Anforderung an EngineBufferManager">
|
<node CREATED="1778205135600" ID="ID_1730604347" MODIFIED="1778205230908" TEXT="neuer Job ⟹ Anforderung an EngineBufferManager">
|
||||||
|
|
@ -147252,7 +147298,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<node CREATED="1778205155009" ID="ID_536238884" MODIFIED="1778205234412" TEXT="Problem im Job ⟹ Unwind, Worker terminiert">
|
<node CREATED="1778205155009" ID="ID_536238884" MODIFIED="1778205234412" TEXT="Problem im Job ⟹ Unwind, Worker terminiert">
|
||||||
<icon BUILTIN="full-2"/>
|
<icon BUILTIN="full-2"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#f9e4d6" COLOR="#c00244" CREATED="1778205192805" ID="ID_931645192" MODIFIED="1779328009963">
|
<node BACKGROUND_COLOR="#f9e4d6" COLOR="#c00244" CREATED="1778205192805" ID="ID_931645192" MODIFIED="1779578600503">
|
||||||
<richcontent TYPE="NODE"><html>
|
<richcontent TYPE="NODE"><html>
|
||||||
<head/>
|
<head/>
|
||||||
<body>
|
<body>
|
||||||
|
|
@ -147267,8 +147313,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</p>
|
</p>
|
||||||
</body>
|
</body>
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
|
<linktarget COLOR="#fe902e" DESTINATION="ID_931645192" ENDARROW="Default" ENDINCLINATION="-2428;97;" ID="Arrow_ID_1201055029" SOURCE="ID_182421878" STARTARROW="None" STARTINCLINATION="802;43;"/>
|
||||||
<linktarget COLOR="#ff1b15" DESTINATION="ID_931645192" ENDARROW="Default" ENDINCLINATION="-937;191;" ID="Arrow_ID_801625969" SOURCE="ID_1394284825" STARTARROW="None" STARTINCLINATION="171;-11;"/>
|
<linktarget COLOR="#ff1b15" DESTINATION="ID_931645192" ENDARROW="Default" ENDINCLINATION="-937;191;" ID="Arrow_ID_801625969" SOURCE="ID_1394284825" STARTARROW="None" STARTINCLINATION="171;-11;"/>
|
||||||
<linktarget COLOR="#fe902e" DESTINATION="ID_931645192" ENDARROW="Default" ENDINCLINATION="-2428;97;" ID="Arrow_ID_1201055029" SOURCE="ID_182421878" STARTARROW="None" STARTINCLINATION="659;35;"/>
|
|
||||||
<icon BUILTIN="clanbomber"/>
|
<icon BUILTIN="clanbomber"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
|
|
@ -147344,8 +147390,17 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1779578018664" ID="ID_1820292066" MODIFIED="1779578150521" TEXT="gelöst durch Integrieren eines lib::LiveMark">
|
||||||
|
<arrowlink COLOR="#3d7395" DESTINATION="ID_332907520" ENDARROW="Default" ENDINCLINATION="-1840;207;" ID="Arrow_ID_668417083" STARTARROW="None" STARTINCLINATION="-634;41;"/>
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
<node CREATED="1779578164714" ID="ID_786439623" MODIFIED="1779578174454" TEXT="neuer Schutzmechanismus genau für diesen Zweck"/>
|
||||||
|
<node CREATED="1779578176344" ID="ID_436406258" MODIFIED="1779578187464" TEXT="verwendet eine Hash-ID auf beiden Seiten"/>
|
||||||
|
<node COLOR="#435e98" CREATED="1779578189454" ID="ID_1212814572" MODIFIED="1779578222184" TEXT="kann so erkennen wenn der Nachrichtenemfänger nicht mehr existiert">
|
||||||
|
<icon BUILTIN="idea"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1779140529611" ID="ID_241014081" MODIFIED="1779140636770" TEXT="ein weiterer ähnlicher Race besteht im Destruktor + shotdown-Hook">
|
</node>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1779140529611" FOLDED="true" ID="ID_241014081" MODIFIED="1779579132518" TEXT="ein weiterer ähnlicher Race besteht im Destruktor + shotdown-Hook">
|
||||||
<linktarget COLOR="#e5024c" DESTINATION="ID_241014081" ENDARROW="Default" ENDINCLINATION="-1049;0;" ID="Arrow_ID_1884336660" SOURCE="ID_1541520016" STARTARROW="None" STARTINCLINATION="-946;65;"/>
|
<linktarget COLOR="#e5024c" DESTINATION="ID_241014081" ENDARROW="Default" ENDINCLINATION="-1049;0;" ID="Arrow_ID_1884336660" SOURCE="ID_1541520016" STARTARROW="None" STARTINCLINATION="-946;65;"/>
|
||||||
<icon BUILTIN="messagebox_warning"/>
|
<icon BUILTIN="messagebox_warning"/>
|
||||||
<node CREATED="1779140649391" ID="ID_1221279387" MODIFIED="1779140665105" TEXT="ein anderer Thread könnte grade mit der Zustellung anfangen"/>
|
<node CREATED="1779140649391" ID="ID_1221279387" MODIFIED="1779140665105" TEXT="ein anderer Thread könnte grade mit der Zustellung anfangen"/>
|
||||||
|
|
@ -147357,7 +147412,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<linktarget COLOR="#2b53d4" DESTINATION="ID_255577978" ENDARROW="Default" ENDINCLINATION="443;20;" ID="Arrow_ID_57636127" SOURCE="ID_228507573" STARTARROW="None" STARTINCLINATION="320;11;"/>
|
<linktarget COLOR="#2b53d4" DESTINATION="ID_255577978" ENDARROW="Default" ENDINCLINATION="443;20;" ID="Arrow_ID_57636127" SOURCE="ID_228507573" STARTARROW="None" STARTINCLINATION="320;11;"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1779327275881" ID="ID_1664117186" MODIFIED="1779327343009" TEXT="und noch ein weiterer Race läßt sich nicht ohne Weiteres schließen">
|
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1779327275881" FOLDED="true" ID="ID_1664117186" MODIFIED="1779579134158" TEXT="und noch ein weiterer Race läßt sich nicht ohne Weiteres schließen">
|
||||||
<linktarget COLOR="#b00581" DESTINATION="ID_1664117186" ENDARROW="Default" ENDINCLINATION="-937;0;" ID="Arrow_ID_1984536453" SOURCE="ID_344181114" STARTARROW="None" STARTINCLINATION="-349;22;"/>
|
<linktarget COLOR="#b00581" DESTINATION="ID_1664117186" ENDARROW="Default" ENDINCLINATION="-937;0;" ID="Arrow_ID_1984536453" SOURCE="ID_344181114" STARTARROW="None" STARTINCLINATION="-349;22;"/>
|
||||||
<icon BUILTIN="broken-line"/>
|
<icon BUILTIN="broken-line"/>
|
||||||
<node CREATED="1779327356588" ID="ID_1046958487" MODIFIED="1779327373060" TEXT="selbst mit einem solchen Schutzmechanismus..."/>
|
<node CREATED="1779327356588" ID="ID_1046958487" MODIFIED="1779327373060" TEXT="selbst mit einem solchen Schutzmechanismus..."/>
|
||||||
|
|
@ -147383,8 +147438,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
...denn letztlich dichte ich hier ein Restrisiko ab; es würde genügen, wenn der Thread nach dem Sperren des Empfangs noch einen Moment wartet, und dann erst die Eingangsqueue ausräumt. Wir können aber letztlich nicht verhindern, daß der Empfänger-Thread möglicherweise stirbt während der Sender-Thread grade mitten in der Zustellung ist, und durch äußere Umstände dabei ausgebremst wird. Um das zu verhindern, bräuchten wir einen Handshake — und dann wäre die Lösung <i>nicht mehr asynchron!</i>
|
...denn letztlich dichte ich hier ein Restrisiko ab; es würde genügen, wenn der Thread nach dem Sperren des Empfangs noch einen Moment wartet, und dann erst die Eingangsqueue ausräumt. Wir können aber letztlich nicht verhindern, daß der Empfänger-Thread möglicherweise stirbt während der Sender-Thread grade mitten in der Zustellung ist, und durch äußere Umstände dabei ausgebremst wird. Um das zu verhindern, bräuchten wir einen Handshake — und dann wäre die Lösung <i>nicht mehr asynchron!</i>
|
||||||
</p>
|
</p>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html></richcontent>
|
||||||
</richcontent>
|
|
||||||
<arrowlink COLOR="#b92d55" DESTINATION="ID_1344328276" ENDARROW="Default" ENDINCLINATION="341;-476;" ID="Arrow_ID_1052781255" STARTARROW="Default" STARTINCLINATION="-205;854;"/>
|
<arrowlink COLOR="#b92d55" DESTINATION="ID_1344328276" ENDARROW="Default" ENDINCLINATION="341;-476;" ID="Arrow_ID_1052781255" STARTARROW="Default" STARTINCLINATION="-205;854;"/>
|
||||||
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
|
|
@ -147395,7 +147449,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1778118843392" ID="ID_45310528" MODIFIED="1778118856450" TEXT="Eingang ≙ zurückgegebene Allokationen">
|
<node COLOR="#435e98" CREATED="1778118843392" ID="ID_45310528" MODIFIED="1779579144744" TEXT="Eingang ≙ zurückgegebene Allokationen">
|
||||||
<node CREATED="1778118860685" ID="ID_744369649" MODIFIED="1778118884334" TEXT="hier kommt eine Alloc, d.h. (Buffer-Adr, Size)"/>
|
<node CREATED="1778118860685" ID="ID_744369649" MODIFIED="1778118884334" TEXT="hier kommt eine Alloc, d.h. (Buffer-Adr, Size)"/>
|
||||||
<node CREATED="1778118904520" ID="ID_1909917635" MODIFIED="1778118915854" TEXT="diese werden alle intern konsumiert"/>
|
<node CREATED="1778118904520" ID="ID_1909917635" MODIFIED="1778118915854" TEXT="diese werden alle intern konsumiert"/>
|
||||||
<node CREATED="1778118916726" ID="ID_1993073258" MODIFIED="1778118979086">
|
<node CREATED="1778118916726" ID="ID_1993073258" MODIFIED="1778118979086">
|
||||||
|
|
@ -147436,7 +147490,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#338800" CREATED="1776819181261" ID="ID_1026628741" MODIFIED="1778694419297" TEXT="alternative synchrone Verbindung bereitstellen">
|
<node COLOR="#338800" CREATED="1776819181261" FOLDED="true" ID="ID_1026628741" MODIFIED="1778694419297" TEXT="alternative synchrone Verbindung bereitstellen">
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
<node CREATED="1777324291441" ID="ID_336948545" MODIFIED="1777324316333" TEXT="ist relevant für »sofort«-Allokation (Fallback)"/>
|
<node CREATED="1777324291441" ID="ID_336948545" MODIFIED="1777324316333" TEXT="ist relevant für »sofort«-Allokation (Fallback)"/>
|
||||||
<node COLOR="#5b280f" CREATED="1778692651060" ID="ID_526425164" MODIFIED="1778692684555" TEXT="erst mal eine synchrone API-Funktion bauen">
|
<node COLOR="#5b280f" CREATED="1778692651060" ID="ID_526425164" MODIFIED="1778692684555" TEXT="erst mal eine synchrone API-Funktion bauen">
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue