summaryrefslogtreecommitdiff
path: root/tools/source/memtools/mempool.cxx
diff options
context:
space:
mode:
authorJens-Heiner Rechtien <hr@openoffice.org>2000-09-18 16:07:07 +0000
committerJens-Heiner Rechtien <hr@openoffice.org>2000-09-18 16:07:07 +0000
commit8ab086b6cc054501bfbf7ef6fa509c393691e860 (patch)
tree324d51845d7f1a2f4e02a14db22fb5947137c822 /tools/source/memtools/mempool.cxx
parent411e68cc54ae97eebd79ae3a9cb2971b74cb2a9e (diff)
initial import
Diffstat (limited to 'tools/source/memtools/mempool.cxx')
-rw-r--r--tools/source/memtools/mempool.cxx323
1 files changed, 323 insertions, 0 deletions
diff --git a/tools/source/memtools/mempool.cxx b/tools/source/memtools/mempool.cxx
new file mode 100644
index 000000000000..25d4149bcdb4
--- /dev/null
+++ b/tools/source/memtools/mempool.cxx
@@ -0,0 +1,323 @@
+/*************************************************************************
+ *
+ * $RCSfile: mempool.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 17:03:08 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#define private public
+
+#include <limits.h>
+
+#include <debug.hxx>
+#include <mempool.hxx>
+
+// -----------------------------------------------------------------------
+
+#if ( __ALIGNMENT8 > 4 )
+#define MEMPOOL_ALIGNMENT __ALIGNMENT8
+#else
+#define MEMPOOL_ALIGNMENT 4
+#endif
+
+// -----------------
+// - FixedMemBlock -
+// -----------------
+
+struct FixedMemBlock
+{
+ USHORT nSize;
+ USHORT nFree;
+ USHORT nFirst;
+ USHORT nDummyAlign1;
+ FixedMemBlock* pNext;
+#if (__SIZEOFPOINTER == 4) && (__ALIGNMENT8 == 8)
+ void* pDummyAlign2;
+#endif
+ char aData[1];
+};
+
+/*************************************************************************
+|*
+|* ImpDbgPoolTest()
+|*
+|* Beschreibung MEMPOOL.SDW
+|* Ersterstellung TH 30.11.94
+|* Letzte Aenderung TH 30.11.94
+|*
+*************************************************************************/
+
+#ifdef DBG_UTIL
+
+static void ImpDbgPoolTest( FixedMemPool* pMemPool )
+{
+ DbgData* pData = DbgGetData();
+
+ if ( !pData )
+ return;
+
+ if ( !(pData->nTestFlags & (DBG_TEST_MEM_OVERWRITE | DBG_TEST_MEM_OVERWRITEFREE)) )
+ return;
+
+ FixedMemBlock* pFirst = pMemPool->pFirst;
+ FixedMemBlock* pBlock = pFirst;
+ while ( pBlock )
+ {
+ if ( pBlock->nFree )
+ {
+ USHORT i = pBlock->nFree;
+ USHORT n = pBlock->nFirst;
+ char* pData = pBlock->aData;
+ while ( i )
+ {
+ if ( !(n < (pBlock->nSize/pMemPool->nTypeSize)) )
+ DbgError( "MemPool: Memory Overwrite" );
+
+ char* pNext = pData+(n*pMemPool->nTypeSize);
+ n = *((USHORT*)pNext);
+ i--;
+ }
+ }
+
+ pBlock = pBlock->pNext;
+ }
+}
+
+#endif
+
+/*************************************************************************
+|*
+|* FixedMemPool::FixedMemPool()
+|*
+|* Beschreibung MEMPOOL.SDW
+|* Ersterstellung TH 02.09.94
+|* Letzte Aenderung TH 02.09.94
+|*
+*************************************************************************/
+
+FixedMemPool::FixedMemPool( USHORT _nTypeSize,
+ USHORT _nInitSize, USHORT _nGrowSize )
+{
+ pFirst = NULL;
+ nInitSize = _nInitSize;
+ nGrowSize = _nGrowSize;
+
+ if ( _nTypeSize > 4 )
+ nTypeSize = (_nTypeSize + (MEMPOOL_ALIGNMENT-1)) & ~(MEMPOOL_ALIGNMENT-1);
+ else if ( _nTypeSize <= 2 )
+ nTypeSize = 2;
+ else
+ nTypeSize = 4;
+
+ DBG_ASSERT( (ULONG)nTypeSize*nInitSize <= USHRT_MAX,
+ "FixedMemPool: TypeSize*nInitSize > USHRT_MAX" );
+ DBG_ASSERT( (ULONG)nTypeSize*nGrowSize <= USHRT_MAX,
+ "FixedMemPool: TypeSize*GrowSize > USHRT_MAX" );
+}
+
+/*************************************************************************
+|*
+|* FixedMemPool::~FixedMemPool()
+|*
+|* Beschreibung MEMPOOL.SDW
+|* Ersterstellung TH 02.09.94
+|* Letzte Aenderung TH 02.09.94
+|*
+*************************************************************************/
+
+FixedMemPool::~FixedMemPool()
+{
+ FixedMemBlock* pBlock = pFirst;
+ while ( pBlock )
+ {
+ FixedMemBlock* pTemp = pBlock;
+ pBlock = pBlock->pNext;
+ delete pTemp;
+ }
+}
+
+/*************************************************************************
+|*
+|* FixedMemPool::Alloc()
+|*
+|* Beschreibung MEMPOOL.SDW
+|* Ersterstellung TH 02.09.94
+|* Letzte Aenderung TH 02.09.94
+|*
+*************************************************************************/
+
+void* FixedMemPool::Alloc()
+{
+#ifdef DBG_UTIL
+ ImpDbgPoolTest( this );
+#endif
+
+ USHORT i;
+ char* pData;
+
+ if ( !pFirst )
+ {
+ pFirst = (FixedMemBlock*)new char[sizeof(FixedMemBlock)-1+(nInitSize*nTypeSize)];
+
+ if ( !pFirst )
+ return NULL;
+
+ pFirst->pNext = NULL;
+ pFirst->nSize = nInitSize*nTypeSize;;
+ pFirst->nFree = nInitSize-1;
+ pFirst->nFirst = 1;
+
+ pData = pFirst->aData;
+ for ( i = 1; i < nInitSize; i++ )
+ {
+ *((USHORT*)pData) = i;
+ pData += nTypeSize;
+ }
+
+ return (void*)(pFirst->aData);
+ }
+
+ FixedMemBlock* pBlock = pFirst;
+ while ( pBlock && !pBlock->nFree )
+ pBlock = pBlock->pNext;
+
+ if ( pBlock )
+ {
+ pData = pBlock->aData;
+ char* pFree = pData+(pBlock->nFirst*nTypeSize);
+ pBlock->nFirst = *((USHORT*)pFree); // UMR, wenn letzter freier Block, ist OK
+ pBlock->nFree--;
+ return (void*)pFree;
+ }
+ else
+ {
+ if ( !nGrowSize )
+ return NULL;
+
+ pBlock = (FixedMemBlock*)new char[sizeof(FixedMemBlock)-1+(nGrowSize*nTypeSize)];
+
+ if ( !pBlock )
+ return NULL;
+
+ pData = pBlock->aData;
+ for ( i = 1; i < nGrowSize; i++ )
+ {
+ *((USHORT*)pData) = i;
+ pData += nTypeSize;
+ }
+
+ pBlock->pNext = pFirst->pNext;
+ pBlock->nSize = nGrowSize*nTypeSize;
+ pBlock->nFree = nGrowSize-1;
+ pBlock->nFirst = 1;
+ pFirst->pNext = pBlock;
+
+ return (void*)(pBlock->aData);
+ }
+}
+
+/*************************************************************************
+|*
+|* FixedMemPool::Free()
+|*
+|* Beschreibung MEMPOOL.SDW
+|* Ersterstellung TH 02.09.94
+|* Letzte Aenderung TH 02.09.94
+|*
+*************************************************************************/
+
+void FixedMemPool::Free( void* pFree )
+{
+ if ( !pFree )
+ return;
+
+#ifdef DBG_UTIL
+ ImpDbgPoolTest( this );
+#endif
+
+ FixedMemBlock* pBlock = pFirst;
+ FixedMemBlock* pPrev = NULL;
+ while ( ((ULONG)pBlock->aData > (ULONG)pFree) ||
+ ((ULONG)pFree >= ((ULONG)pBlock->aData+pBlock->nSize)) )
+ {
+ pPrev = pBlock;
+ pBlock = pBlock->pNext;
+
+#ifdef DBG_UTIL
+ DBG_ASSERT( pBlock, "FixedMemPool - Delete: Wrong Pointer" );
+#endif
+ }
+
+ pBlock->nFree++;
+ *((USHORT*)pFree) = pBlock->nFirst;
+ pBlock->nFirst = (USHORT)(((ULONG)pFree-(ULONG)(pBlock->aData)) / nTypeSize);
+
+ if ( pPrev && (pBlock->nFree*nTypeSize == pBlock->nSize) )
+ {
+ pPrev->pNext = pBlock->pNext;
+ delete pBlock;
+ }
+ else
+ {
+ if ( pPrev )
+ {
+ pPrev->pNext = pBlock->pNext;
+ pBlock->pNext = pFirst->pNext;
+ pFirst->pNext = pBlock;
+ }
+ }
+}