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