#include "StdAfx.h" #include "DistributeManager.h" ////////////////////////////////////////////////////////////////////////////////// //静态成员 tagDistributeNode * CDistributeNodePool::m_pHeadOfFreeList = NULL; ////////////////////////////////////////////////////////////////////////////////// //常量定义 const int CDistributeNodePool::BLOCK_SIZE = 40; ////////////////////////////////////////////////////////////////////////////////// //构造函数 CDistributeNodePool::CDistributeNodePool() { } //析构函数 CDistributeNodePool::~CDistributeNodePool() { //释放列表 if (m_pHeadOfFreeList != NULL) { tagDistributeNode * pDistributeNode = m_pHeadOfFreeList; while (pDistributeNode != NULL) { //安全释放 m_pHeadOfFreeList = pDistributeNode->pNextDistributeNode; SafeDelete(pDistributeNode); pDistributeNode = m_pHeadOfFreeList; } } } //分配结点 tagDistributeNode * CDistributeNodePool::AllocNode() { //获取头结点 tagDistributeNode *pDistributeNode = m_pHeadOfFreeList; if (pDistributeNode != NULL) { m_pHeadOfFreeList = pDistributeNode->pNextDistributeNode; } else { //分配内存 for (int nIndex = 0; nIndex < BLOCK_SIZE; nIndex++) { tagDistributeNode * pNewBlock = new tagDistributeNode; pNewBlock->pNextDistributeNode = m_pHeadOfFreeList; m_pHeadOfFreeList = pNewBlock; } //设置结点 pDistributeNode = m_pHeadOfFreeList; m_pHeadOfFreeList = pDistributeNode->pNextDistributeNode; } //初始节点 ZeroMemory(pDistributeNode, sizeof(tagDistributeNode)); return pDistributeNode; } //释放结点 VOID CDistributeNodePool::FreeNode(void * pNode) { //归还结点 tagDistributeNode * pDeadNode = static_cast(pNode); pDeadNode->pNextDistributeNode = m_pHeadOfFreeList; m_pHeadOfFreeList = pDeadNode; return; } ////////////////////////////////////////////////////////////////////////////////// //构造函数 CDistributeManager::CDistributeManager() { //设置变量 m_pHeadNode = NULL; m_wNodeCount = 0; m_wRealCount = 0; m_wAndroidCount = 0; m_cbDistributeRule = 0; } //析构函数 CDistributeManager::~CDistributeManager() { //移除节点 RemoveAll(); } //插入结点 BOOL CDistributeManager::InsertDistributeNode(const tagDistributeInfo & DistributeInfo) { //查找用户 if (SearchNode(DistributeInfo.pIServerUserItem) != NULL) return false; //头部判断 if (m_pHeadNode == NULL) { //分配结点 m_pHeadNode = m_DistributeNodePool.AllocNode(); if (m_pHeadNode == NULL) return false; //设置变量 CopyMemory(&m_pHeadNode->DistributeInfo, &DistributeInfo, sizeof(DistributeInfo)); m_pHeadNode->DistributeInfo.pPertainNode = m_pHeadNode; } else { //分配结点 tagDistributeNode * pDistributeNode = m_DistributeNodePool.AllocNode(); if (pDistributeNode == NULL) return false; //设置结点 CopyMemory(&pDistributeNode->DistributeInfo, &DistributeInfo, sizeof(DistributeInfo)); pDistributeNode->DistributeInfo.pPertainNode = pDistributeNode; //插入结点 if (m_pHeadNode->pNextDistributeNode != NULL) { m_pHeadNode->pNextDistributeNode->pPrepDistributeNode = pDistributeNode; pDistributeNode->pNextDistributeNode = m_pHeadNode->pNextDistributeNode; } //链接结点 pDistributeNode->pPrepDistributeNode = m_pHeadNode; m_pHeadNode->pNextDistributeNode = pDistributeNode; } //更新数目 if (DistributeInfo.pIServerUserItem->IsAndroidUser()) ++m_wAndroidCount; else ++m_wRealCount; ++m_wNodeCount; return true; } //移除结点 VOID CDistributeManager::RemoveDistributeNode(const IServerUserItem * pIServerUserItem) { //查找结点 tagDistributeNode *pDistributeNode = SearchNode(pIServerUserItem); if (pDistributeNode != NULL) RemoveDistributeNode(pDistributeNode); return; } //移除结点 VOID CDistributeManager::RemoveDistributeNode(tagDistributeNode * pDistributeNode) { //参数校验 if (pDistributeNode == NULL) return; //变量定义 tagDistributeNode *pPrepNode = pDistributeNode->pPrepDistributeNode; tagDistributeNode *pNextNode = pDistributeNode->pNextDistributeNode; //删除结点 if (pPrepNode != NULL) { if (pNextNode != NULL) { pPrepNode->pNextDistributeNode = pNextNode; pNextNode->pPrepDistributeNode = pPrepNode; } else { //尾部结点 if (pPrepNode->pNextDistributeNode == pDistributeNode) { pPrepNode->pNextDistributeNode = NULL; } } } else { if (pNextNode != NULL) { pNextNode->pPrepDistributeNode = NULL; //重置表头 m_pHeadNode = pNextNode; } else { m_pHeadNode = NULL; } } //更新数目 if (pDistributeNode->DistributeInfo.pIServerUserItem->IsAndroidUser()) --m_wAndroidCount; else --m_wRealCount; --m_wNodeCount; //安全释放 m_DistributeNodePool.FreeNode(pDistributeNode); } //移除结点 VOID CDistributeManager::RemoveAll() { //释放内存 while (m_pHeadNode != NULL) { RemoveDistributeNode(m_pHeadNode); } //重置变量 m_pHeadNode = NULL; m_wNodeCount = 0; m_wAndroidCount = 0; m_wRealCount = 0; return; } //执行分组 WORD CDistributeManager::PerformDistribute(CDistributeInfoArray & DistributeInfoArray, WORD wNeedCount) { //定义变量 tagDistributeNode * pMoveNode = m_pHeadNode; if (pMoveNode != NULL) { DistributeInfoArray.Add(pMoveNode->DistributeInfo); pMoveNode = pMoveNode->pNextDistributeNode; } //获取用户 while (pMoveNode != NULL) { //定义变量 BOOL bFirstSuccess = TRUE; //等级过滤 if (DistributeInfoArray.GetCount() > 0 && DistributeInfoArray[0].wDistribute != pMoveNode->DistributeInfo.wDistribute) bFirstSuccess = FALSE; //机器过滤 if (bFirstSuccess == TRUE && DistributeInfoArray.GetCount() == wNeedCount - 1 && FilterRuleIsAllAndroid(DistributeInfoArray, pMoveNode->DistributeInfo.pIServerUserItem)) bFirstSuccess = FALSE; //同桌过滤 if (bFirstSuccess == TRUE && (m_cbDistributeRule&DISTRIBUTE_LAST_TABLE) == 0 && FilterRuleExitsSameTable(DistributeInfoArray, pMoveNode->DistributeInfo.wLastTableID) == TRUE) bFirstSuccess = FALSE; //同IP过滤 if (bFirstSuccess == TRUE && (m_cbDistributeRule&DISTRIBUTE_SAME_ADDRESS) == 0 && FilterRuleExitsIPAddr(DistributeInfoArray, pMoveNode->DistributeInfo.pIServerUserItem->GetClientAddr()) == TRUE) bFirstSuccess = FALSE; //获取成功 if (bFirstSuccess == TRUE) DistributeInfoArray.Add(pMoveNode->DistributeInfo); //向前推进 pMoveNode = pMoveNode->pNextDistributeNode; //成功判断 if (DistributeInfoArray.GetCount() == wNeedCount) break; } return (WORD)DistributeInfoArray.GetCount(); } //查找结点 tagDistributeNode * CDistributeManager::SearchNode(const IServerUserItem * const pIServerUserItem) { if (m_pHeadNode == NULL) return NULL; //设置变量 tagDistributeNode * pMoveNode = m_pHeadNode; //查找结点 while (pMoveNode != NULL) { //接口判断 if (pMoveNode->DistributeInfo.pIServerUserItem == pIServerUserItem) return pMoveNode; //向前推进 pMoveNode = pMoveNode->pNextDistributeNode; } return NULL; } //IP同址 BOOL CDistributeManager::FilterRuleExitsIPAddr(const CDistributeInfoArray & DistributeInfoArray, DWORD dwClientAddr) { //查找同IP for (INT_PTR nIndex = 0; nIndex < DistributeInfoArray.GetCount(); nIndex++) { if (DistributeInfoArray[nIndex].pIServerUserItem->GetClientAddr() == dwClientAddr) return TRUE; } return FALSE; } //上局同桌 BOOL CDistributeManager::FilterRuleExitsSameTable(const CDistributeInfoArray & DistributeInfoArray, WORD wLastTableID) { //查找同IP for (INT_PTR nIndex = 0; nIndex < DistributeInfoArray.GetCount(); nIndex++) { if (DistributeInfoArray[nIndex].wLastTableID == wLastTableID && wLastTableID != INVALID_TABLE) return TRUE; } return FALSE; } //机器过滤 BOOL CDistributeManager::FilterRuleIsAllAndroid(const CDistributeInfoArray & DistributeInfoArray, IServerUserItem * const pIServerUserItem) { //参数校验 if (pIServerUserItem == NULL || DistributeInfoArray.GetCount() == 0) return FALSE; //变量定义 WORD wAndroidCount = 0; //统计机器 for (INT_PTR nIndex = 0; nIndex < DistributeInfoArray.GetCount(); nIndex++) { if (DistributeInfoArray[nIndex].pIServerUserItem->IsAndroidUser() == true) ++wAndroidCount; } return (wAndroidCount == DistributeInfoArray.GetCount()) && pIServerUserItem->IsAndroidUser(); } //////////////////////////////////////////////////////////////////////////////////