Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-05-11 03:34:15

0001 #include "FWCore/Framework/interface/ProductProvenanceRetriever.h"
0002 #include "DataFormats/Provenance/interface/ProductRegistry.h"
0003 #include "FWCore/Utilities/interface/EDMException.h"
0004 
0005 #include <cassert>
0006 #include <limits>
0007 
0008 /*
0009   ProductProvenanceRetriever
0010 */
0011 
0012 namespace edm {
0013   ProductProvenanceRetriever::ProductProvenanceRetriever(unsigned int iTransitionIndex)
0014       : ProductProvenanceLookup(), nextRetriever_(), provenanceReader_(), transitionIndex_(iTransitionIndex) {}
0015 
0016   ProductProvenanceRetriever::ProductProvenanceRetriever(unsigned int iTransitionIndex,
0017                                                          edm::ProductRegistry const& iReg)
0018       : ProductProvenanceLookup(iReg), nextRetriever_(), provenanceReader_(), transitionIndex_(iTransitionIndex) {}
0019 
0020   ProductProvenanceRetriever::ProductProvenanceRetriever(std::unique_ptr<ProvenanceReaderBase> reader)
0021       : ProductProvenanceLookup(),
0022         nextRetriever_(),
0023         provenanceReader_(reader.release()),
0024         transitionIndex_(std::numeric_limits<unsigned int>::max()) {
0025     assert(provenanceReader_);
0026   }
0027 
0028   std::unique_ptr<const std::set<ProductProvenance>> ProductProvenanceRetriever::readProvenance() const {
0029     std::unique_ptr<const std::set<ProductProvenance>> temp;
0030     if (provenanceReader_) {
0031       temp = std::make_unique<std::set<ProductProvenance> const>(provenanceReader_->readProvenance(transitionIndex_));
0032     }
0033     return temp;
0034   }
0035 
0036   void ProductProvenanceRetriever::readProvenanceAsync(
0037       WaitingTaskHolder task, ModuleCallingContext const* moduleCallingContext) const noexcept {
0038     if (provenanceReader_ and nullptr == readEntryInfoSet_.load()) {
0039       provenanceReader_->readProvenanceAsync(task, moduleCallingContext, transitionIndex_, readEntryInfoSet_);
0040     }
0041     if (nextRetriever_) {
0042       nextRetriever_->readProvenanceAsync(task, moduleCallingContext);
0043     }
0044   }
0045 
0046   void ProductProvenanceRetriever::deepCopy(ProductProvenanceRetriever const& iFrom) {
0047     if (iFrom.readEntryInfoSet_) {
0048       if (readEntryInfoSet_) {
0049         delete readEntryInfoSet_.exchange(nullptr);
0050       }
0051       readEntryInfoSet_ = new std::set<ProductProvenance>(*iFrom.readEntryInfoSet_);
0052     } else {
0053       if (readEntryInfoSet_) {
0054         delete readEntryInfoSet_.load();
0055         readEntryInfoSet_ = nullptr;
0056       }
0057     }
0058     assert(iFrom.entryInfoSet_.empty());
0059     provenanceReader_ = iFrom.provenanceReader_;
0060 
0061     if (iFrom.nextRetriever_) {
0062       if (not nextRetriever_) {
0063         nextRetriever_ = std::make_shared<ProductProvenanceRetriever>(transitionIndex_);
0064       }
0065       nextRetriever_->deepCopy(*(iFrom.nextRetriever_));
0066     }
0067   }
0068 
0069   void ProductProvenanceRetriever::reset() {
0070     delete readEntryInfoSet_.load();
0071     readEntryInfoSet_ = nullptr;
0072     for (auto& e : entryInfoSet_) {
0073       e.resetParentage();
0074     }
0075     if (nextRetriever_) {
0076       nextRetriever_->reset();
0077     }
0078     parentProcessRetriever_ = nullptr;
0079   }
0080 
0081   void ProductProvenanceRetriever::mergeProvenanceRetrievers(std::shared_ptr<ProductProvenanceRetriever> other) {
0082     nextRetriever_ = other;
0083   }
0084 
0085   void ProductProvenanceRetriever::mergeParentProcessRetriever(ProductProvenanceRetriever const& provRetriever) {
0086     parentProcessRetriever_ = &provRetriever;
0087   }
0088 
0089   ProvenanceReaderBase::~ProvenanceReaderBase() {}
0090 }  // namespace edm