diff --git a/src/Manager.cpp b/src/Manager.cpp index ec86b18ed..5c7a2d3be 100644 --- a/src/Manager.cpp +++ b/src/Manager.cpp @@ -59,7 +59,10 @@ Manager::~Manager() } if (this->mManagedSequences.size()) { - SPDLOG_DEBUG("Releasing managed sequence"); + SPDLOG_DEBUG("Kompute Manager explicitly running destructor for managed sequences"); + for (const std::pair> &sqPair : this->mManagedSequences) { + sqPair.second->~Sequence(); + } this->mManagedSequences.clear(); } @@ -91,7 +94,7 @@ Manager::~Manager() } } -std::weak_ptr +std::shared_ptr Manager::getOrCreateManagedSequence(std::string sequenceName) { SPDLOG_DEBUG("Kompute Manager creating Sequence object"); @@ -106,7 +109,7 @@ Manager::getOrCreateManagedSequence(std::string sequenceName) } } -std::weak_ptr +std::shared_ptr Manager::createManagedSequence(std::string sequenceName, uint32_t queueIndex) { diff --git a/src/Sequence.cpp b/src/Sequence.cpp index c4446ff37..0f6eccfd2 100644 --- a/src/Sequence.cpp +++ b/src/Sequence.cpp @@ -27,9 +27,15 @@ Sequence::~Sequence() { SPDLOG_DEBUG("Kompute Sequence Destructor started"); + if (!this->mIsInit) { + SPDLOG_WARN("Kompute Sequence destructor called but sequence is not initialized."); + return; + } + if (!this->mDevice) { SPDLOG_ERROR( "Kompute Sequence destructor reached with null Device pointer"); + this->mIsInit = false; return; } @@ -38,6 +44,7 @@ Sequence::~Sequence() if (!this->mCommandBuffer) { SPDLOG_ERROR("Kompute Sequence destructor reached with null " "CommandPool pointer"); + this->mIsInit = false; return; } this->mDevice->freeCommandBuffers( @@ -50,11 +57,14 @@ Sequence::~Sequence() if (this->mCommandPool == nullptr) { SPDLOG_ERROR("Kompute Sequence destructor reached with null " "CommandPool pointer"); + this->mIsInit = false; return; } this->mDevice->destroy(*this->mCommandPool, (vk::Optional)nullptr); SPDLOG_DEBUG("Kompute Sequence Destroyed CommandPool"); } + + this->mIsInit = false; } void diff --git a/src/include/kompute/Manager.hpp b/src/include/kompute/Manager.hpp index 32c04535b..98e8e82c5 100644 --- a/src/include/kompute/Manager.hpp +++ b/src/include/kompute/Manager.hpp @@ -63,9 +63,9 @@ class Manager * * @param sequenceName The name for the named sequence to be retrieved or * created - * @return Weak pointer to the manager owned sequence resource + * @return Shared pointer to the manager owned sequence resource */ - std::weak_ptr getOrCreateManagedSequence( + std::shared_ptr getOrCreateManagedSequence( std::string sequenceName); /** @@ -77,7 +77,7 @@ class Manager * @param queueIndex The queue to use from the available queues * @return Weak pointer to the manager owned sequence resource */ - std::weak_ptr createManagedSequence(std::string sequenceName = "", + std::shared_ptr createManagedSequence(std::string sequenceName = "", uint32_t queueIndex = 0); /** @@ -94,22 +94,21 @@ class Manager TArgs&&... params) { SPDLOG_DEBUG("Kompute Manager evalOp triggered"); - std::weak_ptr sqWeakPtr = + std::shared_ptr sq = this->getOrCreateManagedSequence(sequenceName); - if (std::shared_ptr sq = sqWeakPtr.lock()) { - SPDLOG_DEBUG("Kompute Manager evalOp running sequence BEGIN"); - sq->begin(); + SPDLOG_DEBUG("Kompute Manager evalOp running sequence BEGIN"); + sq->begin(); - SPDLOG_DEBUG("Kompute Manager evalOp running sequence RECORD"); - sq->record(tensors, std::forward(params)...); + SPDLOG_DEBUG("Kompute Manager evalOp running sequence RECORD"); + sq->record(tensors, std::forward(params)...); - SPDLOG_DEBUG("Kompute Manager evalOp running sequence END"); - sq->end(); + SPDLOG_DEBUG("Kompute Manager evalOp running sequence END"); + sq->end(); + + SPDLOG_DEBUG("Kompute Manager evalOp running sequence EVAL"); + sq->eval(); - SPDLOG_DEBUG("Kompute Manager evalOp running sequence EVAL"); - sq->eval(); - } SPDLOG_DEBUG("Kompute Manager evalOp running sequence SUCCESS"); } @@ -147,26 +146,21 @@ class Manager { SPDLOG_DEBUG("Kompute Manager evalOpAsync triggered"); - std::weak_ptr sqWeakPtr = + std::shared_ptr sq = this->getOrCreateManagedSequence(sequenceName); - if (std::shared_ptr sq = sqWeakPtr.lock()) { + SPDLOG_DEBUG("Kompute Manager evalOpAsync running sequence BEGIN"); + sq->begin(); - SPDLOG_DEBUG("Kompute Manager evalOpAsync running sequence BEGIN"); - sq->begin(); + SPDLOG_DEBUG("Kompute Manager evalOpAsync running sequence RECORD"); + sq->record(tensors, std::forward(params)...); - SPDLOG_DEBUG("Kompute Manager evalOpAsync running sequence RECORD"); - sq->record(tensors, std::forward(params)...); + SPDLOG_DEBUG("Kompute Manager evalOpAsync running sequence END"); + sq->end(); - SPDLOG_DEBUG("Kompute Manager evalOpAsync running sequence END"); - sq->end(); + SPDLOG_DEBUG("Kompute Manager evalOpAsync running sequence EVAL"); + sq->evalAsync(); - SPDLOG_DEBUG("Kompute Manager evalOpAsync running sequence EVAL"); - sq->evalAsync(); - } else { - SPDLOG_ERROR("Kompute Manager evalOpAsync sequence [{}] not found", - sequenceName); - } SPDLOG_DEBUG("Kompute Manager evalOpAsync running sequence SUCCESS"); }