From f14329081ed4a5a7c1c857c3584a1b9b20c70ba9 Mon Sep 17 00:00:00 2001 From: Maarten Hilferink Date: Tue, 4 Apr 2023 13:45:43 +0200 Subject: [PATCH] Reverted std::weak_ptr back to SharedPtr in DelayedTileFunctor: a TileFunctor must be able to deliver (future)tiles optimally as long as it exists. --- clc/dll/include/CastedUnaryAttrOper.h | 2 +- clc/dll/include/OperAttrBin.h | 2 +- clc/dll/include/OperAttrTer.h | 2 +- clc/dll/include/OperAttrUni.h | 2 +- clc/dll/src1/RLookup.ipp | 2 +- clc/dll/src1/lookup.cpp | 2 +- clc/dll/src2/OperConv.cpp | 4 ++-- tic/dll/src/AbstrDataObject.h | 4 ++-- tic/dll/src/DataArray.cpp | 1 - tic/dll/src/DataArray.h | 8 +++---- tic/dll/src/TileFunctorImpl.h | 30 +++++++-------------------- tic/dll/src/TreeItem.cpp | 15 ++++---------- tic/dll/src/TreeItem.h | 1 + 13 files changed, 26 insertions(+), 49 deletions(-) diff --git a/clc/dll/include/CastedUnaryAttrOper.h b/clc/dll/include/CastedUnaryAttrOper.h index 216bb5b20..b4f8190f5 100644 --- a/clc/dll/include/CastedUnaryAttrOper.h +++ b/clc/dll/include/CastedUnaryAttrOper.h @@ -257,7 +257,7 @@ class CastedUnaryAttrSpecialFuncOperator : public AbstrCastedUnaryAttrOperator auto arg1 = SharedPtr(const_array_cast(arg1A)); dms_assert(arg1); - using prepare_data = std::shared_ptr; + using prepare_data = SharedPtr; auto futureTileFunctor = make_unique_FutureTileFunctor(tileRangeData, get_range_ptr_of_valuesunit(valuesUnit), tileRangeData->GetNrTiles() , [arg1](tile_id t) { return arg1->GetFutureTile(t); } diff --git a/clc/dll/include/OperAttrBin.h b/clc/dll/include/OperAttrBin.h index 45c8a7235..eeb66e834 100644 --- a/clc/dll/include/OperAttrBin.h +++ b/clc/dll/include/OperAttrBin.h @@ -149,7 +149,7 @@ struct BinaryAttrOper : AbstrBinaryAttrOper auto arg1 = SharedPtr(const_array_cast(arg1A)); assert(arg1); auto arg2 = SharedPtr(const_array_cast(arg2A)); assert(arg2); - using prepare_data = std::pair, std::shared_ptr>; + using prepare_data = std::pair, SharedPtr>; auto futureTileFunctor = make_unique_FutureTileFunctor(tileRangeData, get_range_ptr_of_valuesunit(valuesUnit), tileRangeData->GetNrTiles() , [arg1, arg2, af](tile_id t) { return prepare_data{ arg1->GetFutureTile(af & AF1_ISPARAM ? 0 : t), arg2->GetFutureTile(af & AF2_ISPARAM ? 0 : t) }; } , [this, af MG_DEBUG_ALLOCATOR_SRC_PARAM](sequence_traits::seq_t resData, prepare_data futureData) diff --git a/clc/dll/include/OperAttrTer.h b/clc/dll/include/OperAttrTer.h index f3e940fff..6c0d07e43 100644 --- a/clc/dll/include/OperAttrTer.h +++ b/clc/dll/include/OperAttrTer.h @@ -156,7 +156,7 @@ struct TernaryAttrOper : AbstrTernaryAttrOper auto arg2 = SharedPtr(const_array_cast(arg2A)); assert(arg2); auto arg3 = SharedPtr(const_array_cast(arg3A)); assert(arg3); - using prepare_data = std::tuple, std::shared_ptr, std::shared_ptr>; + using prepare_data = std::tuple, SharedPtr, SharedPtr>; auto futureTileFunctor = make_unique_FutureTileFunctor(tileRangeData, get_range_ptr_of_valuesunit(valuesUnit), tileRangeData->GetNrTiles() , [arg1, arg2, arg3, af](tile_id t) { return prepare_data{ arg1->GetFutureTile(af & AF1_ISPARAM ? 0 : t), arg2->GetFutureTile(af & AF2_ISPARAM ? 0 : t), arg3->GetFutureTile(af & AF3_ISPARAM ? 0 : t) }; } , [this, af MG_DEBUG_ALLOCATOR_SRC_PARAM](sequence_traits::seq_t resData, prepare_data futureData) diff --git a/clc/dll/include/OperAttrUni.h b/clc/dll/include/OperAttrUni.h index bac8e273a..ffce1991a 100644 --- a/clc/dll/include/OperAttrUni.h +++ b/clc/dll/include/OperAttrUni.h @@ -139,7 +139,7 @@ struct UnaryAttrOperator : AbstrUnaryAttrOperator auto arg1 = SharedPtr(const_array_cast(arg1A)); assert(arg1); - using prepare_data = std::shared_ptr; + using prepare_data = SharedPtr; auto futureTileFunctor = make_unique_FutureTileFunctor(tileRangeData, get_range_ptr_of_valuesunit(valuesUnit), tileRangeData->GetNrTiles() , [arg1, af](tile_id t) { return arg1->GetFutureTile(t); } , [this, af MG_DEBUG_ALLOCATOR_SRC_PARAM](sequence_traits::seq_t resData, prepare_data futureData) diff --git a/clc/dll/src1/RLookup.ipp b/clc/dll/src1/RLookup.ipp index 9e18adf1c..d21054631 100644 --- a/clc/dll/src1/RLookup.ipp +++ b/clc/dll/src1/RLookup.ipp @@ -149,7 +149,7 @@ public: auto arg1 = SharedPtr(const_array_cast(arg1A)); dms_assert(arg1); auto indexBoxPtr = std::make_shared(std::move(indexBox)); - using prepare_data = std::shared_ptr::future_tile>; + using prepare_data = SharedPtr::future_tile>; std::unique_ptr futureTileFunctor; visit(arg2DomainA diff --git a/clc/dll/src1/lookup.cpp b/clc/dll/src1/lookup.cpp index 25dba68c1..bead008d1 100644 --- a/clc/dll/src1/lookup.cpp +++ b/clc/dll/src1/lookup.cpp @@ -187,7 +187,7 @@ class LookupOperator : public AbstrLookupOperator auto valuesData = std::any_cast::locked_cseq_t>(wrappedValuesArray); dms_assert(valuesData); - using prepare_data = std::shared_ptr; + using prepare_data = SharedPtr; auto futureTileFunctor = make_unique_FutureTileFunctor(tileRangeData, get_range_ptr_of_valuesunit(valuesUnit), tileRangeData->GetNrTiles() , [arg1](tile_id t) { return arg1->GetFutureTile(t); } , [this, dcmArg1, actualIndexRange, valuesData MG_DEBUG_ALLOCATOR_SRC_PARAM](sequence_traits::seq_t resData, prepare_data futureData) diff --git a/clc/dll/src2/OperConv.cpp b/clc/dll/src2/OperConv.cpp index 8991a4e6b..b2d58b3b6 100644 --- a/clc/dll/src2/OperConv.cpp +++ b/clc/dll/src2/OperConv.cpp @@ -851,7 +851,7 @@ class TransformAttrOperator : public AbstrCastedUnaryAttrOperator auto arg2 = SharedPtr(debug_cast(argUnitA)); dms_assert(arg1); - using prepare_data = std::shared_ptr; + using prepare_data = SharedPtr; auto futureTileFunctor = make_unique_FutureTileFunctor(tileRangeData, get_range_ptr_of_valuesunit(valuesUnit), tileRangeData->GetNrTiles() , [arg1](tile_id t) { return arg1->GetFutureTile(t); } , [arg2, arg1A](sequence_traits::seq_t resData, prepare_data arg1FutureData) @@ -904,7 +904,7 @@ class ConvertAttrOperator : public AbstrCastedUnaryAttrOperator auto arg2 = SharedPtr(debug_cast(argUnitA)); dms_assert(arg1); - using prepare_data = std::shared_ptr; + using prepare_data = SharedPtr; auto futureTileFunctor = make_unique_FutureTileFunctor(tileRangeData, get_range_ptr_of_valuesunit(valuesUnit), tileRangeData->GetNrTiles() , [arg1](tile_id t) { return arg1->GetFutureTile(t); } , [arg2, arg1A](sequence_traits::seq_t resData, prepare_data arg1FutureData) diff --git a/tic/dll/src/AbstrDataObject.h b/tic/dll/src/AbstrDataObject.h index e7dc2cf1b..e90f14ef1 100644 --- a/tic/dll/src/AbstrDataObject.h +++ b/tic/dll/src/AbstrDataObject.h @@ -72,7 +72,7 @@ struct ptr : ptr_base explicit ptr(T* p) : ptr_base( p ) {} }; -struct abstr_future_tile : std::enable_shared_from_this +struct abstr_future_tile : TileBase { virtual auto GetTileCRef() -> TileCRef = 0; }; @@ -103,7 +103,7 @@ class AbstrDataObject: public PersistentSharedObj TIC_CALL tile_loc GetTiledLocation(row_id idx) const; // Abstr Tile retention - virtual auto GetFutureAbstrTile(tile_id t) const-> std::shared_ptr = 0; + virtual auto GetFutureAbstrTile(tile_id t) const-> SharedPtr = 0; virtual auto GetReadableTileLock(tile_id t) const->TileCRef = 0; // TODO G8: REMOVE virtual auto GetWritableTileLock(tile_id t, dms_rw_mode rwMode = dms_rw_mode::read_write)->TileRef = 0; // TODO G8: REMOVE diff --git a/tic/dll/src/DataArray.cpp b/tic/dll/src/DataArray.cpp index 382353d53..2fcc1e575 100644 --- a/tic/dll/src/DataArray.cpp +++ b/tic/dll/src/DataArray.cpp @@ -70,7 +70,6 @@ granted by an additional written contract for support, assistance and/or develop // Shadow creation //---------------------------------------------------------------------- -TIC_CALL std::recursive_mutex s_CsFutureTileCreation; std::mutex s_mutableTileRecSection; template diff --git a/tic/dll/src/DataArray.h b/tic/dll/src/DataArray.h index ab273e3d3..8668688d3 100644 --- a/tic/dll/src/DataArray.h +++ b/tic/dll/src/DataArray.h @@ -137,8 +137,8 @@ struct DataArrayBase : AbstrDataObject } }; - TICTOC_CALL virtual auto GetFutureTile(tile_id t) const -> std::shared_ptr = 0; - auto GetFutureAbstrTile(tile_id t) const -> std::shared_ptr override + TICTOC_CALL virtual auto GetFutureTile(tile_id t) const -> SharedPtr = 0; + auto GetFutureAbstrTile(tile_id t) const -> SharedPtr override { return GetFutureTile(t); } @@ -344,9 +344,9 @@ struct GeneratedTileFunctor : TileFunctor SharedPtr> self; }; - auto GetFutureTile(tile_id t) const -> std::shared_ptr override + auto GetFutureTile(tile_id t) const -> SharedPtr override { - return std::make_shared(t, this); + return new future_caller{t, this}; } }; diff --git a/tic/dll/src/TileFunctorImpl.h b/tic/dll/src/TileFunctorImpl.h index f008831de..e157e218b 100644 --- a/tic/dll/src/TileFunctorImpl.h +++ b/tic/dll/src/TileFunctorImpl.h @@ -48,23 +48,20 @@ granted by an additional written contract for support, assistance and/or develop #include "mem/TileData.h" #include "ser/VectorStream.h" -TIC_CALL extern std::recursive_mutex s_CsFutureTileCreation; - template struct DelayedTileFunctor : TileFunctor { using future_tile = TileFunctor::future_tile; using locked_cseq_t = TileFunctor::locked_cseq_t; - using cache_t = std::unique_ptr[]>; + using cache_t = std::unique_ptr[]>; cache_t m_ActiveTiles; // std::unique_ptr m_Mutices; DelayedTileFunctor(const AbstrTileRangeData* tiledDomainRangeData, range_data_ptr_or_void> valueRangePtr, tile_id tn MG_DEBUG_ALLOCATOR_SRC_ARG) : TileFunctor(tiledDomainRangeData, valueRangePtr MG_DEBUG_ALLOCATOR_SRC_PARAM) - , m_ActiveTiles(std::make_unique[]>(tn)) -// , m_Mutices(std::make_unique(tn)) + , m_ActiveTiles(std::make_unique[]>(tn)) { MG_CHECK(tiledDomainRangeData); MG_CHECK(tiledDomainRangeData->GetNrTiles() == tn); @@ -74,16 +71,9 @@ struct DelayedTileFunctor : TileFunctor } } - auto GetFutureTile(tile_id t) const -> std::shared_ptr override + auto GetFutureTile(tile_id t) const -> SharedPtr override { - auto lockTileGeneration = std::lock_guard(s_CsFutureTileCreation); - auto result = m_ActiveTiles[t].lock(); - if (!result) - { - result = CreateFutureTile(t); - m_ActiveTiles[t] = result; - } - return result; + return m_ActiveTiles[t]; } auto GetTile(tile_id t) const->locked_cseq_t override { @@ -91,9 +81,6 @@ struct DelayedTileFunctor : TileFunctor return GetFutureTile(t)->GetTile(); } - - virtual auto CreateFutureTile(tile_id t) const -> std::shared_ptr = 0; - }; template @@ -131,7 +118,7 @@ struct FutureTileFunctor : DelayedTileFunctor m_State.emplace<1>(std::move(resData)); } dms_assert(m_State.index() == 1); - return locked_cseq_t(make_SharedThing(this->shared_from_this()), GetConstSeq(std::get<1>(m_State))); + return locked_cseq_t(this, GetConstSeq(std::get<1>(m_State))); } std::mutex m_Mutex; future_state m_State; @@ -140,11 +127,6 @@ struct FutureTileFunctor : DelayedTileFunctor #endif }; - auto CreateFutureTile(tile_id t) const -> std::shared_ptr override - { - return std::make_shared(pFunc(t), aFunc, this->m_TileRangeData->GetTileSize(t) MG_DEBUG_ALLOCATOR_SRC(md_SrcStr)); - } - FutureTileFunctor(const AbstrTileRangeData* tiledDomainRangeData, range_data_ptr_or_void> valueRangePtr, tile_id tn , PrepareFunc&& pFunc_, ApplyFunc&& aFunc_ MG_DEBUG_ALLOCATOR_SRC_ARG) : DelayedTileFunctor(tiledDomainRangeData, valueRangePtr, tn MG_DEBUG_ALLOCATOR_SRC_PARAM) @@ -155,6 +137,8 @@ struct FutureTileFunctor : DelayedTileFunctor #endif { dms_assert(tn > 1); + for (tile_id t = 0; t != tn; ++t) + this->m_ActiveTiles[t] = new tile_record(pFunc(t), aFunc, tiledDomainRangeData->GetTileSize(t) MG_DEBUG_ALLOCATOR_SRC_PARAM); } PrepareFunc pFunc; diff --git a/tic/dll/src/TreeItem.cpp b/tic/dll/src/TreeItem.cpp index 591bae08d..60c24b1b9 100644 --- a/tic/dll/src/TreeItem.cpp +++ b/tic/dll/src/TreeItem.cpp @@ -3753,6 +3753,10 @@ const TreeItem* FindTreeItemByID(const TreeItem* searchLoc, TokenID subItemID) // InterestCount management //---------------------------------------------------------------------- +#include "DataArray.h" + +//mc_IntegrityCheckTiles + #if defined(MG_DEBUG_DATASTORELOCK) UInt32 sd_ItemInterestCounter = 0; #endif @@ -3771,15 +3775,8 @@ void TreeItem::StartInterest() const SharedPtr refItem = GetReferredItem(); -// dms_assert(IsCacheItem() || !IsDcKnown()); - -// MapExternalSourceHandle externalSourceHandle(this); -// dms_assert(IsCacheItem() || IsDcKnown() || !externalSourceHandle.m_Self); -// dms_assert(IsDcKnown() || !IsKnown()); - SharedActorInterestPtr calcHolder = mc_DC.get_ptr(); SharedTreeItemInterestPtr refItemHolder = refItem; -// SharedActorInterestPtr checkerHolder = HasIntegrityChecker() ? GetIntegrityChecker() : nullptr; SharedTreeItemInterestPtr parentHolder = GetTreeParent(); // IsCacheItem() ? GetTreeParent() : nullptr; Actor::StartInterest(); @@ -3795,12 +3792,8 @@ void TreeItem::StartInterest() const } // nothrow from here, avoid rollbacks and release the InterestHolders without releasing the interest parentHolder.release(); -// checkerHolder.release(); refItemHolder.release(); calcHolder.release(); -// externalSourceHandle.m_Self = nullptr; -// dms_assert(!mc_Calculator || mc_Calculator->GetRefCount() == 1 && mc_Calculator->GetInterestCount() == 1); - unlockDsmUsageCounter.release(); #if defined(MG_DEBUG_DATASTORELOCK) ++sd_ItemInterestCounter; diff --git a/tic/dll/src/TreeItem.h b/tic/dll/src/TreeItem.h index 68f798d1b..082ec0ea2 100644 --- a/tic/dll/src/TreeItem.h +++ b/tic/dll/src/TreeItem.h @@ -66,6 +66,7 @@ struct OperationContext; struct UsingCache; struct SupplCache; struct SourceLocation; + class AbstrCalculator; using TreeItemList = single_linked_list;