From c9c0e7b7f30d924ec242265b1106e5dab9fb9ef6 Mon Sep 17 00:00:00 2001
From: Rafal Bielski <rafal.bielski@cern.ch>
Date: Mon, 4 Feb 2019 23:58:57 +0100
Subject: [PATCH] adapt PSC and InputSvc to new hltinterface

---
 .../src/TrigByteStreamInputSvc.cxx            | 58 ++++++-------------
 .../src/TrigByteStreamInputSvc.h              |  9 ++-
 HLT/Trigger/TrigControl/TrigPSC/TrigPSC/Psc.h |  2 +-
 HLT/Trigger/TrigControl/TrigPSC/src/Psc.cxx   |  4 +-
 4 files changed, 27 insertions(+), 46 deletions(-)

diff --git a/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamInputSvc.cxx b/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamInputSvc.cxx
index ee8ca25c9d1..d35b616628d 100644
--- a/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamInputSvc.cxx
+++ b/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamInputSvc.cxx
@@ -86,12 +86,17 @@ const RawEvent* TrigByteStreamInputSvc::nextEvent() {
 
   ATH_MSG_DEBUG("Reading new event for event context " << *eventContext);
 
-  eformat::write::FullEventFragment l1r;
+  // Find the cache corresponding to the current slot
+  EventCache* cache = m_eventsCache.get(*eventContext);
+
+  // Free the memory allocated to the previous event processed in the current slot
+  cache->releaseEvent();
+
   using DCStatus = hltinterface::DataCollector::Status;
   DCStatus status = DCStatus::NO_EVENT;
   do {
     try {
-      status = hltinterface::DataCollector::instance()->getNext(l1r);
+      status = hltinterface::DataCollector::instance()->getNext(cache->rawData);
       if (status == DCStatus::NO_EVENT)
         ATH_MSG_ERROR("Failed to read new event, DataCollector::getNext returned Status::NO_EVENT. Trying again.");
     }
@@ -117,32 +122,13 @@ const RawEvent* TrigByteStreamInputSvc::nextEvent() {
   }
   ATH_MSG_VERBOSE("DataCollector::getNext returned Status::OK");
 
-  // convert write::FullEventFragment to read::FullEventFragment (RawEvent)
-  const eformat::write::node_t* top = l1r.bind();
-  const size_t l1rFragmentSize = l1r.size_word();
-  uint32_t* buf = new uint32_t[l1rFragmentSize];
-  auto copiedSize = eformat::write::copy(*top,buf,l1rFragmentSize);
-  if(copiedSize!=l1rFragmentSize){
-    ATH_MSG_ERROR("Event serialization failed");
-    return nullptr;
-  }
-
-  // newRawEvent points to memory allocated by buf
-  RawEvent* newRawEvent = new RawEvent(buf);
+  // Create a cached FullEventFragment object from the cached raw data
+  cache->fullEventFragment.reset(new RawEvent(cache->rawData.get()));
 
-  // find the cache corresponding to the current slot
-  EventCache* cache = m_eventsCache.get(*eventContext);
-
-  // free the memory allocated to the previous event processed in the current slot
-  // -- if we make sure ROBDataProviderSvc does this, then TrigByteStreamInputSvc won't need a cache
-  releaseEvent(cache);
-
-  // put the new raw event into the cache
-  cache->rawEvent = newRawEvent;
-
-  m_robDataProviderSvc->setNextEvent(*eventContext,newRawEvent);
+  // Give the FullEventFragment pointer to ROBDataProviderSvc and also return it
+  m_robDataProviderSvc->setNextEvent(*eventContext, cache->fullEventFragment.get());
   ATH_MSG_VERBOSE("end of " << __FUNCTION__);
-  return newRawEvent;
+  return cache->fullEventFragment.get();
 }
 
 // =============================================================================
@@ -162,22 +148,16 @@ const RawEvent* TrigByteStreamInputSvc::currentEvent() const {
 }
 
 // =============================================================================
-void TrigByteStreamInputSvc::releaseEvent(EventCache* cache)
-{
-  ATH_MSG_VERBOSE("start of " << __FUNCTION__);
-  if (cache->rawEvent) {
-    OFFLINE_FRAGMENTS_NAMESPACE::PointerType fragment = cache->rawEvent->start();
-    delete[] fragment;
-    fragment = nullptr;
-    delete cache->rawEvent;
-    cache->rawEvent = nullptr;
-    // cache->eventStatus = 0;
+void TrigByteStreamInputSvc::EventCache::releaseEvent() {
+  if (this->rawData) {
+    delete[] this->rawData.release();
+  }
+  if (this->fullEventFragment) {
+    delete this->fullEventFragment.release();
   }
-  ATH_MSG_VERBOSE("end of " << __FUNCTION__);
 }
 
 // =============================================================================
 TrigByteStreamInputSvc::EventCache::~EventCache() {
-  delete rawEvent;
-  rawEvent = 0;
+  releaseEvent();
 }
diff --git a/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamInputSvc.h b/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamInputSvc.h
index a0b62f2e5c2..c2bd3c9dd5b 100644
--- a/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamInputSvc.h
+++ b/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamInputSvc.h
@@ -9,6 +9,7 @@
 #include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h"
 #include "ByteStreamData/RawEvent.h"
 #include "AthenaKernel/SlotSpecificObj.h"
+#include <memory.h>
 
 // Forward declarations
 class StoreGateSvc;
@@ -45,14 +46,12 @@ private:
   // ------------------------- Private data members ----------------------------
   struct EventCache {
     ~EventCache();
-    RawEvent* rawEvent {nullptr}; //!< Current event
+    void releaseEvent();
+    std::unique_ptr<RawEvent> fullEventFragment {nullptr}; //!< Current event fragment
+    std::unique_ptr<uint32_t[]> rawData {nullptr}; //!< Underlying data structure
   };
 
   SG::SlotSpecificObj<EventCache> m_eventsCache; //!< Cache of RawEvent pointer per event slot
-
-  // ------------------------- Private helper methods --------------------------
-  /// Clean up parts of previous event and re-init them
-  void releaseEvent(EventCache* cache);
 };
 
 #endif // TRIGBYTESTREAMINPUTSVC_H
diff --git a/HLT/Trigger/TrigControl/TrigPSC/TrigPSC/Psc.h b/HLT/Trigger/TrigControl/TrigPSC/TrigPSC/Psc.h
index 8c982f1d6d1..19890df0062 100644
--- a/HLT/Trigger/TrigControl/TrigPSC/TrigPSC/Psc.h
+++ b/HLT/Trigger/TrigControl/TrigPSC/TrigPSC/Psc.h
@@ -98,7 +98,7 @@ namespace psc {
     /**
      * Starts the HLT event loop. The HLT framework will start requesting and processing events.
      */
-    virtual void doEventLoop ();
+    virtual bool doEventLoop ();
 
     /**
      * Method which can be called for a worker to perform the necessary steps to set
diff --git a/HLT/Trigger/TrigControl/TrigPSC/src/Psc.cxx b/HLT/Trigger/TrigControl/TrigPSC/src/Psc.cxx
index f2c721df20f..d7d58e11d49 100644
--- a/HLT/Trigger/TrigControl/TrigPSC/src/Psc.cxx
+++ b/HLT/Trigger/TrigControl/TrigPSC/src/Psc.cxx
@@ -601,7 +601,7 @@ bool psc::Psc::hltUserCommand(const ptree& args)
   return true;
 }
 
-void psc::Psc::doEventLoop()
+bool psc::Psc::doEventLoop()
 {
   ERS_LOG("psc::Psc::doEventLoop: start of doEventLoop()");
   StatusCode sc;
@@ -629,8 +629,10 @@ void psc::Psc::doEventLoop()
   }
   if (sc.isFailure()) {
     ERS_PSC_ERROR("psc::Psc::doEventLoop failed");
+    return false;
   }
   ERS_LOG("psc::Psc::doEventLoop: end of doEventLoop()");
+  return true;
 }
 
 bool psc::Psc::prepareWorker (const boost::property_tree::ptree& args)
-- 
GitLab