Index: src/libchcore/TTaskManager.cpp =================================================================== diff -u -N -r73583f2ca01fa1b2eae49bbc63bce46b9ecff5db -r293e52b38d46653068006262172018a0f0d0a31c --- src/libchcore/TTaskManager.cpp (.../TTaskManager.cpp) (revision 73583f2ca01fa1b2eae49bbc63bce46b9ecff5db) +++ src/libchcore/TTaskManager.cpp (.../TTaskManager.cpp) (revision 293e52b38d46653068006262172018a0f0d0a31c) @@ -33,7 +33,6 @@ TTaskManager::TTaskManager(const ISerializerFactoryPtr& spSerializerFactory, const IFeedbackHandlerFactoryPtr& spFeedbackHandlerFactory, bool bForceRecreateSerializer) : - m_stNextTaskID(NoTaskID + 1), m_spSerializerFactory(spSerializerFactory), m_spFeedbackFactory(spFeedbackHandlerFactory) { @@ -114,7 +113,7 @@ iOrder = rEntry.GetOrder() + 1; } - m_tTasks.Add(m_stNextTaskID++, spNewTask->GetSerializer()->GetLocation(), iOrder, spNewTask); + m_tTasks.Add(spNewTask->GetSerializer()->GetLocation(), iOrder, spNewTask); spNewTask->OnRegisterTask(); } @@ -449,36 +448,45 @@ void TTaskManager::Load() { - boost::unique_lock lock(m_lock); + // load list of tasks (without loading tasks themselves) + { + boost::unique_lock lock(m_lock); - if(!m_tTasks.IsEmpty()) - THROW_CORE_EXCEPTION(eErr_InternalProblem); + if(!m_tTasks.IsEmpty()) + THROW_CORE_EXCEPTION(eErr_InternalProblem); - ISerializerContainerPtr spContainer = m_spSerializer->GetContainer(_T("tasks")); - m_tTasks.Load(spContainer); + ISerializerContainerPtr spContainer = m_spSerializer->GetContainer(_T("tasks")); + m_tTasks.Load(spContainer); + } - // ensure that we assign nonexistent to new task IDs - m_stNextTaskID = m_tTasks.GetLastTaskID() + 1; + // retrieve information about tasks to load + std::vector > vObjects; + { + boost::shared_lock lock(m_lock); - // clear all modifications of freshly loaded tasks (in case serializer does - // not reset the modification state) - m_tTasks.ClearModifications(); + for(size_t stIndex = 0; stIndex < m_tTasks.GetCount(); ++stIndex) + { + TTaskInfoEntry& rEntry = m_tTasks.GetAt(stIndex); + if(!rEntry.GetTask()) + vObjects.push_back(std::make_pair(rEntry.GetObjectID(), rEntry.GetTaskSerializeLocation())); + } + } - for(size_t stIndex = 0; stIndex < m_tTasks.GetCount(); ++stIndex) + typedef std::pair PairInfo; + BOOST_FOREACH(const PairInfo& rInfo, vObjects) { - TTaskInfoEntry& rEntry = m_tTasks.GetAt(stIndex); + IFeedbackHandlerPtr spHandler = m_spFeedbackFactory->Create(); + ISerializerPtr spSerializer(m_spSerializerFactory->CreateSerializer(ISerializerFactory::eObj_Task, rInfo.second.ToWString())); - if(!rEntry.GetTask()) - { - IFeedbackHandlerPtr spHandler = m_spFeedbackFactory->Create(); - ISerializerPtr spSerializer(m_spSerializerFactory->CreateSerializer(ISerializerFactory::eObj_Task, rEntry.GetTaskSerializeLocation().ToWString())); + TTaskPtr spTask(new TTask(spSerializer, spHandler)); + spTask->Load(); - TTaskPtr spTask(new TTask(spSerializer, spHandler)); - spTask->Load(); + boost::unique_lock lock(m_lock); - rEntry.SetTask(spTask); - } + TTaskInfoEntry& rInfoEntry = m_tTasks.GetAtOid(rInfo.first); + rInfoEntry.SetTask(spTask); } + } TSmartPath TTaskManager::CreateTaskLogPath(const TString& strTaskUuid) const