| 1019 | } |
| 1020 | |
| 1021 | void PairEndProcessor::processorTask(ThreadConfig* config) |
| 1022 | { |
| 1023 | SingleProducerSingleConsumerList<ReadPack*>* inputLeft = config->getLeftInput(); |
| 1024 | SingleProducerSingleConsumerList<ReadPack*>* inputRight = config->getRightInput(); |
| 1025 | while(true) { |
| 1026 | if(config->canBeStopped()){ |
| 1027 | break; |
| 1028 | } |
| 1029 | while(inputLeft->canBeConsumed() && inputRight->canBeConsumed()) { |
| 1030 | ReadPack* dataLeft = inputLeft->consume(); |
| 1031 | ReadPack* dataRight = inputRight->consume(); |
| 1032 | processPairEnd(dataLeft, dataRight, config); |
| 1033 | } |
| 1034 | if(inputLeft->isProducerFinished() && !inputLeft->canBeConsumed()) { |
| 1035 | break; |
| 1036 | } else if(inputRight->isProducerFinished() && !inputRight->canBeConsumed()) { |
| 1037 | break; |
| 1038 | } else { |
| 1039 | std::unique_lock<std::mutex> lk(mBackpressureMtx); |
| 1040 | mBackpressureCV.wait_for(lk, std::chrono::milliseconds(1)); |
| 1041 | } |
| 1042 | } |
| 1043 | inputLeft->setConsumerFinished(); |
| 1044 | inputRight->setConsumerFinished(); |
| 1045 | |
| 1046 | int finishedCount = mFinishedThreads.fetch_add(1, std::memory_order_release) + 1; |
| 1047 | if(mOptions->verbose) { |
| 1048 | string msg = "thread " + to_string(config->getThreadId() + 1) + " data processing completed"; |
| 1049 | loginfo(msg); |
| 1050 | } |
| 1051 | |
| 1052 | if(finishedCount == mOptions->thread) { |
| 1053 | if(mLeftWriter) |
| 1054 | mLeftWriter->setInputCompleted(); |
| 1055 | if(mRightWriter) |
| 1056 | mRightWriter->setInputCompleted(); |
| 1057 | if(mUnpairedLeftWriter) |
| 1058 | mUnpairedLeftWriter->setInputCompleted(); |
| 1059 | if(mUnpairedRightWriter) |
| 1060 | mUnpairedRightWriter->setInputCompleted(); |
| 1061 | if(mMergedWriter) |
| 1062 | mMergedWriter->setInputCompleted(); |
| 1063 | if(mFailedWriter) |
| 1064 | mFailedWriter->setInputCompleted(); |
| 1065 | if(mOverlappedWriter) |
| 1066 | mOverlappedWriter->setInputCompleted(); |
| 1067 | } |
| 1068 | |
| 1069 | if(mOptions->verbose) { |
| 1070 | string msg = "thread " + to_string(config->getThreadId() + 1) + " finished"; |
| 1071 | loginfo(msg); |
| 1072 | } |
| 1073 | } |
| 1074 | |
| 1075 | void PairEndProcessor::writerTask(WriterThread* config) |
| 1076 | { |
nothing calls this directly
no test coverage detected