GeoIntrusivePtr - Fix move semantics + add test
I observed a strange feature in Athena with respect to the reference counts of the tree top of the MuonDetectorManager.
template <typename read_out, size_t N> void MuonDetectorManager::fillCache(std::array<std::unique_ptr<read_out>, N>& array) {
for (std::unique_ptr<read_out>& ele : array) {
if (!ele) continue;
ATH_MSG_ALWAYS("Tree top "<<m_envelope[0].get()<<" "<<m_envelope[0]->refCount()
<<" "<<m_idHelperSvc->toString(ele->identify()));
if (ele) ele->fillCache();
}
}
It's growing with the number of cache fill calls:
Tree top 0x4affb070 2 RPC BML eta -7 phi 1 dbR 1 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 3 RPC BML eta -7 phi 2 dbR 1 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 4 RPC BML eta -7 phi 3 dbR 1 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 5 RPC BML eta -7 phi 4 dbR 1 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 6 RPC BML eta -7 phi 5 dbR 1 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 7 RPC BML eta -7 phi 6 dbR 1 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 8 RPC BML eta -7 phi 8 dbR 1 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 9 RPC BML eta -6 phi 1 dbR 1 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 10 RPC BML eta -6 phi 1 dbR 1 dbZ 2 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 11 RPC BML eta -6 phi 1 dbR 2 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 12 RPC BML eta -6 phi 1 dbR 2 dbZ 2 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 13 RPC BML eta -6 phi 2 dbR 1 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 14 RPC BML eta -6 phi 2 dbR 1 dbZ 2 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 15 RPC BML eta -6 phi 2 dbR 2 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 16 RPC BML eta -6 phi 2 dbR 2 dbZ 2 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 17 RPC BML eta -6 phi 3 dbR 1 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 18 RPC BML eta -6 phi 3 dbR 1 dbZ 2 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 19 RPC BML eta -6 phi 3 dbR 2 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 20 RPC BML eta -6 phi 3 dbR 2 dbZ 2 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 21 RPC BML eta -6 phi 4 dbR 1 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 22 RPC BML eta -6 phi 4 dbR 1 dbZ 2 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 23 RPC BML eta -6 phi 4 dbR 2 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 24 RPC BML eta -6 phi 4 dbR 2 dbZ 2 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 25 RPC BML eta -6 phi 5 dbR 1 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 26 RPC BML eta -6 phi 5 dbR 1 dbZ 2 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 27 RPC BML eta -6 phi 5 dbR 2 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 28 RPC BML eta -6 phi 5 dbR 2 dbZ 2 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 29 RPC BML eta -6 phi 6 dbR 1 dbZ 1 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 30 RPC BML eta -6 phi 6 dbR 1 dbZ 2 dbPhi 1 gap 1 eta channel 1
Tree top 0x4affb070 31 RPC BML eta -6 phi 6 dbR 2 dbZ 1 dbPhi 1 gap 1 eta channel 1
For some reason, the call of child->getX() permanently increased the reference counts of the RCBase object. It's very reproducible in the standalone test and is kind of related to the move constructor of the GeoIntrusvePtr. Anyhow, the constructor and the move assignment operator are now streamlined with a move()
method and the unit test of the GeoIntrusivePtr has been updated to catch this issue