KMemStack.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:4k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. //
  4. // File: KMemStack.cpp
  5. // Date: 2000.08.08
  6. // Code: WangWei(Daphnis)
  7. // Desc: Memory Stack Class
  8. //---------------------------------------------------------------------------
  9. #include "KWin32.h"
  10. #include "KDebug.h"
  11. #include "KMemBase.h"
  12. #include "KMemStack.h"
  13. //---------------------------------------------------------------------------
  14. // 函数: KMemStack
  15. // 功能: 购造函数
  16. // 参数: void
  17. // 返回: void
  18. //---------------------------------------------------------------------------
  19. KMemStack::KMemStack()
  20. {
  21. g_MemZero(m_pStack, sizeof(m_pStack));
  22. m_nStackTop  = 0;
  23. m_nStackEnd  = 0;
  24. m_nChunkTop  = 0;
  25. m_nChunkSize = 65536;
  26. }
  27. //---------------------------------------------------------------------------
  28. // 函数: ~KMemStack
  29. // 功能: 析购函数
  30. // 参数: void
  31. // 返回: void
  32. //---------------------------------------------------------------------------
  33. KMemStack::~KMemStack()
  34. {
  35. FreeAllChunks();
  36. }
  37. //---------------------------------------------------------------------------
  38. // 函数: Init
  39. // 功能: 初始化
  40. // 参数: nChunkSize Chunk尺寸大小
  41. // 返回: void
  42. //---------------------------------------------------------------------------
  43. void KMemStack::Init(int nChunkSize)
  44. {
  45. FreeAllChunks();
  46. m_nChunkSize = nChunkSize;
  47. }
  48. //---------------------------------------------------------------------------
  49. // 函数: Push
  50. // 功能: 分配内存
  51. // 参数: nSize 内存大小
  52. // 返回: PVOID 内存指针,= NULL 表示分配失败
  53. //---------------------------------------------------------------------------
  54. PVOID KMemStack::Push(int nSize)
  55. {
  56. PBYTE pResult;
  57. if (m_nChunkSize < nSize)
  58. m_nChunkSize = nSize;
  59. if (m_nStackTop + nSize > m_nStackEnd)
  60. {
  61. if (!AllocNewChunk())
  62. return NULL;
  63. }
  64. pResult = m_pStack[m_nChunkTop - 1];
  65. pResult += m_nStackTop;
  66. m_nStackTop += nSize;
  67. return pResult;
  68. }
  69. //---------------------------------------------------------------------------
  70. // 函数: Free
  71. // 功能: 释放内存块
  72. // 参数: pMem 内存块指针
  73. // 返回: void
  74. //---------------------------------------------------------------------------
  75. void KMemStack::Free(PVOID pMem)
  76. {
  77. return;
  78. }
  79. //---------------------------------------------------------------------------
  80. // 函数: AllocNewChunk
  81. // 功能: 分配新的内存块,并且填充为0
  82. // 参数: void
  83. // 返回: TRUE 成功 
  84. // FALSE 失败
  85. //---------------------------------------------------------------------------
  86. BOOL KMemStack::AllocNewChunk()
  87. {
  88. if (m_nChunkTop >= MAX_CHUNK)
  89. {
  90. g_MessageBox("KMemStack : Chunk over flow");
  91. return FALSE;
  92. }
  93. m_pStack[m_nChunkTop] = (PBYTE)g_MemAlloc(m_nChunkSize);
  94. if (m_pStack[m_nChunkTop] == NULL)
  95. return FALSE;
  96. m_nChunkTop++;
  97. m_nStackTop = 0;
  98. m_nStackEnd = m_nChunkSize;
  99. return TRUE;
  100. }
  101. //---------------------------------------------------------------------------
  102. // 函数: FreeAllChunks
  103. // 功能: 释放所有的内存块
  104. // 参数: void
  105. // 返回: void
  106. //---------------------------------------------------------------------------
  107. void KMemStack::FreeAllChunks()
  108. {
  109. for (int i = 0; i < m_nChunkTop; i++)
  110. {
  111. g_MemFree(m_pStack[i]);
  112. m_pStack[i] = NULL;
  113. }
  114. m_nStackTop = 0;
  115. m_nStackEnd = 0;
  116. m_nChunkTop = 0;
  117. }
  118. //---------------------------------------------------------------------------
  119. // 函数: GetChunkSize
  120. // 功能: 取得堆栈Chunk的大小
  121. // 参数: void
  122. // 返回: Chunk 的大小 in bytes
  123. //---------------------------------------------------------------------------
  124. int KMemStack::GetChunkSize()
  125. {
  126. return m_nChunkSize;
  127. }
  128. //---------------------------------------------------------------------------
  129. // 函数: GetStackSize
  130. // 功能: 取得内存堆栈的大小
  131. // 参数: void
  132. // 返回: 内存堆栈的大小 in bytes
  133. //---------------------------------------------------------------------------
  134. int KMemStack::GetStackSize()
  135. {
  136. return (m_nStackTop + (m_nChunkTop - 1) * m_nChunkSize);
  137. }
  138. //---------------------------------------------------------------------------