#include #include "ClientManager.h" ClientManager g_ClientManager; ClientManager::ClientManager() { } ClientManager::~ClientManager() { } bool ClientManager::RegistClient(UINT64 Addr) { std::cout << "ClientManager::RegistClient addr: " << Addr << endl; Thread_Lock(); m_ClientMap[Addr] = (LogicClient*)Addr; Thread_UnLock(); return true; } bool ClientManager::RegistClient(unsigned int proc, unsigned int addr, const char* pszKey, LogicClient* client) { //std::cout << "ClientManager::RegistClient proc" << proc << " org addr " << addr << " key " << pszKey << " LogicClient addr: " << (UINT64)client << endl; Thread_Lock(); /* char szKeys[256]; strcpy(szKeys, pszKey); char* pt = szKeys; while (*pt != 0) { if (*pt == '/' || *pt == '{' || *pt == '}') *pt = '_'; pt++; } ccos_bus_client clt(proc, addr, szKeys);*/ ccos_bus_client clt(proc, addr, pszKey); m_ClientOpenMap[clt] = client; //m_ClientMap[proc<<32 | addr] = client; 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::UnRegistClient(unsigned int proc, unsigned int addr) { bool ret = false; Thread_Lock(); map::iterator proc_iter = m_ClientMap.find(proc<<32|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; std::cout << "try find client use addr " << Addr << endl; Thread_Lock(); map::iterator proc_iter = m_ClientMap.find(Addr); if (proc_iter != m_ClientMap.end()) { ret = true; } Thread_UnLock(); std::cout << "Find result : " << ret <second; } Thread_UnLock(); std::cout << " Find Result LogicClient " << (UINT64)ret << endl; return ret; }