??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
2、可以稍加改动成一个垂直搜索引擎;
3、可以提供搜索领域的ideaQ如果idea可行Q本人可以合作方式实现该ideaQ?br>4、可以提供整套服务,包括蜘蛛、分词、烦引、搜索服务;
郁闷Q感觉cppblog的h气不够,是不是考虑搬家到csdn呢?奇怪了cppblog删脓(chung)Q?
]]>
]]>
]]>
]]>
// MessageBlockManager.h
/**//**
* @date 2007.10.28
* @author PeakGao <peakgao163@163.com>
*/
#ifndef OM_MESSAGEBLOCKMANAGER_H
#define OM_MESSAGEBLOCKMANAGER_H
#include <ace/thread_mutex.h>
#include <ace/synch_traits.h>
#include <ace/message_block.h>
#include "MemPoolT.h"
namespace om
{
class MessageBlockManager
{
typedef CachePool<ACE_SYNCH_MUTEX> MyCachePool;
MyCachePool mBufPool; /**//// ~存ACE_Data_Block的缓冲区
MyCachePool mDBPool; /**//// ~存ACE_Data_Block对象本nQ由于不能默认构造,所以没有用ObjectPool模版
MyCachePool mMBPool; /**//// ~存ACE_Message_Block对象本nQ由于不能默认构造,所以没有用ObjectPool模版
ACE_SYNCH_MUTEX* mMutex; /**//// U程同步
public:
static MessageBlockManager* instance();
MessageBlockManager();
~MessageBlockManager();
/**//// 初始化参?/span>
void create(size_t bufSize, size_t objCount);
/**//// 清除~冲?/span>
void clear();
/**//// 分配一个消息块
ACE_Message_Block* alloc();
/**//// 释放指定的消息块
void free(ACE_Message_Block* mb);
};
} // namespace om
#endif // OM_MESSAGEBLOCKMANAGER_H
// MessageBlockManager.cpp
/**//**
* @date 2007.10.28
* @author PeakGao <peakgao163@163.com>
*/
#include "MessageBlockManager.h"
namespace om
{
MessageBlockManager* MessageBlockManager::instance()
{
static MessageBlockManager* mbm = 0;
if (mbm == 0)
mbm = new MessageBlockManager();
return mbm;
}
MessageBlockManager::MessageBlockManager()
: mMutex(NULL)
{
}
MessageBlockManager::~MessageBlockManager()
{
clear();
}
void MessageBlockManager::clear()
{
if (mMutex)
{
mBufPool.clear();
mDBPool.clear();
mMBPool.clear();
delete mMutex;
mMutex = NULL;
}
}
void MessageBlockManager::create(size_t bufSize, size_t objCount)
{
if (!mMutex)
mMutex = new ACE_SYNCH_MUTEX();
mBufPool.create(bufSize, objCount, mMutex);
mDBPool.create(sizeof(ACE_Data_Block), objCount, mMutex);
mMBPool.create(sizeof(ACE_Message_Block), objCount, mMutex);
}
ACE_Message_Block* MessageBlockManager::alloc()
{
void* buf = mBufPool.alloc();
ACE_Data_Block* db = ::new (mDBPool.alloc()) ACE_Data_Block(mBufPool.getBlockSize(),
ACE_Message_Block::MB_DATA, static_cast<const char*>(buf), 0, 0, ACE_Message_Block::DONT_DELETE, 0);
ACE_Message_Block* mb = ::new (mMBPool.alloc()) ACE_Message_Block(db, ACE_Message_Block::DONT_DELETE);
return mb;
}
void MessageBlockManager::free(ACE_Message_Block* mb)
{
// 不要调用对象的releaseҎ(gu)
mBufPool.free(mb->base());
ACE_Data_Block* db = mb->data_block();
db->~ACE_Data_Block();
mDBPool.free(db);
mb->~ACE_Message_Block();
mMBPool.free(mb);
}
} // namespace om
]]>
]]>
今天看了下它的内存分配,做了点记录,同大家一起分享下Q还没看完,没有讲到的别问我。。?br>
一、内存分配器相关
ACE_Allocator
基类
ACE_New_Allocator : public ACE_Allocator
传统的new和delete的动态内存分配器Q主要方法:(x)
malloc 分配一定大的内存Q实质就是new char[nbytes]Q?br>calloc 同上Q但带内存初始化
free 释放指定的内存块Q实质就是delete[] ptr;
ACE_Static_Allocator_Base : public ACE_Allocator
静态内存分配器Q一ơ性分配一个大内存Q比?00MQ然后在200M内分?已经不能叫分配了)指定大小的内存块
成员Q?br>char *buffer_; /// ~冲区首地址
size_t size_; /// ~冲区的大小
size_t offset_;/// 当前分配位置
主要Ҏ(gu)Q?br>malloc 分配一定大的内存Q实质就是buffer_ + offset_ + nbytesQ当过size_时分配失?br>calloc 同上Q但带内存初始化
free 释放指定的内存块Q实质是I操?br>从实质来看只适合预知消耗内存大而且一般不q行释放操作的情况下Q因为释攑的内存没有得到应?/p>
template <class MALLOC>
class ACE_Allocator_Adapter : public ACE_Allocator
内存分配适配器,对各U各L(fng)内存分配c进行适配Q之符合ACE_Allocator接口QMALLOC是具体的内存
分配实现Q比如上面的ACE_New_AllocatorQACE_Static_Allocator_Base和用戯定义的分配器
二、空闲列?br>
template <class T>
class ACE_Cached_Mem_Pool_Node
支持可缓存的对象节点Q可用于I闲链表(free_list)Q实Cset_next和get_next
成员Q?br>ACE_Cached_Mem_Pool_Node<T>* next_;
template <class T>
class ACE_Free_List
模版基类
主要Ҏ(gu)Q?br>add 加入一个节点到I闲链表
remove U除一个空闲节点(l用户用)
size 链表当前有效的空闲节点个?br>resize 重新讄链表节点个数
template <class T, class ACE_LOCK>
class ACE_Locked_Free_List : public ACE_Free_List<T>
带锁{略的空闲列表,其实除了锁策略,它还有其他几个特点:(x)
1、可以定制ؓ(f)一个纯I闲列表Q就是内部不调用new/deleteQ由外部处理Q在构造时mode传入
ACE_PURE_FREE_LIST卛_Q默认是ACE_FREE_LIST_WITH_POOLQ表C内部在需要时可以调用new/deleteq行操作Q?br>2、支持水?water mark)的概念,一个低水位(lwm)Q一个高水位(hwm)Q水位只对mode为ACE_FREE_LIST_WITH_POOL时v作用
3、当节点不够Ӟ支持一ơ性递增inc个节点(Nq户在构造时传入Q,只对mode为ACE_FREE_LIST_WITH_POOL时v作用
主要Ҏ(gu)Q?br>add 加入一个节点(可能是用L(fng)完了的节点)Q如果mode为ACE_PURE_FREE_LIST或者mode为ACE_FREE_LIST_WITH_POOL而size<hwm时允许加入,否则delete?br>remove 从空闲链表移除一个节点(l用户用)Q当mode为ACE_FREE_LIST_WITH_POOL而size<=lwmӞ表示节点数过,pȝ?x)分配inc个节点出来以解燃眉之急,如果是ACE_PURE_FREE_LIST模式Q当节点Cؓ(f)0Ӟremove返回NULL
resize 当mode为ACE_FREE_LIST_WITH_POOL时有意义Qresize>sizeӞ分配resize-size个节点,否则释放size-resize个节?/p>
举例Q?br>class MyClass
{
int dummy;
public:
MyClass() : dummy(99) {}
void foo()
{
std::cout<<dummy<<std::endl;
}
};
void test()
{
ACE_Locked_Free_List< ACE_Cached_Mem_Pool_Node< MyClass >, ACE_SYNCH_NULL_MUTEX> freeList; // 用ACE_SYNCH_NULL_MUTEX不需要同步,{同于单U程
// 取出一个(分配一个)
ACE_Cached_Mem_Pool_Node< MyClass >* node = freeList.remove();
MyClass* mc = node.addr();
// 用一?br> mc->foo();
// 不用了,释放?br> freeList.add(node);
}
三、各U内存分配策?br>template <class T, class ACE_LOCK>
class ACE_Cached_Allocator : public ACE_New_Allocator
有缓存功能的动态分配器Q采用空闲链表进行节点管理,I闲链表的mode为ACE_PURE_FREE_LISTQ即真正的new/delete由ACE_Cached_Allocator自己操作Q?br>构造时可指定初始化T节点的个敎ͼ节点的大由sizeof(T)军_Q同时进行字节对齐?br>注意Q?br>该分配器内部对Tcd没有q行构造和析构Q所以不适合class使用Q可用于structQƈ且该分配器不支持自动增大内存区(也就是pool_成员在构造时q定了Q?br>Q当内存不够Ӟ分配?x)失败?br>主要成员Q?br>char *pool_; /// 内存?br>ACE_Locked_Free_List<ACE_Cached_Mem_Pool_Node<T>, ACE_LOCK> free_list_; /// I闲节点理
主要Ҏ(gu)Q?br>malloc 分配一个T节点Q实际就?return free_list_.remove()->addr();
calloc 同上Q但?x)初始化内存数?br>free 释放一个T节点Q实际就?free_list_.add ((ACE_Cached_Mem_Pool_Node<T> *) ptr);
template <class ACE_LOCK>
class ACE_Dynamic_Cached_Allocator : public ACE_New_Allocator
同上Q但是没有T模版参数Q多了一个成员chunk_size_Q每个节点的大小q戯行定义,同样不存在构造和析构功能Q仅仅停留在固定节点大小的缓冲区的管理,内部没有q行字节寚w?br>
template <size_t POOL_SIZE>
class ACE_Static_Allocator : public ACE_Static_Allocator_Base
Z堆栈的静态内存分配器QPOOL_SIZE为堆栈大?br>
【原】CEdit & CRichEdit 使用技?/u>