X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMDS%2FObjectPool.hxx;h=5e5f0d289d275eff3d2c3d10a6b99d80b88d400d;hp=8c357ecc1068b36b14a08db695b14d61385fca0e;hb=386c76ea033aef391a39dfc3b015ed081ed49fd5;hpb=c98d9fcd7f02c1f1f5c24dd3e709ed75228d66c4 diff --git a/src/SMDS/ObjectPool.hxx b/src/SMDS/ObjectPool.hxx index 8c357ecc1..5e5f0d289 100644 --- a/src/SMDS/ObjectPool.hxx +++ b/src/SMDS/ObjectPool.hxx @@ -44,6 +44,7 @@ private: int _chunkSize; int _maxOccupied; int _nbHoles; + int _lastDelChunk; int getNextFree() { @@ -84,6 +85,7 @@ public: _nbHoles = 0; _chunkList.clear(); _freeList.clear(); + _lastDelChunk = 0; } virtual ~ObjectPool() @@ -126,27 +128,30 @@ public: void destroy(X* obj) { - long adrobj = (long) (obj); - for (size_t i = 0; i < _chunkList.size(); i++) + size_t i = 0; + if ( obj >= _chunkList[ _lastDelChunk ] && + obj < _chunkList[ _lastDelChunk ] + _chunkSize ) + i = _lastDelChunk; + else + for ( ; i < _chunkList.size(); i++ ) { - X* chunk = _chunkList[i]; - long adrmin = (long) (chunk); - if (adrobj < adrmin) - continue; - long adrmax = (long) (chunk + _chunkSize); - if (adrobj >= adrmax) - continue; - int rank = (adrobj - adrmin) / sizeof(X); - int toFree = i * _chunkSize + rank; - _freeList[toFree] = true; - if (toFree < _nextFree) - _nextFree = toFree; - if (toFree < _maxOccupied) - _nbHoles += 1; - //obj->clean(); - //checkDelete(i); compactage non fait - break; + if ( obj >= _chunkList[ i ] && + obj < _chunkList[ i ] + _chunkSize ) + break; } + X* chunk = _chunkList[i]; + long adrobj = (long) (obj); + long adrmin = (long) (chunk); + int rank = (adrobj - adrmin) / sizeof(X); + int toFree = i * _chunkSize + rank; + _freeList[toFree] = true; + if (toFree < _nextFree) + _nextFree = toFree; + if (toFree < _maxOccupied) + _nbHoles += 1; + _lastDelChunk = i; + //obj->clean(); + //checkDelete(i); compactage non fait } void clear() @@ -155,6 +160,7 @@ public: _maxAvail = 0; _maxOccupied = 0; _nbHoles = 0; + _lastDelChunk = 0; for (size_t i = 0; i < _chunkList.size(); i++) delete[] _chunkList[i]; clearVector( _chunkList );