File indexing completed on 2025-05-23 02:04:58
0001 #ifndef DataFormats_Provenance_ProductProvenanceRetriever_h
0002 #define DataFormats_Provenance_ProductProvenanceRetriever_h
0003
0004
0005
0006
0007
0008
0009 #include "DataFormats/Provenance/interface/ProductProvenance.h"
0010 #include "DataFormats/Provenance/interface/ProductProvenanceLookup.h"
0011 #include "FWCore/Concurrency/interface/WaitingTaskHolder.h"
0012 #include "FWCore/Utilities/interface/propagate_const.h"
0013
0014 #include <memory>
0015 #include <set>
0016 #include <atomic>
0017
0018
0019
0020
0021
0022 namespace edm {
0023 class ModuleCallingContext;
0024 class ProductRegistry;
0025
0026 class ProvenanceReaderBase {
0027 public:
0028 ProvenanceReaderBase() {}
0029 virtual ~ProvenanceReaderBase();
0030 virtual std::set<ProductProvenance> readProvenance(unsigned int transitionIndex) const = 0;
0031 virtual void readProvenanceAsync(WaitingTaskHolder task,
0032 ModuleCallingContext const* moduleCallingContext,
0033 unsigned int transitionIndex,
0034 std::atomic<const std::set<ProductProvenance>*>& writeTo) const noexcept = 0;
0035
0036 virtual void unsafe_fillProvenance(unsigned int transitionIndex) const;
0037 };
0038
0039 class ProductProvenanceRetriever : public ProductProvenanceLookup {
0040 public:
0041 explicit ProductProvenanceRetriever(unsigned int iTransitionIndex);
0042 ProductProvenanceRetriever(unsigned int iTransitionIndex, edm::ProductRegistry const&);
0043 explicit ProductProvenanceRetriever(unsigned int iTransitionIndex, std::unique_ptr<ProvenanceReaderBase> reader);
0044
0045 ProductProvenanceRetriever& operator=(ProductProvenanceRetriever const&) = delete;
0046
0047 void mergeProvenanceRetrievers(std::shared_ptr<ProductProvenanceRetriever> other);
0048
0049 void mergeParentProcessRetriever(ProductProvenanceRetriever const& provRetriever);
0050
0051 void deepCopy(ProductProvenanceRetriever const&);
0052
0053 void reset();
0054
0055 void readProvenanceAsync(WaitingTaskHolder task, ModuleCallingContext const* moduleCallingContext) const noexcept;
0056
0057
0058
0059 void unsafe_fillProvenance();
0060
0061 private:
0062 std::unique_ptr<const std::set<ProductProvenance>> readProvenance() const final;
0063 const ProductProvenanceLookup* nextRetriever() const final { return nextRetriever_.get(); }
0064
0065 edm::propagate_const<std::shared_ptr<ProductProvenanceRetriever>> nextRetriever_;
0066 std::shared_ptr<const ProvenanceReaderBase> provenanceReader_;
0067 unsigned int transitionIndex_;
0068 };
0069
0070 }
0071 #endif