初步修复
This commit is contained in:
parent
8fc4357cc6
commit
e4714f3f0e
46705 changed files with 12004901 additions and 0 deletions
226
Server/DNVillageServer/DNBaseObjectManager.cpp
Normal file
226
Server/DNVillageServer/DNBaseObjectManager.cpp
Normal file
|
|
@ -0,0 +1,226 @@
|
|||
#include "StdAfx.h"
|
||||
#include "DNBaseObjectManager.h"
|
||||
#include "Util.h"
|
||||
#include "Log.h"
|
||||
|
||||
extern TVillageConfig g_Config;
|
||||
|
||||
CDNBaseObjectManager::CDNBaseObjectManager(void): m_nProcessCount(0)
|
||||
{
|
||||
Clear();
|
||||
}
|
||||
|
||||
CDNBaseObjectManager::~CDNBaseObjectManager(void)
|
||||
{
|
||||
if (m_VecObjects.empty()) return;
|
||||
|
||||
CDNBaseObject *pObj = NULL;
|
||||
|
||||
m_VecLock.Lock();
|
||||
for (int i = 0; i < (int)m_VecObjects.size(); i++){
|
||||
pObj = m_VecObjects[i];
|
||||
if (!pObj) continue;
|
||||
pObj->LeaveWorld();
|
||||
pObj->FinalObject();
|
||||
delete pObj;
|
||||
pObj = NULL;
|
||||
}
|
||||
m_VecLock.UnLock();
|
||||
|
||||
Clear();
|
||||
}
|
||||
|
||||
void CDNBaseObjectManager::Clear()
|
||||
{
|
||||
m_KeyLock.Lock();
|
||||
m_NameKeyLock.Lock();
|
||||
m_VecLock.Lock();
|
||||
|
||||
m_KeyObjects.clear();
|
||||
m_NameKeyObjects.clear();
|
||||
m_VecObjects.clear();
|
||||
|
||||
m_VecLock.UnLock();
|
||||
m_NameKeyLock.UnLock();
|
||||
m_KeyLock.UnLock();
|
||||
}
|
||||
|
||||
void CDNBaseObjectManager::DoUpdate(DWORD CurTick)
|
||||
{
|
||||
if (m_VecObjects.empty()) return;
|
||||
|
||||
int nCount;
|
||||
CDNBaseObject *pObj = NULL;
|
||||
|
||||
m_VecLock.Lock();
|
||||
nCount = (int)m_VecObjects.size();
|
||||
if (nCount > PROCESSCOUNT) nCount = PROCESSCOUNT;
|
||||
|
||||
for (int i = 0; i < nCount; i++){
|
||||
if (m_nProcessCount >= (int)m_VecObjects.size())
|
||||
m_nProcessCount = 0;
|
||||
|
||||
pObj = m_VecObjects[m_nProcessCount];
|
||||
if (pObj) {
|
||||
if (pObj->boAllowDelete())
|
||||
DelObject(pObj);
|
||||
else
|
||||
pObj->DoUpdate(CurTick);
|
||||
}
|
||||
|
||||
m_nProcessCount++;
|
||||
}
|
||||
m_VecLock.UnLock();
|
||||
}
|
||||
|
||||
bool CDNBaseObjectManager::AddObject(CDNBaseObject *pObj)
|
||||
{
|
||||
if (!pObj) return false;
|
||||
if (FindObject(pObj->GetObjectID())){
|
||||
g_Log.Log(LogType::_ERROR, L"[ObjID: %u] CDNBaseObjectManager::AddObject Duplicate!!\r\n", pObj->GetObjectID());
|
||||
return false;
|
||||
}
|
||||
|
||||
if (g_IDGenerator.IsUser(pObj->GetObjectID()))
|
||||
{
|
||||
if (FindObjectByName(pObj->wszName())){
|
||||
g_Log.Log(LogType::_ERROR, L"[ObjID: %s] CDNBaseObjectManager::AddObject Duplicate!!\r\n", pObj->wszName());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
m_VecLock.Lock();
|
||||
TVecObjects::iterator it = find(m_VecObjects.begin(), m_VecObjects.end(), pObj);
|
||||
if( it != m_VecObjects.end() )
|
||||
{
|
||||
m_VecLock.UnLock();
|
||||
_DANGER_POINT();
|
||||
return false;
|
||||
}
|
||||
m_VecObjects.push_back(pObj);
|
||||
m_VecLock.UnLock();
|
||||
|
||||
m_KeyLock.Lock();
|
||||
m_KeyObjects[pObj->GetObjectID()] = pObj;
|
||||
m_KeyLock.UnLock();
|
||||
|
||||
if (g_IDGenerator.IsUser(pObj->GetObjectID())){
|
||||
m_NameKeyLock.Lock();
|
||||
m_NameKeyObjects[pObj->wszName()] = pObj;
|
||||
m_NameKeyLock.UnLock();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CDNBaseObjectManager::DelObject(CDNBaseObject *pObj)
|
||||
{
|
||||
if (!pObj) return false;
|
||||
|
||||
if (g_IDGenerator.IsUser(pObj->GetObjectID())){
|
||||
|
||||
ScopeLock<CSyncLock> lock( m_NameKeyLock );
|
||||
|
||||
TMapNameObjects::iterator itername = m_NameKeyObjects.find(pObj->wszName());
|
||||
if (itername != m_NameKeyObjects.end()){
|
||||
if (itername->second != pObj){
|
||||
g_Log.Log(LogType::_ERROR, L"[ObjID:%u] CDNBaseObjectManager::DelObject m_NameKeyObjects invalid (%s) %x %x\r\n", pObj->GetObjectID(), pObj->wszName(), itername->second, pObj);
|
||||
}
|
||||
m_NameKeyObjects.erase(itername);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (itername = m_NameKeyObjects.begin(); itername != m_NameKeyObjects.end(); itername++)
|
||||
{
|
||||
if ((*itername).second == (pObj))
|
||||
{
|
||||
//이럴경우 파인드가 안된거다. 컨테이너 사이즈가 차이가 나는 경우가 생기는 걸로 봐서 지워질때 제대로 안지워지는 경우가 있는듯
|
||||
g_Log.Log(LogType::_DELOBJECT_NAMEKEYFINDERR, L"[ObjID:%u] CDNBaseObjectManager::DelObject m_NameKeyObjects FindErr (%s) %x %x\r\n", pObj->GetObjectID(), pObj->wszName(), itername->second, pObj);
|
||||
m_NameKeyObjects.erase(itername);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool boFlag = false;
|
||||
|
||||
m_KeyLock.Lock();
|
||||
TMapObjects::iterator iter = m_KeyObjects.find(pObj->GetObjectID());
|
||||
if (iter != m_KeyObjects.end()){
|
||||
if (iter->second == pObj){
|
||||
m_KeyObjects.erase(iter);
|
||||
boFlag = true;
|
||||
}
|
||||
}
|
||||
m_KeyLock.UnLock();
|
||||
|
||||
ScopeLock<CSyncLock> lock( m_VecLock );
|
||||
TVecObjects::iterator it = find(m_VecObjects.begin(), m_VecObjects.end(), pObj);
|
||||
if (it != m_VecObjects.end()){
|
||||
m_VecObjects.erase(it);
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
for (int i = 0; i < (int)m_VecObjects.size(); i++){
|
||||
if (m_VecObjects[i]->GetObjectID() == pObj->GetObjectID()){
|
||||
g_Log.Log(LogType::_ERROR, L"[ObjID:%u] CDNBaseObjectManager::DelObject m_VecObjects invalid %x %x\r\n", pObj->GetObjectID(), m_VecObjects[i], pObj);
|
||||
m_VecObjects.erase(m_VecObjects.begin() + i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_Log.Log(LogType::_ERROR, L"[%d] [ObjID:%u] [CDNBaseObjectManager::DelObject] Fail!! Name:%d, Key:%d, Vec:%d\r\n", g_Config.nManagedID, pObj->GetObjectID(), m_NameKeyObjects.size(), m_KeyObjects.size(), m_VecObjects.size());
|
||||
return false;
|
||||
}
|
||||
|
||||
CDNBaseObject* CDNBaseObjectManager::FindObject(UINT nUID)
|
||||
{
|
||||
if (m_KeyObjects.empty()) return NULL;
|
||||
if (nUID <= 0) return NULL;
|
||||
|
||||
CDNBaseObject *pObj = NULL;
|
||||
m_KeyLock.Lock();
|
||||
TMapObjects::iterator iter = m_KeyObjects.find(nUID);
|
||||
if (iter != m_KeyObjects.end()){
|
||||
pObj = iter->second;
|
||||
m_KeyLock.UnLock();
|
||||
return pObj;
|
||||
}
|
||||
|
||||
m_KeyLock.UnLock();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
CDNBaseObject* CDNBaseObjectManager::FindObjectByName(const WCHAR *pwszName)
|
||||
{
|
||||
if (m_NameKeyObjects.empty()) return NULL;
|
||||
|
||||
CDNBaseObject *pObj = NULL;
|
||||
m_NameKeyLock.Lock();
|
||||
TMapNameObjects::iterator iter = m_NameKeyObjects.find(pwszName);
|
||||
if (iter != m_NameKeyObjects.end()){
|
||||
pObj = iter->second;
|
||||
m_NameKeyLock.UnLock();
|
||||
return pObj;
|
||||
}
|
||||
m_NameKeyLock.UnLock();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int CDNBaseObjectManager::GetObjCount()
|
||||
{
|
||||
m_VecLock.Lock();
|
||||
int nCount = (int)m_VecObjects.size();
|
||||
m_VecLock.UnLock();
|
||||
|
||||
return nCount;
|
||||
}
|
||||
|
||||
bool CDNBaseObjectManager::IsEmptyObject()
|
||||
{
|
||||
if (m_KeyObjects.empty() && m_VecObjects.empty()) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue