#include "stdafx.h" #include #include "ClientManager.h" ClientManager g_ClientManager; ClientManager::ClientManager() { } ClientManager::~ClientManager() { } bool ClientManager::RegistClient(UINT64 Addr) { Thread_Lock(); m_ClientMap[Addr] = (ClientSysIF*)Addr; Thread_UnLock(); return true; } void ClientManager::UnRegistAll() { //框架需要做2件事情 //作为Client需要发送Close命令给设备 // 没必要,在CDI传递->Local失败的情况,有对应. //作为Device,需要发送Close通知给Client // 没必要,本地驱动卸载的时候,自动发送Close给Client. // 非本地本进程的Client,直接清除即可. //问题:Bus线程和DrvTree线程中监视ROOT驱动的Client端也会被干掉 //方案:需要清除的Client应该是非本地本进程的Client. // 而本地本进程的Client将会在驱动卸载的时候收到CloseNotify. //所以,简单方案是,本地驱动全部卸载后,进行UnRegistAll就可以了. Thread_Lock(); //NOT FINISHED YET //need to send close notify to current clients m_ClientMap.clear(); Thread_UnLock(); } bool ClientManager::UnRegistClient(UINT64 Addr) { bool ret = false; Thread_Lock(); map::iterator proc_iter = m_ClientMap.find(Addr); if (proc_iter != m_ClientMap.end()) { m_ClientMap.erase(proc_iter); Thread_UnLock(); ret = true; } else { Thread_UnLock(); printf("Driver Thread:%d,UnRegistClient Empty\n", GetCurrentThreadId()); } return ret; } bool ClientManager::FindClient(UINT64 Addr) { bool ret = false; Thread_Lock(); map::iterator proc_iter = m_ClientMap.find(Addr); if (proc_iter != m_ClientMap.end()) { ret = true; } Thread_UnLock(); return ret; } int ClientManager::ResToClient(ResDataObject &Res, UINT64 pClientSysIF) { RET_STATUS ret = RET_INVALID; Thread_Lock(); map::iterator iter = m_ClientMap.find(pClientSysIF); if (iter != m_ClientMap.end()) { ret = iter->second->CmdToLogicDev(&Res); } Thread_UnLock(); return (int)ret; }