EDMetadataSentry

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
#ifndef HeterogeneousCore_AlpakaCore_interface_alpaka_EDMetadataSentry_h
#define HeterogeneousCore_AlpakaCore_interface_alpaka_EDMetadataSentry_h

#include "FWCore/Utilities/interface/StreamID.h"
#include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDMetadata.h"

namespace ALPAKA_ACCELERATOR_NAMESPACE {
  namespace detail {
    /**
     * Helper class to be used in produce()
     *
     * TODO: not really a sentry as it doesn't do anything special in its destructor. Better name?
     */
    class EDMetadataSentry {
    public:
      // For normal module
      EDMetadataSentry(edm::StreamID stream, bool synchronize);

      // For ExternalWork-module's produce()
      EDMetadataSentry(std::shared_ptr<EDMetadata> metadata, bool synchronize)
          : metadata_(std::move(metadata)), synchronize_(synchronize) {}

      EDMetadataSentry(EDMetadataSentry const&) = delete;
      EDMetadataSentry& operator=(EDMetadataSentry const&) = delete;
      EDMetadataSentry(EDMetadataSentry&&) = delete;
      EDMetadataSentry& operator=(EDMetadataSentry&&) = delete;

      std::shared_ptr<EDMetadata> metadata() { return metadata_; }

      // true if asynchronous work was (possibly) launched
      void finish(bool launchedAsyncWork);

    private:
      std::shared_ptr<EDMetadata> metadata_;
      bool const synchronize_;
    };
  }  // namespace detail
}  // namespace ALPAKA_ACCELERATOR_NAMESPACE

#endif