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));
     }
 }