Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-05-23 02:04:59

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   void ProvenanceReaderBase::unsafe_fillProvenance(unsigned int transitionIndex) const {}
0014 
0015   ProductProvenanceRetriever::ProductProvenanceRetriever(unsigned int iTransitionIndex)
0016       : ProductProvenanceLookup(), nextRetriever_(), provenanceReader_(), transitionIndex_(iTransitionIndex) {}
0017 
0018   ProductProvenanceRetriever::ProductProvenanceRetriever(unsigned int iTransitionIndex,
0019                                                          edm::ProductRegistry const& iReg)
0020       : ProductProvenanceLookup(iReg), nextRetriever_(), provenanceReader_(), transitionIndex_(iTransitionIndex) {}
0021 
0022   ProductProvenanceRetriever::ProductProvenanceRetriever(unsigned int iTransitionIndex,
0023                                                          std::unique_ptr<ProvenanceReaderBase> reader)
0024       : ProductProvenanceLookup(),
0025         nextRetriever_(),
0026         provenanceReader_(reader.release()),
0027         transitionIndex_(iTransitionIndex) {
0028     assert(provenanceReader_);
0029   }
0030 
0031   std::unique_ptr<const std::set<ProductProvenance>> ProductProvenanceRetriever::readProvenance() const {
0032     std::unique_ptr<const std::set<ProductProvenance>> temp;
0033     if (provenanceReader_) {
0034       temp = std::make_unique<std::set<ProductProvenance> const>(provenanceReader_->readProvenance(transitionIndex_));
0035     }
0036     return temp;
0037   }
0038 
0039   void ProductProvenanceRetriever::readProvenanceAsync(
0040       WaitingTaskHolder task, ModuleCallingContext const* moduleCallingContext) const noexcept {
0041     if (provenanceReader_ and nullptr == readEntryInfoSet_.load()) {
0042       provenanceReader_->readProvenanceAsync(task, moduleCallingContext, transitionIndex_, readEntryInfoSet_);
0043     }
0044     if (nextRetriever_) {
0045       nextRetriever_->readProvenanceAsync(task, moduleCallingContext);
0046     }
0047   }
0048 
0049   void ProductProvenanceRetriever::deepCopy(ProductProvenanceRetriever const& iFrom) {
0050     if (iFrom.readEntryInfoSet_) {
0051       if (readEntryInfoSet_) {
0052         delete readEntryInfoSet_.exchange(nullptr);
0053       }
0054       readEntryInfoSet_ = new std::set<ProductProvenance>(*iFrom.readEntryInfoSet_);
0055     } else {
0056       if (readEntryInfoSet_) {
0057         delete readEntryInfoSet_.load();
0058         readEntryInfoSet_ = nullptr;
0059       }
0060     }
0061     assert(iFrom.entryInfoSet_.empty());
0062     provenanceReader_ = iFrom.provenanceReader_;
0063 
0064     if (iFrom.nextRetriever_) {
0065       if (not nextRetriever_) {
0066         nextRetriever_ = std::make_shared<ProductProvenanceRetriever>(transitionIndex_);
0067       }
0068       nextRetriever_->deepCopy(*(iFrom.nextRetriever_));
0069     }
0070   }
0071 
0072   void ProductProvenanceRetriever::reset() {
0073     delete readEntryInfoSet_.load();
0074     readEntryInfoSet_ = nullptr;
0075     for (auto& e : entryInfoSet_) {
0076       e.resetParentage();
0077     }
0078     if (nextRetriever_) {
0079       nextRetriever_->reset();
0080     }
0081     parentProcessRetriever_ = nullptr;
0082   }
0083 
0084   void ProductProvenanceRetriever::mergeProvenanceRetrievers(std::shared_ptr<ProductProvenanceRetriever> other) {
0085     nextRetriever_ = other;
0086   }
0087 
0088   void ProductProvenanceRetriever::mergeParentProcessRetriever(ProductProvenanceRetriever const& provRetriever) {
0089     parentProcessRetriever_ = &provRetriever;
0090   }
0091 
0092   void ProductProvenanceRetriever::unsafe_fillProvenance() {
0093     provenanceReader_->unsafe_fillProvenance(transitionIndex_);
0094   }
0095 
0096   ProvenanceReaderBase::~ProvenanceReaderBase() {}
0097 }  // namespace edm