diff --git a/Database/PersistentDataModel/PersistentDataModel/DataHeader.h b/Database/PersistentDataModel/PersistentDataModel/DataHeader.h index 48f2cfd30ef471688f045b47fe61205a943a94f4..a36aef566bd86e2b9df49a09c985ec0c5dd4bb73 100755 --- a/Database/PersistentDataModel/PersistentDataModel/DataHeader.h +++ b/Database/PersistentDataModel/PersistentDataModel/DataHeader.h @@ -56,7 +56,7 @@ public: // Constructor and Destructor /// @param classID [IN] Primary ClassID of the DataObject for which a DataHeaderElement is created. /// @param key [IN] SG Key of the DataObject for which a DataHeaderElement is created. /// @param token [IN] Token of the DataObject for which a DataHeaderElement is created. - DataHeaderElement(const CLID classID, const std::string& key, const Token* token); + DataHeaderElement(const CLID classID, const std::string& key, Token&& token); /// Destructor virtual ~DataHeaderElement(); @@ -111,9 +111,8 @@ private: std::string m_key; /// set of StoreGate alias string. std::set<std::string> m_alias; - /// pointer to transient address - const Token* m_token; - bool m_ownToken; + /// Transient address token. + Token m_token; /// hash table for ElementLink host container keys. std::vector<sgkey_t> m_hashes; }; diff --git a/Database/PersistentDataModel/PersistentDataModel/Token.h b/Database/PersistentDataModel/PersistentDataModel/Token.h index 4d9a167164b8137072a79e7d66e6200d648ff70e..ef8a37e3923f5047181cf901588a11b74974b0d2 100755 --- a/Database/PersistentDataModel/PersistentDataModel/Token.h +++ b/Database/PersistentDataModel/PersistentDataModel/Token.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration */ #ifndef PERSISTENTDATAMODEL_TOKEN_H @@ -37,6 +37,8 @@ public: Token(); /// Constructor with data assignment explicit Token(const Token* source); + /// Allow move. + explicit Token(Token&& source); /// Standard destructor: release all allocated resources. virtual ~Token(); /// Operator < to allow ordering diff --git a/Database/PersistentDataModel/src/DataHeader.cxx b/Database/PersistentDataModel/src/DataHeader.cxx index 6c674d974e92a597c3ae1205ad14b9c8a36f03d1..3a79ebdf093187037ebf4e2b5fdd98200e223b13 100755 --- a/Database/PersistentDataModel/src/DataHeader.cxx +++ b/Database/PersistentDataModel/src/DataHeader.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration */ /** @file DataHeader.cxx @@ -15,19 +15,15 @@ #include "AthenaKernel/IStringPool.h" //______________________________________________________________________________ -DataHeaderElement::DataHeaderElement() : m_pClid(0), m_clids(), m_key(), m_alias(), m_token(0), m_ownToken(false), m_hashes() { +DataHeaderElement::DataHeaderElement() : m_pClid(0), m_clids(), m_key(), m_alias(), m_hashes() { } //______________________________________________________________________________ DataHeaderElement::DataHeaderElement(const DataHeaderElement& rhs) : m_pClid(rhs.m_pClid), m_clids(rhs.m_clids), m_key(rhs.m_key), m_alias(rhs.m_alias), - m_token(0), - m_ownToken(false), + m_token(rhs.getToken()), m_hashes(rhs.m_hashes) { - if (rhs.getToken() != 0) { - m_token = new Token(rhs.getToken()); m_ownToken = true; - } } //______________________________________________________________________________ DataHeaderElement::DataHeaderElement(const SG::TransientAddress* sgAddress, IOpaqueAddress* tokAddress, @@ -63,35 +59,30 @@ DataHeaderElement::DataHeaderElement(CLID clid, m_clids(tClids.begin(), tClids.end()), m_key((pTag.empty()) ? name : pTag), m_alias(std::move(alias)), - m_token(0), m_ownToken(false), m_hashes() + m_hashes() { m_clids.erase(m_pClid); TokenAddress* tokAddr = dynamic_cast<TokenAddress*>(tokAddress); if (tokAddr != 0 && tokAddr->getToken() != 0) { - m_token = new Token(tokAddr->getToken()); m_ownToken = true; + tokAddr->getToken()->setData (&m_token); } else { tokAddr = dynamic_cast<TokenAddress*>(tadAddress); if (tokAddr != 0 && tokAddr->getToken() != 0) { - m_token = tokAddr->getToken(); + tokAddr->getToken()->setData (&m_token); } else if (tokAddress != 0) { - Token* token = new Token; - m_token = token; m_ownToken = true; - token->fromString(*(tokAddress->par())); + m_token.fromString(*(tokAddress->par())); } else if (tadAddress != 0) { - Token* token = new Token; - m_token = token; m_ownToken = true; - token->fromString(*(tadAddress->par())); + m_token.fromString(*(tadAddress->par())); } } } //______________________________________________________________________________ DataHeaderElement::DataHeaderElement(const CLID classID, - const std::string& key, const Token* token) - : m_pClid(classID), m_clids(), m_key(key), m_alias(), m_token(token), m_ownToken(true), m_hashes() { + const std::string& key, Token&& token) + : m_pClid(classID), m_clids(), m_key(key), m_alias(), m_token(std::move(token)), m_hashes() { } //______________________________________________________________________________ DataHeaderElement::~DataHeaderElement() { - if (m_ownToken) { delete m_token; m_token = 0; } } //______________________________________________________________________________ DataHeaderElement& DataHeaderElement::operator=(const DataHeaderElement& rhs) { @@ -100,12 +91,7 @@ DataHeaderElement& DataHeaderElement::operator=(const DataHeaderElement& rhs) { m_clids = rhs.m_clids; m_key = rhs.m_key; m_alias = rhs.m_alias; - if (m_ownToken) { delete m_token; m_token = 0; m_ownToken = false; } - if (rhs.getToken() != 0) { - Token* newtok = new Token; - m_token = newtok; m_ownToken = true; - rhs.getToken()->setData(newtok); - } + rhs.getToken()->setData(&m_token); m_hashes = rhs.m_hashes; } return(*this); @@ -133,7 +119,7 @@ const std::set<std::string>& DataHeaderElement::getAlias() const { } //_____________________________________________________________________________ const Token* DataHeaderElement::getToken() const { - return(m_token); + return(&m_token); } //_____________________________________________________________________________ long DataHeaderElement::getStorageType() const { @@ -162,7 +148,7 @@ SG::TransientAddress* DataHeaderElement::getAddress(unsigned long contextId) con SG::TransientAddress* DataHeaderElement::getAddress(const std::string& key, unsigned long contextId) const { CLID primaryClID = getPrimaryClassID(); - Token* token = new Token(m_token); + Token* token = new Token(&m_token); TokenAddress* tokAdd = new TokenAddress(this->getStorageType(), primaryClID, "", m_key, contextId , token); SG::TransientAddress* sgAddress = new SG::TransientAddress(primaryClID, key, tokAdd); for (std::set<CLID>::const_iterator iter = m_clids.begin(), last = m_clids.end(); @@ -188,11 +174,7 @@ void DataHeaderElement::dump(std::ostream& ostr) const for( auto& a : getAlias() ) ostr << " " << a; ostr << endl; } - if( m_token ) { - ostr << "Token: " << m_token->toString(); - if( m_ownToken ) ostr << " owned"; - ostr << endl; - } + ostr << "Token: " << m_token.toString() << endl; if( m_hashes.size() ) { ostr << "Hashes:"; for( auto h : m_hashes ) ostr << " " << h; diff --git a/Database/PersistentDataModel/src/Token.cxx b/Database/PersistentDataModel/src/Token.cxx index 279157b2f33cf938622c3838f135344f37b71fe4..1383caa83094250ebd3f1bc544dd79ce53379c7c 100755 --- a/Database/PersistentDataModel/src/Token.cxx +++ b/Database/PersistentDataModel/src/Token.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration */ #include "PersistentDataModel/Token.h" @@ -52,6 +52,21 @@ Token::Token(const Token* source) : m_refCount(1), s_numCount++; } +/// Move constructor. +Token::Token(Token&& source) + : m_refCount (1), + m_technology (source.m_technology), + m_dbID (std::move (source.m_dbID)), + m_cntID (std::move (source.m_cntID)), + m_classID (std::move (source.m_classID)), + m_oid (std::move (source.m_oid)), + m_type (source.m_type), + m_auxString (std::move (source.m_auxString)) +{ + s_numCount++; +} + + Token::~Token() { s_numCount--; } @@ -194,5 +209,7 @@ const Token& Token::set(Token* pToken) const { const Token& Token::setData(Token* pToken) const { this->set(pToken); pToken->m_oid.second = m_oid.second; + pToken->m_type = m_type; + pToken->m_auxString = m_auxString; return *this; } diff --git a/Database/PersistentDataModelAthenaPool/src/DataHeaderCnv.cxx b/Database/PersistentDataModelAthenaPool/src/DataHeaderCnv.cxx index 9d73114c30f5357375ed1a31b94e13a7635328c9..96d10124058013ec7e9df53e4950f6ba279249a8 100755 --- a/Database/PersistentDataModelAthenaPool/src/DataHeaderCnv.cxx +++ b/Database/PersistentDataModelAthenaPool/src/DataHeaderCnv.cxx @@ -565,8 +565,7 @@ DataHeader* DataHeaderCnv::createTransient() { DataHeader* dh = new DataHeader(); std::string bestPfn, fileType; m_athenaPoolCnvSvc->getPoolSvc()->lookupBestPfn(this->m_i_poolToken->dbID().toString(), bestPfn, fileType); - const Token* copy = new Token(this->m_i_poolToken); - DataHeaderElement dhe(ClassID_traits<DataHeader>::ID(), bestPfn, copy); + DataHeaderElement dhe(ClassID_traits<DataHeader>::ID(), bestPfn, Token(this->m_i_poolToken)); dh->insert(dhe); return(dh); } diff --git a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p3.cxx b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p3.cxx index ee1e00cbd38c561de64a794409b4e416b89689c6..097d5dfe2c7328ce2d65c89bd81f38123f61f042 100755 --- a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p3.cxx +++ b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p3.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration */ /** @file DataHeaderCnv_p3.cxx @@ -78,9 +78,7 @@ void DataHeaderElementCnv_p3::persToTrans(const DataHeaderElement_p3* pers, snprintf(text, length, "][TECH=%08X][OID=%08X-%08X]", pers->m_technology, pers->m_oid1, pers->m_oid2); tokenStr.append(text); } - Token* token = new Token; - token->fromString(tokenStr); - delete trans->m_token; trans->m_token = token; + trans->m_token.fromString(tokenStr); } //______________________________________________________________________________ void DataHeaderElementCnv_p3::transToPers(const DataHeaderElement* /*trans*/, diff --git a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p4.cxx b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p4.cxx index 5b137356ae3ef40712c3ca12c14e8a43ec26cbb7..95ca379cd113b63ac10496abbfa0f6f27905c8e5 100755 --- a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p4.cxx +++ b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p4.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration */ /** @file DataHeaderCnv_p4.cxx @@ -82,9 +82,7 @@ void DataHeaderElementCnv_p4::persToTrans(const DataHeaderElement_p4* pers, snprintf(text, length, "][TECH=%08X][OID=%08X-%08X]", pers->m_technology, pers->m_oid1, pers->m_oid2); tokenStr.append(text); } - Token* token = new Token; - token->fromString(tokenStr); - delete trans->m_token; trans->m_token = token; + trans->m_token.fromString(tokenStr); } //______________________________________________________________________________ void DataHeaderElementCnv_p4::transToPers(const DataHeaderElement* /*trans*/, diff --git a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx index bdfb582f936e4d19291766f07ec775b5e0110ea0..c6977d5f3698a747fb0eb8c4f78f8428eccc91fb 100755 --- a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx +++ b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration */ /** @file DataHeaderCnv_p5.cxx @@ -21,8 +21,7 @@ void DataHeaderElementCnv_p5::persToTrans(const DataHeaderElement_p5& pers, const DataHeaderForm_p5& form, unsigned int entry) const { - delete trans.m_token; trans.m_token = new Token; trans.m_ownToken = true; - Token* token = const_cast<Token*>(trans.m_token); + Token& token = trans.m_token; std::vector<unsigned int>::const_iterator intIter = form.params(entry).begin(); unsigned int keyIdx = 0U, aliasNum = 0U, clidNum = 0U; // Translate PoolToken @@ -31,7 +30,7 @@ void DataHeaderElementCnv_p5::persToTrans(const DataHeaderElement_p5& pers, keyIdx = *intIter; ++intIter; aliasNum = *intIter; ++intIter; clidNum = *intIter; ++intIter; - token->fromString(pers.m_token); + token.fromString(pers.m_token); } else { const unsigned int keyPos = (unsigned short)(*intIter>>16), version = (unsigned short)(*intIter&0x0000FFFF); ++intIter; @@ -54,7 +53,7 @@ void DataHeaderElementCnv_p5::persToTrans(const DataHeaderElement_p5& pers, } // Append DbGuid Guid guid(form.map()[guidIdx]); - token->setDb(guid); + token.setDb(guid); // Container name, may be optimized std::string cntName; if (prefixIdx > 0) { @@ -69,12 +68,12 @@ void DataHeaderElementCnv_p5::persToTrans(const DataHeaderElement_p5& pers, } else { cntName += pers.m_token; } - //token->setCont(cntName); + //token.setCont(cntName); // Append ClassId Guid clid(form.map()[classIdx]); - token->setClassID(clid); - token->setTechnology(tech); - token->setOid(Token::OID_t(oid1, pers.m_oid2)); + token.setClassID(clid); + token.setTechnology(tech); + token.setOid(Token::OID_t(oid1, pers.m_oid2)); } unsigned int aliasCur = 0U, clidCur = 0U; trans.m_key = form.map()[keyIdx]; @@ -263,9 +262,9 @@ void DataHeaderCnv_p5::insertDHRef(DataHeader_p5& pers, const std::string& key, const std::string& strToken) const { - Token* token = new Token; - token->fromString(strToken); - DataHeaderElement tEle(ClassID_traits<DataHeader>::ID(), key, token); + Token token; + token.fromString(strToken); + DataHeaderElement tEle(ClassID_traits<DataHeader>::ID(), key, std::move(token)); DataHeaderElement_p5 pEle; unsigned int entry = dhForm.size() + 1; m_elemCnv.transToPers(tEle, pEle, dhForm, entry); diff --git a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx index 8e6e324500707580f986b826bda60886c2a6889d..ddc1f18e32af04b50c8134c0131a85da10b85ae0 100755 --- a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx +++ b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx @@ -18,13 +18,10 @@ using FullElement = DataHeader_p6::FullElement; bool DataHeaderCnv_p6::persToElem( const DataHeader_p6* pers, unsigned p_idx, DataHeaderElement* trans, const DataHeaderForm_p6& form ) const { - delete trans->m_token; trans->m_token = nullptr; int obj_idx = pers->m_shortElements[p_idx]; if( obj_idx == INT32_MIN ) return true; - Token* token = new Token; - trans->m_token = token; - trans->m_ownToken = true; + Token& token = trans->m_token; unsigned db_idx = 0; unsigned long long oid2 = 0; if( obj_idx >= 0 ) { @@ -39,14 +36,14 @@ bool DataHeaderCnv_p6::persToElem( const DataHeader_p6* pers, unsigned p_idx, if( form.sizeDb() > db_idx ) { // Append DbGuid - token->setDb( form.getDbGuid( db_idx ) ); - token->setTechnology( form.getDbTech( db_idx ) ); + token.setDb( form.getDbGuid( db_idx ) ); + token.setTechnology( form.getDbTech( db_idx ) ); } if( form.sizeObj() > (size_t)obj_idx ) { - token->setCont( form.getObjContainer( obj_idx ) ); + token.setCont( form.getObjContainer( obj_idx ) ); // Append ClassId - token->setClassID( form.getObjClassId(obj_idx) ); - token->setOid( Token::OID_t( form.getObjOid1(obj_idx), oid2) ); + token.setClassID( form.getObjClassId(obj_idx) ); + token.setOid( Token::OID_t( form.getObjOid1(obj_idx), oid2) ); // StoreGate trans->m_key = form.getObjKey( obj_idx ); trans->m_alias = form.getObjAlias( obj_idx ); @@ -159,8 +156,8 @@ void DataHeaderCnv_p6::insertDHRef( DataHeader_p6* pers, const std::string& key, const std::string& tokstr, DataHeaderForm_p6& form ) const { - Token* token = new Token(); - token->fromString( tokstr ); - DataHeaderElement tEle(ClassID_traits<DataHeader>::ID(), key, token); + Token token; + token.fromString( tokstr ); + DataHeaderElement tEle(ClassID_traits<DataHeader>::ID(), key, std::move(token)); elemToPers( &tEle, pers, form ); } diff --git a/Event/ByteStreamCnvSvc/src/ByteStreamEventStorageInputSvc.cxx b/Event/ByteStreamCnvSvc/src/ByteStreamEventStorageInputSvc.cxx index 66bbc4141583ee2692048579136d821cc69257fd..d2b4b4f664e6758a098cd0f789841101ebbc0b54 100644 --- a/Event/ByteStreamCnvSvc/src/ByteStreamEventStorageInputSvc.cxx +++ b/Event/ByteStreamCnvSvc/src/ByteStreamEventStorageInputSvc.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration */ #include "ByteStreamEventStorageInputSvc.h" @@ -665,12 +665,11 @@ ByteStreamEventStorageInputSvc::currentEventStatus() const std::unique_ptr<DataHeaderElement> ByteStreamEventStorageInputSvc::makeBSProvenance() const { - std::unique_ptr<Token> token = std::make_unique<Token>(); - token->setDb(m_fileGUID); - token->setTechnology(0x00001000); - token->setOid(Token::OID_t(0LL, m_evtFileOffset)); + Token token; + token.setDb(m_fileGUID); + token.setTechnology(0x00001000); + token.setOid(Token::OID_t(0LL, m_evtFileOffset)); - // note: passing ownership of token to DataHeaderElement return std::make_unique<DataHeaderElement>(ClassID_traits<DataHeader>::ID(), - "StreamRAW", token.release()); + "StreamRAW", std::move(token)); }