People, can someone explain how does this work? Probably it's obvious but I
couldn't find the answer myself.

GarbageCollector::~GarbageCollector()
{
        SyncLockGuard exGuard(&m_sync, SYNC_EXCLUSIVE,
"GarbageCollector::~GarbageCollector");

        for (FB_SIZE_T pos = 0; pos < m_relations.getCount(); pos++)
        {
                RelationData* relData = m_relations[pos];

                Sync sync(&relData->m_sync,
"GarbageCollector::~GarbageCollector");
                sync.lock(SYNC_EXCLUSIVE);

                m_relations.remove(pos);
                sync.unlock();
                delete relData;
        }

        m_relations.clear();
}

For what I see,
m_relations.remove(pos) is called inside the loop. Being m_relations a
specialized SortedArray, it inherits a remove() method that shifts the
trailing elements one position lower and decrements the count of elements.
If this is happening already, then this logic doesn't work:

for (FB_SIZE_T pos = 0; pos < m_relations.getCount(); pos++)
        m_relations.remove(pos);

because it's deleting every other element (then it's missing half the
elements). Why not doing the loop in reverse order? It's faster than forcing
an element shift for each relation:

for (FB_SIZE_T pos = m_relations.getCount(); pos > 0; --pos)
{
        RelationData* relData = m_relations[pos - 1];
....
        m_relations.remove(pos - 1);
}

Thanks and I would be happy to be told that the current code is correct and
I didn't take something obvious into account.

C.
---
Claudio Valderrama C.
Consultant, SW developer.


------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=164703151&iu=/4140/ostg.clktrk
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to