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