$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r52543 - in sandbox/memory/boost: . memory memory/container
From: xushiweizh_at_[hidden]
Date: 2009-04-22 12:52:38
Author: xushiwei
Date: 2009-04-22 12:52:37 EDT (Wed, 22 Apr 2009)
New Revision: 52543
URL: http://svn.boost.org/trac/boost/changeset/52543
Log:
1. class fixed_alloc
2. class pool, scoped_pool
Added:
   sandbox/memory/boost/memory/pool.hpp   (contents, props changed)
Text files modified: 
   sandbox/memory/boost/memory.hpp                    |     4                                         
   sandbox/memory/boost/memory/container/dcl_list.hpp |    25 +++---                                  
   sandbox/memory/boost/memory/fixed_alloc.hpp        |   143 +++++++++++++++++++++++++++------------ 
   sandbox/memory/boost/memory/region_alloc.hpp       |     2                                         
   4 files changed, 112 insertions(+), 62 deletions(-)
Modified: sandbox/memory/boost/memory.hpp
==============================================================================
--- sandbox/memory/boost/memory.hpp	(original)
+++ sandbox/memory/boost/memory.hpp	2009-04-22 12:52:37 EDT (Wed, 22 Apr 2009)
@@ -40,8 +40,8 @@
 #include "memory/scoped_alloc.hpp"
 #endif
 
-#ifndef BOOST_MEMORY_FIXED_ALLOC_HPP
-#include "memory/fixed_alloc.hpp"
+#ifndef BOOST_MEMORY_POOL_HPP
+#include "memory/pool.hpp"
 #endif
 
 // -------------------------------------------------------------------------
Modified: sandbox/memory/boost/memory/container/dcl_list.hpp
==============================================================================
--- sandbox/memory/boost/memory/container/dcl_list.hpp	(original)
+++ sandbox/memory/boost/memory/container/dcl_list.hpp	2009-04-22 12:52:37 EDT (Wed, 22 Apr 2009)
@@ -57,8 +57,6 @@
 public:
         void BOOST_MEMORY_CALL insert_me_front_(dcl_list_node_base_& head)
         {
-		BOOST_MEMORY_ASSERT(empty());
-
                 m_prev = &head;
                 m_next = head.m_next;
                 head.m_next->m_prev = this;
@@ -67,8 +65,6 @@
 
         void BOOST_MEMORY_CALL insert_me_back_(dcl_list_node_base_& head)
         {
-		BOOST_MEMORY_ASSERT(empty());
-
                 m_next = &head;
                 m_prev = head.m_prev;
                 head.m_prev->m_next = this;
@@ -79,10 +75,14 @@
         bool BOOST_MEMORY_CALL empty() const
         {
                 BOOST_MEMORY_ASSERT(m_next == this || m_next != m_prev);
-
                 return m_next == this;
         }
 
+	void BOOST_MEMORY_CALL clear()
+	{
+		m_next = m_prev = this;
+	}
+
         void BOOST_MEMORY_CALL erase()
         {
                 m_next->m_prev = m_prev;
@@ -93,17 +93,13 @@
         void BOOST_MEMORY_CALL pop_front()
         {
                 BOOST_MEMORY_ASSERT(!empty());
-
-		dcl_list_node_base_* node = m_next;
-		node->erase();
+		static_cast<dcl_list_node_base_*>(m_next)->erase();
         }
 
         void BOOST_MEMORY_CALL pop_back()
         {
                 BOOST_MEMORY_ASSERT(!empty());
-
-		dcl_list_node_base_* node = m_prev;
-		node->erase();
+		static_cast<dcl_list_node_base_*>(m_prev)->erase();
         }
 };
 
@@ -231,9 +227,12 @@
                 return static_cast<const dcl_list_node_base_*>(node) == this;
         }
 
+private:
+	typedef dcl_list_node<NodeT> BaseNodeT;
+
 public:
-	typedef dcl_list_iterator_<NodeT, NodeT&, NodeT*> iterator;
-	typedef dcl_list_iterator_<NodeT, const NodeT&, const NodeT*> const_iterator;
+	typedef dcl_list_iterator_<BaseNodeT, BaseNodeT&, BaseNodeT*> iterator;
+	typedef dcl_list_iterator_<BaseNodeT, const BaseNodeT&, const BaseNodeT*> const_iterator;
 
         iterator BOOST_MEMORY_CALL begin() { return iterator(first()); }
         const_iterator BOOST_MEMORY_CALL begin() const { return const_iterator(first()); }
Modified: sandbox/memory/boost/memory/fixed_alloc.hpp
==============================================================================
--- sandbox/memory/boost/memory/fixed_alloc.hpp	(original)
+++ sandbox/memory/boost/memory/fixed_alloc.hpp	2009-04-22 12:52:37 EDT (Wed, 22 Apr 2009)
@@ -22,10 +22,13 @@
 
 NS_BOOST_MEMORY_BEGIN
 
-/*
 // -------------------------------------------------------------------------
 // class fixed_alloc
 
+#ifndef BOOST_MEMORY_ROUND
+#define BOOST_MEMORY_ROUND(x, y)		(((x)+((y)-1)) & ~((y)-1))
+#endif
+
 template <class PolicyT>
 class fixed_alloc
 {
@@ -41,20 +44,9 @@
 #pragma pack(1)
 private:
         struct MemBlock;
-	struct Header
+	struct Header : public dcl_list_node<MemBlock>
         {
-		Header* pPrev;
-		Header* pNext;
                 size_t nUsed;
-
-	public:
-		Header() {
-			pPrev = pNext = this;
-		}
-
-		bool BOOST_MEMORY_CALL empty() const {
-			return pPrev == this;
-		}
         };
 
         enum { HeaderSize = sizeof(Header) };
@@ -65,69 +57,128 @@
                 char buffer[BlockSize];
         };
 
-	enum { ChunkHeaderSize = sizeof(void*) };
-	struct Chunk
+	struct ChunkHeader
         {
-		struct Used
-		{
-			MemBlock* pBlock;
-			char data[1];
-		};
-		struct Unused
-		{
-			Unused* pPrev;
-			Unused* pNext;
-		};
+		MemBlock* pBlock;
         };
-#pragma pack()
-
-	class MemBlocks : public Header
-	{
-	private:
 
+	enum { ChunkHeaderSize = sizeof(ChunkHeader) };
 
+	struct FreeChunk : public dcl_list_node<FreeChunk>
+	{
         };
+#pragma pack()
 
         AllocT m_alloc;
-	Header m_blks;
-	const size_type m_cbChunk;
-	const size_type m_nMaxPerBlock;
+	dcl_list<MemBlock> m_blks;
+	dcl_list<FreeChunk> m_freelist;
+	size_type m_cbChunk;
+	size_type m_nMaxPerBlock;
 
 private:
-	void init_()
+	void init_(size_type cbElem)
         {
-		BOOST_MEMORY_ASSERT(m_nMaxPerBlock > 0);
+		m_cbChunk = BOOST_MEMORY_ROUND(cbElem, ChunkHeaderSize) + ChunkHeaderSize;
+		m_nMaxPerBlock = BlockSize / m_cbChunk;
 
-		m_blks.pPrev = m_blks.pNext = &m_blks;
+		BOOST_MEMORY_ASSERT(cbElem > 0 && m_nMaxPerBlock > 0);
         }
 
 public:
         explicit fixed_alloc(size_type cbElem)
-		: m_cbChunk(cbElem + ChunkHeaderSize), m_nMaxPerBlock(BlockSize / m_cbChunk)
         {
-		init_();
+		init_(cbElem);
         }
 
         fixed_alloc(AllocT alloc, size_type cbElem)
-		: m_alloc(alloc), m_cbChunk(cbElem + ChunkHeaderSize), m_nMaxPerBlock(BlockSize / m_cbChunk)
+		: m_alloc(alloc)
+	{
+		init_(cbElem);
+	}
+
+	fixed_alloc(fixed_alloc& owner, size_type cbElem)
+		: m_alloc(owner.m_alloc)
+	{
+		init_(cbElem);
+	}
+
+	~fixed_alloc()
+	{
+		clear();
+	}
+
+private:
+	__forceinline MemBlock*& BOOST_MEMORY_CALL chunkHeader_(void* const p)
         {
-		init_();
+		return ((ChunkHeader*)p - 1)->pBlock;
         }
 
-	fixed_alloc(fixed_alloc& owner)
-		: m_alloc(owner.m_alloc), m_cbChunk(cbElem + ChunkHeaderSize), m_nMaxPerBlock(BlockSize / m_cbChunk)
+	void BOOST_MEMORY_CALL do_allocate_block_()
         {
-		init_();
+		MemBlock* const blk = (MemBlock*)m_alloc.allocate(sizeof(MemBlock));
+		m_blks.push_front(blk);
+
+		blk->nUsed = 0;
+
+		char* p = blk->buffer + ChunkHeaderSize;
+		for (size_type i = m_nMaxPerBlock; i--; p += m_cbChunk)
+		{
+			chunkHeader_(p) = blk;
+			m_freelist.push_front((FreeChunk*)p);
+		}
+
+		BOOST_MEMORY_ASSERT(!m_freelist.empty());
+	}
+
+	void BOOST_MEMORY_CALL do_deallocate_block_(MemBlock* const blk)
+	{
+		char* p = blk->buffer + ChunkHeaderSize;
+		for (size_type i = m_nMaxPerBlock; i--; p += m_cbChunk)
+		{
+			((FreeChunk*)p)->erase();
+		}
+
+		blk->erase();
+
+		m_alloc.deallocate(blk);
         }
 
 public:
-	void* BOOST_MEMORY_CALL allocate()
+	void BOOST_MEMORY_CALL clear()
+	{
+		MemBlock* nextBlk;
+		for (MemBlock* blk = m_blks.first(); !m_blks.done(blk); blk = nextBlk)
+		{
+			nextBlk = blk->next();
+			m_alloc.deallocate(blk)
+		}
+		m_blks.clear();
+		m_freelist.clear();
+	}
+
+	__forceinline void* BOOST_MEMORY_CALL allocate()
         {
-		if (m_blks.)
+		if (m_freelist.empty())
+			do_allocate_block_();
+
+		void* p = &m_freelist.front();
+		++chunkHeader_(p)->nUsed;
+		m_freelist.pop_front();
+		return p;
+	}
+
+	__forceinline void BOOST_MEMORY_CALL deallocate(void* const p)
+	{
+		BOOST_MEMORY_ASSERT(chunkHeader_(p)->nUsed <= m_nMaxPerBlock);
+
+		MemBlock* const blk = chunkHeader_(p);
+		if (--blk->nUsed > 0)
+			m_freelist.push_front((FreeChunk*)p);
+		else
+			do_deallocate_block_(blk);
         }
 };
 
-*/
 // -------------------------------------------------------------------------
 // $Log: $
 
Added: sandbox/memory/boost/memory/pool.hpp
==============================================================================
--- (empty file)
+++ sandbox/memory/boost/memory/pool.hpp	2009-04-22 12:52:37 EDT (Wed, 22 Apr 2009)
@@ -0,0 +1,36 @@
+//
+//  boost/memory/pool.hpp
+//
+//  Copyright (c) 2004 - 2008 xushiwei (xushiweizh_at_[hidden])
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+//  See http://www.boost.org/libs/memory/index.htm for documentation.
+//
+#ifndef BOOST_MEMORY_POOL_HPP
+#define BOOST_MEMORY_POOL_HPP
+
+#ifndef BOOST_MEMORY_FIXED_ALLOC_HPP
+#include "fixed_alloc.hpp"
+#endif
+
+#ifndef BOOST_MEMORY_BLOCKPOOL_HPP
+#include "block_pool.hpp"
+#endif
+
+NS_BOOST_MEMORY_BEGIN
+
+// -------------------------------------------------------------------------
+// class pool, scoped_pool
+
+typedef fixed_alloc<NS_BOOST_MEMORY_POLICY::stdlib> pool;
+typedef fixed_alloc<NS_BOOST_MEMORY_POLICY::pool> scoped_pool;
+
+// -------------------------------------------------------------------------
+// $Log: $
+
+NS_BOOST_MEMORY_END
+
+#endif /* BOOST_MEMORY_POOL_HPP */
Modified: sandbox/memory/boost/memory/region_alloc.hpp
==============================================================================
--- sandbox/memory/boost/memory/region_alloc.hpp	(original)
+++ sandbox/memory/boost/memory/region_alloc.hpp	2009-04-22 12:52:37 EDT (Wed, 22 Apr 2009)
@@ -61,7 +61,7 @@
 private:
         const region_alloc& operator=(const region_alloc&);
 
-	MemBlock* BOOST_MEMORY_CALL chainHeader_() const
+	__forceinline MemBlock* BOOST_MEMORY_CALL chainHeader_() const
         {
                 return (MemBlock*)(m_begin - HeaderSize);
         }