Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:12:37

0001 #include "FWCore/Framework/interface/global/EDProducer.h"
0002 #include "FWCore/Framework/interface/Event.h"
0003 #include "FWCore/Framework/interface/MakerMacros.h"
0004 #include "DataFormats/TestObjects/interface/ToyProducts.h"
0005 #include "FWCore/Utilities/interface/Exception.h"
0006 
0007 #include <thread>
0008 namespace edmtest {
0009   class TransformAsyncIntProducer : public edm::global::EDProducer<edm::Transformer> {
0010   public:
0011     struct WorkCache {
0012       std::shared_ptr<std::thread> thread_;
0013       IntProduct value_;
0014     };
0015 
0016     TransformAsyncIntProducer(edm::ParameterSet const& iPSet)
0017         : getToken_(consumes(iPSet.getParameter<edm::InputTag>("get"))),
0018           offset_(iPSet.getParameter<unsigned int>("offset")),
0019           transformOffset_(iPSet.getParameter<unsigned int>("transformOffset")),
0020           noPut_(iPSet.getParameter<bool>("noPut")) {
0021       putToken_ = produces<IntProduct>();
0022       bool check = iPSet.getUntrackedParameter<bool>("checkTransformNotCalled");
0023       registerTransformAsync(
0024           putToken_,
0025           [offset = transformOffset_, check](auto const& iFrom, auto iTask) {
0026             if (check) {
0027               throw cms::Exception("TransformShouldNotBeCalled");
0028             }
0029             WorkCache ret;
0030             ret.thread_ = std::make_shared<std::thread>([iTask] { usleep(100000); });
0031             ret.value_ = IntProduct(iFrom.value + offset);
0032             return ret;
0033           },
0034           [](auto const& iFrom) {
0035             iFrom.thread_->join();
0036             return iFrom.value_;
0037           },
0038           "transform");
0039     }
0040 
0041     void produce(edm::StreamID, edm::Event& iEvent, edm::EventSetup const&) const override {
0042       if (not noPut_) {
0043         iEvent.emplace(putToken_, iEvent.get(getToken_).value + offset_);
0044       }
0045     }
0046     static void fillDescriptions(edm::ConfigurationDescriptions& desc) {
0047       edm::ParameterSetDescription pset;
0048       pset.add<edm::InputTag>("get");
0049       pset.add<unsigned int>("offset", 0);
0050       pset.add<unsigned int>("transformOffset", 1);
0051       pset.addUntracked<bool>("checkTransformNotCalled", false);
0052       pset.add<bool>("noPut", false);
0053 
0054       desc.addDefault(pset);
0055     }
0056 
0057   private:
0058     const edm::EDGetTokenT<IntProduct> getToken_;
0059     edm::EDPutTokenT<IntProduct> putToken_;
0060     const unsigned int offset_;
0061     const unsigned int transformOffset_;
0062     const bool noPut_;
0063   };
0064 }  // namespace edmtest
0065 
0066 using edmtest::TransformAsyncIntProducer;
0067 DEFINE_FWK_MODULE(TransformAsyncIntProducer);