CRef<SInternalData> SplitQuery_CreateChunkData(CRef<IQueryFactory> qf, CRef<CBlastOptions> options, CRef<SInternalData> full_data, bool is_multi_threaded /* = false */) { BlastSeqSrc* seqsrc = BlastSeqSrcCopy(full_data->m_SeqSrc->GetPointer()); CRef<SBlastSetupData> setup_data = BlastSetupPreliminarySearchEx( qf, options, CRef<objects::CPssmWithParameters>(), seqsrc, is_multi_threaded); BlastSeqSrcResetChunkIterator(seqsrc); setup_data->m_InternalData->m_SeqSrc.Reset(new TBlastSeqSrc(seqsrc, BlastSeqSrcFree)); _ASSERT(setup_data->m_QuerySplitter->IsQuerySplit() == false); if (full_data->m_ProgressMonitor->Get()) { setup_data->m_InternalData->m_FnInterrupt = full_data->m_FnInterrupt; SBlastProgress* bp = SBlastProgressNew(full_data->m_ProgressMonitor->Get()->user_data); setup_data->m_InternalData->m_ProgressMonitor.Reset(new CSBlastProgress(bp)); } return setup_data->m_InternalData; }
CPrelimSearchThread(SInternalData& internal_data, const CBlastOptionsMemento* opts_memento) : m_InternalData(internal_data), m_OptsMemento(opts_memento) { // The following fields need to be copied to ensure MT-safety BlastSeqSrc* seqsrc = BlastSeqSrcCopy(m_InternalData.m_SeqSrc->GetPointer()); m_InternalData.m_SeqSrc.Reset(new TBlastSeqSrc(seqsrc, BlastSeqSrcFree)); // The progress field must be copied to ensure MT-safety if (m_InternalData.m_ProgressMonitor->Get()) { SBlastProgress* bp = SBlastProgressNew(m_InternalData.m_ProgressMonitor->Get()->user_data); m_InternalData.m_ProgressMonitor.Reset(new CSBlastProgress(bp)); } }