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