Buffers.cpp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. /***********************************************************************/
  2. //文 件 名:CBuffers.cpp
  3. //功 能:CBuffers类实现
  4. /***********************************************************************/
  5. #include <windows.h>
  6. #include "Buffers.h"
  7. #ifdef _DEBUG
  8. #include "stdio.h"
  9. #include <iostream>
  10. using namespace std;
  11. #endif
  12. //直接从zwl_memory中搬过来
  13. //属于粗放型的内存管理
  14. template<class _Tc>class template_malloc
  15. {
  16. #ifdef _DEBUG
  17. //检测用
  18. public:
  19. unsigned int nItems;
  20. #endif
  21. #pragma pack(push,1) //强制本结构1字节对齐
  22. typedef struct tagItem
  23. {
  24. union
  25. {
  26. tagItem*next;
  27. size_t size;
  28. };
  29. _Tc data;
  30. }ITEM,*PITEM;
  31. #pragma pack(pop)
  32. public:
  33. char* mlloc(void)
  34. {
  35. if(!__item__) return(NULL);
  36. PITEM pitem = __item__;
  37. __item__ = __item__->next;
  38. pitem->size = sizeof(_Tc);
  39. #ifdef _DEBUG
  40. nItems--;
  41. #endif
  42. return(pitem->data);
  43. }
  44. #ifdef _DEBUG
  45. int getItemCount(){
  46. return nItems;
  47. }
  48. #endif
  49. void release(char*pdata)
  50. {
  51. PITEM pitem=(PITEM)pdata;
  52. memset(pitem,0,sizeof(ITEM));
  53. pitem->next = __item__;
  54. __item__ = pitem;
  55. #ifdef _DEBUG
  56. nItems++;
  57. #endif
  58. }
  59. void clean(void)
  60. {
  61. char*lpData=NULL;
  62. for(PITEM pnext=NULL;__item__;__item__=pnext)
  63. {
  64. pnext = __item__->next;
  65. lpData = (char*)__item__;
  66. delete[] lpData;
  67. }
  68. }
  69. template_malloc(void):__item__(NULL)
  70. {
  71. #ifdef _DEBUG
  72. nItems = 0;
  73. #endif
  74. }
  75. ~template_malloc(void)
  76. {
  77. clean();
  78. }
  79. PITEM __item__;
  80. };
  81. #define __malloc__(T,P)\
  82. else if(lsize<=T)\
  83. {\
  84. lpData=P.mlloc();\
  85. _size = T;\
  86. }
  87. class memory_factory
  88. {
  89. public:
  90. char*malloc( size_t lsize, size_t* msize )
  91. {
  92. char*lpData=NULL;
  93. size_t _size(0);
  94. EnterCriticalSection(&__lock__);
  95. if(lsize<=16)
  96. {
  97. lpData = _alloc_16.mlloc();
  98. _size = 16;
  99. }
  100. __malloc__(32,_alloc_32)
  101. __malloc__(64,_alloc_64)
  102. __malloc__(128,_alloc_128)
  103. __malloc__(256,_alloc_256)
  104. __malloc__(512,_alloc_512)
  105. __malloc__(1024,_alloc_1k)
  106. __malloc__(1024*2L,_alloc_2k)
  107. __malloc__(1024*4L,_alloc_4k)
  108. __malloc__(1024*8L,_alloc_8k)
  109. __malloc__(1024*16L,_alloc_16k)
  110. __malloc__(1024*32L,_alloc_32k)
  111. __malloc__(1024*64L,_alloc_64k)
  112. __malloc__(1024*128L,_alloc_128k)
  113. __malloc__(1024*256L,_alloc_256k)
  114. __malloc__(1024*512L,_alloc_512k)
  115. __malloc__(1024*1024L,_alloc_1m)
  116. //__malloc__(2*1024*1024L,_alloc_2m)
  117. //__malloc__(3*1024*1024L,_alloc_3m)
  118. //__malloc__(4*1024*1024L,_alloc_4m)
  119. //__malloc__(8*1024*1024L,_alloc_8m)
  120. //__malloc__(16*1024*1024L,_alloc_16m)
  121. //__malloc__(32*1024*1024L,_alloc_32m)
  122. else
  123. {
  124. _size=lsize;
  125. }
  126. LeaveCriticalSection(&__lock__);
  127. if(!lpData)
  128. {
  129. char*lpMalloc=new char[ _size + sizeof( size_t ) ];
  130. if(!lpMalloc) return(NULL);
  131. *(size_t*)lpMalloc = _size;
  132. memset(lpData=lpMalloc + sizeof( size_t ), 0, _size );
  133. }
  134. #ifdef _DEBUG
  135. else {
  136. nCount --;
  137. }
  138. #endif
  139. if(msize) *msize = _size;
  140. return(lpData);
  141. }
  142. void release(char*lpData)
  143. {
  144. if( lpData == NULL )
  145. return;
  146. char* lpMalloc = lpData - sizeof( size_t );
  147. EnterCriticalSection(&__lock__);
  148. switch( *( size_t* )lpMalloc )
  149. {
  150. case 16: _alloc_16.release(lpMalloc); break;
  151. case 32: _alloc_32.release(lpMalloc); break;
  152. case 64: _alloc_64.release(lpMalloc); break;
  153. case 128: _alloc_128.release(lpMalloc); break;
  154. case 256: _alloc_256.release(lpMalloc); break;
  155. case 512: _alloc_512.release(lpMalloc); break;
  156. case 1024: _alloc_1k.release(lpMalloc); break;
  157. case 1024*2L: _alloc_2k.release(lpMalloc); break;
  158. case 1024*4L: _alloc_4k.release(lpMalloc); break;
  159. case 1024*8L: _alloc_8k.release(lpMalloc); break;
  160. case 1024*16L: _alloc_16k.release(lpMalloc); break;
  161. case 1024*32L: _alloc_32k.release(lpMalloc); break;
  162. case 1024*64L: _alloc_64k.release(lpMalloc); break;
  163. case 1024*128L: _alloc_128k.release(lpMalloc); break;
  164. case 1024*256L: _alloc_256k.release(lpMalloc); break;
  165. case 1024*512L: _alloc_512k.release(lpMalloc); break;
  166. case 1024*1024L: _alloc_1m.release(lpMalloc); break;
  167. // case 2*1024*1024L: _alloc_2m.release(lpMalloc); break;
  168. // case 3*1024*1024L: _alloc_3m.release(lpMalloc); break;
  169. // case 4*1024*1024L: _alloc_4m.release(lpMalloc); break;
  170. // case 8*1024*1024L: _alloc_8m.release(lpMalloc); break;
  171. // case 16*1024*1024L: _alloc_16m.release(lpMalloc); break;
  172. // case 32*1024*1024L: _alloc_32m.release(lpMalloc); break;
  173. default: delete[] lpMalloc;
  174. }
  175. LeaveCriticalSection(&__lock__);
  176. #ifdef _DEBUG
  177. nCount ++;
  178. #endif
  179. }
  180. void clean(void)
  181. {
  182. EnterCriticalSection(&__lock__);
  183. _alloc_16.clean();
  184. _alloc_32.clean();
  185. _alloc_64.clean();
  186. _alloc_128.clean();
  187. _alloc_256.clean();
  188. _alloc_512.clean();
  189. _alloc_1k.clean();
  190. _alloc_2k.clean();
  191. _alloc_4k.clean();
  192. _alloc_8k.clean();
  193. _alloc_16k.clean();
  194. _alloc_32k.clean();
  195. _alloc_64k.clean();
  196. _alloc_128k.clean();
  197. _alloc_256k.clean();
  198. _alloc_512k.clean();
  199. _alloc_1m.clean();
  200. _alloc_2m.clean();
  201. _alloc_3m.clean();
  202. _alloc_4m.clean();
  203. _alloc_8m.clean();
  204. _alloc_16m.clean();
  205. _alloc_32m.clean();
  206. LeaveCriticalSection(&__lock__);
  207. }
  208. memory_factory(void)
  209. {
  210. InitializeCriticalSection(&__lock__);
  211. #ifdef _DEBUG
  212. nCount = 0;;
  213. #endif
  214. }
  215. ~memory_factory(void)
  216. {
  217. clean();
  218. DeleteCriticalSection(&__lock__);
  219. }
  220. #ifdef _DEBUG
  221. int getItemCount(){
  222. return nCount;
  223. }
  224. #endif
  225. template_malloc<char[16]> _alloc_16;
  226. template_malloc<char[32]> _alloc_32;
  227. template_malloc<char[64]> _alloc_64;
  228. template_malloc<char[128]> _alloc_128;
  229. template_malloc<char[256]> _alloc_256;
  230. template_malloc<char[512]> _alloc_512;
  231. template_malloc<char[1024]> _alloc_1k;
  232. template_malloc<char[1024*2L]> _alloc_2k;
  233. template_malloc<char[1024*4L]> _alloc_4k;
  234. template_malloc<char[1024*8L]> _alloc_8k;
  235. template_malloc<char[1024*16L]> _alloc_16k;
  236. template_malloc<char[1024*32L]> _alloc_32k;
  237. template_malloc<char[1024*64L]> _alloc_64k;
  238. template_malloc<char[1024*128L]> _alloc_128k;
  239. template_malloc<char[1024*256L]> _alloc_256k;
  240. template_malloc<char[1024*512L]> _alloc_512k;
  241. template_malloc<char[1024*1024L]> _alloc_1m;
  242. template_malloc<char[1024*1024L*2]> _alloc_2m;
  243. template_malloc<char[1024*1024L*3]> _alloc_3m;
  244. template_malloc<char[1024*1024L*4]> _alloc_4m;
  245. template_malloc<char[1024*1024L*8]> _alloc_8m;
  246. template_malloc<char[1024*1024L*16]> _alloc_16m;
  247. template_malloc<char[1024*1024L*32]> _alloc_32m;
  248. CRITICAL_SECTION __lock__;
  249. #ifdef _DEBUG
  250. int nCount;
  251. #endif
  252. }__memory__;
  253. CBuffers::CBuffers(LPVOID lpBuffer):
  254. bufData((LPSTR)lpBuffer),sizeData(0),sizeMalloc(0)
  255. {
  256. if(bufData){
  257. sizeMalloc = *( size_t* )( (char*)lpBuffer - sizeof( size_t ) );
  258. }
  259. }
  260. CBuffers::~CBuffers(void)
  261. {
  262. if(bufData)
  263. {
  264. __memory__.release(bufData);
  265. bufData = 0;
  266. }
  267. }
  268. /////////////////////////////////////////////////////////////////////////////
  269. LPSTR CBuffers::GetBuf(size_t lsize)
  270. {
  271. if( ( lsize + 1 ) > sizeMalloc )
  272. {
  273. if(bufData)
  274. {
  275. __memory__.release(bufData);
  276. bufData = 0;
  277. }
  278. bufData=__memory__.malloc( lsize + 1, &sizeMalloc );
  279. }
  280. if( bufData && sizeMalloc )
  281. memset( bufData, 0, sizeMalloc );
  282. sizeData = lsize;
  283. return(bufData);
  284. }
  285. void CBuffers::Release(void)
  286. {
  287. if(bufData)
  288. {
  289. __memory__.release(bufData);
  290. bufData = 0;
  291. }
  292. sizeData = sizeMalloc = 0;
  293. }
  294. char * CBuffers::Copy(void * lpData, size_t lsize)
  295. {
  296. if(!GetBuf(lsize+1)) return(0); //避免字符串等不注意的情形,多分配一点
  297. if(lsize)
  298. {
  299. memcpy(bufData,lpData,lsize);
  300. }
  301. sizeData = lsize;
  302. return(bufData);
  303. }
  304. char * CBuffers::Append(void * lpData, size_t lsize)
  305. {
  306. if(lsize)
  307. {
  308. if(!Extern(sizeData+lsize+1)) return(0);
  309. memcpy(bufData+sizeData,lpData,lsize);
  310. sizeData += lsize;
  311. }
  312. return(bufData);
  313. }
  314. char * CBuffers::Extern( size_t maxSize)
  315. {
  316. if(maxSize>sizeMalloc)
  317. {
  318. size_t sizeNew(0);
  319. char * bufNew=__memory__.malloc(maxSize, &sizeNew );
  320. if(!bufNew) return(0);
  321. if(bufData)
  322. {
  323. if(sizeData) memcpy(bufNew,bufData,sizeData);
  324. if(bufData)
  325. {
  326. __memory__.release(bufData);
  327. bufData = 0;
  328. }
  329. }
  330. bufData = bufNew;
  331. sizeMalloc = sizeNew;
  332. }
  333. return(bufData);
  334. }
  335. CBuffers::operator const char *(void) const
  336. {
  337. return(bufData);
  338. }
  339. const CBuffers&CBuffers::operator=(const char * lpString)
  340. {
  341. Copy((void*)lpString,lstrlenA(lpString));
  342. return(*this);
  343. }
  344. const CBuffers&CBuffers::operator+=(const char * lpString)
  345. {
  346. Append((void*)lpString,lstrlenA(lpString));
  347. return(*this);
  348. }
  349. void CBuffers::Attach(CBuffers*pMemory)
  350. {
  351. if(bufData)
  352. {
  353. __memory__.release(bufData);
  354. bufData = 0;
  355. }
  356. sizeData = pMemory->sizeData;
  357. sizeMalloc = pMemory->sizeMalloc;
  358. bufData = pMemory->bufData;
  359. pMemory->sizeData = pMemory->sizeMalloc = 0;
  360. pMemory->bufData = 0;
  361. }
  362. void CBuffers::Detach()
  363. {
  364. bufData = NULL;
  365. }