File indexing completed on 2023-03-17 11:02:58
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 }
0065
0066 using edmtest::TransformAsyncIntProducer;
0067 DEFINE_FWK_MODULE(TransformAsyncIntProducer);