Code/Resource
Windows Develop
Linux-Unix program
Internet-Socket-Network
Web Server
Browser Client
Ftp Server
Ftp Client
Browser Plugins
Proxy Server
Email Server
Email Client
WEB Mail
Firewall-Security
Telnet Server
Telnet Client
ICQ-IM-Chat
Search Engine
Sniffer Package capture
Remote Control
xml-soap-webservice
P2P
WEB(ASP,PHP,...)
TCP/IP Stack
SNMP
Grid Computing
SilverLight
DNS
Cluster Service
Network Security
Communication-Mobile
Game Program
Editor
Multimedia program
Graph program
Compiler program
Compress-Decompress algrithms
Crypt_Decrypt algrithms
Mathimatics-Numerical algorithms
MultiLanguage
Disk/Storage
Java Develop
assembly language
Applications
Other systems
Database system
Embeded-SCM Develop
FlashMX/Flex
source in ebook
Delphi VCL
OS Develop
MiddleWare
MPI
MacOS develop
LabView
ELanguage
Software/Tools
E-Books
Artical/Document
KCache.cpp
Package: SwordOnline.rar [view]
Upload User: dzyhzl
Upload Date: 2019-04-29
Package Size: 56270k
Code Size: 5k
Category:
Game Server Simulator
Development Platform:
C/C++
- //---------------------------------------------------------------------------
- // Sword3 Engine (c) 1999-2000 by Kingsoft
- //
- // File: KCache.cpp
- // Date: 2000.08.08
- // Code: WangWei(Daphnis)
- // Desc: Cache class
- //---------------------------------------------------------------------------
- #include "KWin32.h"
- #include "KDebug.h"
- #include "KMemBase.h"
- #include "KMemManager.h"
- #include "KCache.h"
- //---------------------------------------------------------------------------
- // 函数: KCache
- // 功能: 购造函数
- // 参数: void
- // 返回: void
- //---------------------------------------------------------------------------
- KCache::KCache()
- {
- m_nMaxNode = 256;
- m_nLimitNode = 256;
- }
- //---------------------------------------------------------------------------
- // 函数: Release
- // 功能: 释放所有Cache中的节点,由于在析构中无法调用虚函数
- // 参数: void
- // 返回: void
- //---------------------------------------------------------------------------
- void KCache::Release()
- {
- KCacheNode* lpNode;
- while (lpNode = (KCacheNode*)m_HashList.RemoveHead())
- {
- FreeNode(lpNode);
- delete(lpNode);
- }
- }
- //---------------------------------------------------------------------------
- // 函数: ~KCache
- // 功能: 析购函数
- // 参数: void
- // 返回: void
- //---------------------------------------------------------------------------
- KCache::~KCache()
- {
- /*Release();*/
- }
- //---------------------------------------------------------------------------
- // 函数: Init
- // 功能:
- // 参数:
- // 返回: void
- //---------------------------------------------------------------------------
- void KCache::Init(int nMaxNode)
- {
- m_nMaxNode = nMaxNode;
- m_nLimitNode = m_nMaxNode;
- }
- //---------------------------------------------------------------------------
- // 函数: NewNode
- // 功能:
- // 参数:
- // 返回:
- //---------------------------------------------------------------------------
- KCacheNode* KCache::NewNode(char* lpName)
- {
- //寻找相同的节点
- KCacheNode* lpNode = (KCacheNode*)m_HashList.Find(lpName);
- //如果不存在
- if (NULL == lpNode)
- {
- if (m_HashList.GetNodeCount() < m_nMaxNode)
- {
- //如果没有到最大节点数,就产生一个新节点
- //并把它放在链表的最前面
- lpNode = new KCacheNode;
- lpNode->SetName(lpName);
- m_HashList.AddHead(lpNode);
- LoadNode(lpNode);
- lpNode->m_Ref = 1;
- }
- else
- {
- //已经达到最大节点数,查看是否有冗余结点,有,就把最后用的一个
- //节点变为当前节点,并把它移动到最前面,否则就扩大最大节点数
- lpNode = (KCacheNode *)m_HashList.GetTail();
- if (lpNode->m_Ref == 0)
- {
- lpNode = (KCacheNode*)m_HashList.RemoveTail();
- FreeNode(lpNode);
- lpNode->SetName(lpName);
- LoadNode(lpNode);
- m_HashList.AddHead(lpNode);
- lpNode->m_Ref = 1;
- }
- else
- {
- lpNode = new KCacheNode;
- lpNode->SetName(lpName);
- m_HashList.AddHead(lpNode);
- LoadNode(lpNode);
- lpNode->m_Ref = 1;
- m_nMaxNode++;
- }
- }
- }
- return lpNode;
- }
- //---------------------------------------------------------------------------
- // 函数: GetNode
- // 功能:
- // 参数:
- // 返回:
- //---------------------------------------------------------------------------
- KCacheNode* KCache::GetNode(char* lpName, KCacheNode* lpNode)
- {
- //如果不是第一次取,则比较一下名字,看节点是否改变
- if (lpNode)
- { //如果节点没有改变,就把它移动到最前面
- if (g_StrCmp(lpName, lpNode->GetName()))
- {
- lpNode->Remove();
- m_HashList.AddHead(lpNode);
- lpNode->m_Ref = 1;
- return lpNode;
- }
- }
- //如果是第一次取对象,或者对象已经改变,就产生新对象
- return NewNode(lpName);
- }
- //---------------------------------------------------------------------------
- // 函数: Prepare
- // 功能:
- // 参数:
- // 返回:
- //---------------------------------------------------------------------------
- void KCache::Prepare()
- {
- // 释放掉比设定大小多出的且在本次使用中用不上的节点内容
- int i = m_nMaxNode;
- KCacheNode* lpOldNode = NULL;
- KCacheNode* lpNode = (KCacheNode *)m_HashList.GetTail();
- while(i > m_nLimitNode)
- {
- if (lpNode->m_Ref)
- break;
- FreeNode(lpNode);
- lpNode = (KCacheNode *)lpNode->GetPrev();
- i--;
- }
- // 把本次使用标记清零以备下次循环使用
- lpNode = (KCacheNode *)m_HashList.GetHead();
- while(lpNode)
- {
- lpNode->m_Ref = 0;
- lpNode = (KCacheNode *)lpNode->GetNext();
- }
- }
- void KCache::ClearNode(char * lpName)
- {
- if (NULL == lpName || NULL == lpName[0]) return;
- //寻找该节点
- KCacheNode* lpNode = (KCacheNode*)m_HashList.Find(lpName);
- //如果存在,清除掉!
- if (NULL != lpNode)
- {
- lpNode->Remove();
- FreeNode(lpNode);
- delete lpNode;
- }
- }