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

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. //
  4. // File: KCache.cpp
  5. // Date: 2000.08.08
  6. // Code: WangWei(Daphnis)
  7. // Desc: Cache class
  8. //---------------------------------------------------------------------------
  9. #include "KWin32.h"
  10. #include "KDebug.h"
  11. #include "KMemBase.h"
  12. #include "KMemManager.h"
  13. #include "KCache.h"
  14. //---------------------------------------------------------------------------
  15. // 函数: KCache
  16. // 功能: 购造函数
  17. // 参数: void
  18. // 返回: void
  19. //---------------------------------------------------------------------------
  20. KCache::KCache()
  21. {
  22. m_nMaxNode = 256;
  23. m_nLimitNode = 256;
  24. }
  25. //---------------------------------------------------------------------------
  26. // 函数: Release
  27. // 功能:    释放所有Cache中的节点,由于在析构中无法调用虚函数
  28. // 参数: void
  29. // 返回: void
  30. //---------------------------------------------------------------------------
  31. void KCache::Release()
  32. {
  33. KCacheNode* lpNode;
  34. while (lpNode = (KCacheNode*)m_HashList.RemoveHead())
  35. {
  36. FreeNode(lpNode);
  37. delete(lpNode);
  38. }
  39. }
  40. //---------------------------------------------------------------------------
  41. // 函数: ~KCache
  42. // 功能: 析购函数
  43. // 参数: void
  44. // 返回: void
  45. //---------------------------------------------------------------------------
  46. KCache::~KCache()
  47. {
  48.     /*Release();*/
  49. }
  50. //---------------------------------------------------------------------------
  51. // 函数: Init
  52. // 功能:
  53. // 参数:
  54. // 返回: void
  55. //---------------------------------------------------------------------------
  56. void KCache::Init(int nMaxNode)
  57. {
  58. m_nMaxNode = nMaxNode;
  59. m_nLimitNode = m_nMaxNode;
  60. }
  61. //---------------------------------------------------------------------------
  62. // 函数: NewNode
  63. // 功能:
  64. // 参数:
  65. // 返回:
  66. //---------------------------------------------------------------------------
  67. KCacheNode* KCache::NewNode(char* lpName)
  68. {
  69. //寻找相同的节点
  70. KCacheNode* lpNode = (KCacheNode*)m_HashList.Find(lpName);
  71. //如果不存在
  72. if (NULL == lpNode)
  73. {
  74. if (m_HashList.GetNodeCount() < m_nMaxNode)
  75. {
  76. //如果没有到最大节点数,就产生一个新节点
  77. //并把它放在链表的最前面
  78. lpNode = new KCacheNode;
  79. lpNode->SetName(lpName);
  80. m_HashList.AddHead(lpNode);
  81. LoadNode(lpNode);
  82. lpNode->m_Ref = 1;
  83. }
  84. else
  85. {
  86. //已经达到最大节点数,查看是否有冗余结点,有,就把最后用的一个
  87. //节点变为当前节点,并把它移动到最前面,否则就扩大最大节点数
  88. lpNode = (KCacheNode *)m_HashList.GetTail();
  89. if (lpNode->m_Ref == 0)
  90. {
  91. lpNode = (KCacheNode*)m_HashList.RemoveTail();
  92. FreeNode(lpNode);
  93. lpNode->SetName(lpName);
  94. LoadNode(lpNode);
  95. m_HashList.AddHead(lpNode);
  96. lpNode->m_Ref = 1;
  97. }
  98. else
  99. {
  100. lpNode = new KCacheNode;
  101. lpNode->SetName(lpName);
  102. m_HashList.AddHead(lpNode);
  103. LoadNode(lpNode);
  104. lpNode->m_Ref = 1;
  105. m_nMaxNode++;
  106. }
  107. }
  108. }
  109. return lpNode;
  110. }
  111. //---------------------------------------------------------------------------
  112. // 函数: GetNode
  113. // 功能:
  114. // 参数:
  115. // 返回:
  116. //---------------------------------------------------------------------------
  117. KCacheNode* KCache::GetNode(char* lpName, KCacheNode* lpNode)
  118. {
  119. //如果不是第一次取,则比较一下名字,看节点是否改变
  120. if (lpNode)
  121. { //如果节点没有改变,就把它移动到最前面
  122. if (g_StrCmp(lpName, lpNode->GetName()))
  123. {
  124. lpNode->Remove();
  125. m_HashList.AddHead(lpNode);
  126. lpNode->m_Ref = 1;
  127. return lpNode;
  128. }
  129. }
  130. //如果是第一次取对象,或者对象已经改变,就产生新对象
  131. return NewNode(lpName);
  132. }
  133. //---------------------------------------------------------------------------
  134. // 函数: Prepare
  135. // 功能:
  136. // 参数:
  137. // 返回:
  138. //---------------------------------------------------------------------------
  139. void KCache::Prepare()
  140. {
  141. // 释放掉比设定大小多出的且在本次使用中用不上的节点内容
  142. int i = m_nMaxNode;
  143. KCacheNode* lpOldNode = NULL;
  144. KCacheNode* lpNode = (KCacheNode *)m_HashList.GetTail();
  145. while(i > m_nLimitNode)
  146. {
  147. if (lpNode->m_Ref)
  148. break;
  149. FreeNode(lpNode);
  150. lpNode = (KCacheNode *)lpNode->GetPrev();
  151. i--;
  152. }
  153. // 把本次使用标记清零以备下次循环使用
  154. lpNode = (KCacheNode *)m_HashList.GetHead();
  155. while(lpNode)
  156. {
  157. lpNode->m_Ref = 0;
  158. lpNode = (KCacheNode *)lpNode->GetNext();
  159. }
  160. }
  161. void KCache::ClearNode(char * lpName)
  162. {
  163. if (NULL == lpName || NULL == lpName[0]) return;
  164. //寻找该节点
  165. KCacheNode* lpNode = (KCacheNode*)m_HashList.Find(lpName);
  166. //如果存在,清除掉!
  167. if (NULL != lpNode)
  168. {
  169. lpNode->Remove();
  170. FreeNode(lpNode);
  171. delete lpNode;
  172. }
  173. }