X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMDS%2FObjectPool.hxx;h=e664c260c5283a6d94ed89e4eb107bb5ca742f42;hb=8fcd118698abab08738d16a2901e33542effe762;hp=abb7c15f2c1542080cb2fcbc60e2280efd3d92c9;hpb=bd8f1aee7c78f7d2eb82bd4fec5e08c9e3d280ce;p=modules%2Fsmesh.git diff --git a/src/SMDS/ObjectPool.hxx b/src/SMDS/ObjectPool.hxx index abb7c15f2..e664c260c 100644 --- a/src/SMDS/ObjectPool.hxx +++ b/src/SMDS/ObjectPool.hxx @@ -42,9 +42,16 @@ private: int _nextFree; int _maxAvail; int _chunkSize; + int _maxOccupied; + int _nbHoles; int getNextFree() { + // Don't iterate on the _freeList if all the "holes" + // are filled. Go straight to the last occupied ID + 1 + if ( _nbHoles == 0 ) + return std::min(_maxOccupied + 1, _maxAvail); + for (int i = _nextFree; i < _maxAvail; i++) if (_freeList[i] == true) { @@ -73,6 +80,8 @@ public: _chunkSize = nblk; _nextFree = 0; _maxAvail = 0; + _maxOccupied = 0; + _nbHoles = 0; _chunkList.clear(); _freeList.clear(); } @@ -103,6 +112,14 @@ public: _freeList[_nextFree] = false; obj = _chunkList[chunkId] + rank; // &_chunkList[chunkId][rank]; } + if (_nextFree < _maxOccupied) + { + _nbHoles-=1; + } + else + { + _maxOccupied = _nextFree; + } //obj->init(); return obj; } @@ -124,6 +141,8 @@ public: _freeList[toFree] = true; if (toFree < _nextFree) _nextFree = toFree; + if (toFree < _maxOccupied) + _nbHoles += 1; //obj->clean(); //checkDelete(i); compactage non fait break; @@ -134,6 +153,8 @@ public: { _nextFree = 0; _maxAvail = 0; + _maxOccupied = 0; + _nbHoles = 0; for (size_t i = 0; i < _chunkList.size(); i++) delete[] _chunkList[i]; clearVector( _chunkList );