123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- #include "stdafx.h"
- #include <algorithm>
- #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<UINT64, ClientSysIF*>::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<UINT64, ClientSysIF*>::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<UINT64, ClientSysIF*>::iterator iter = m_ClientMap.find(pClientSysIF);
- if (iter != m_ClientMap.end())
- {
- ret = iter->second->CmdToLogicDev(&Res);
- }
- Thread_UnLock();
- return (int)ret;
- }
|