ClientManager.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include "stdafx.h"
  2. #include <algorithm>
  3. #include "ClientManager.h"
  4. ClientManager g_ClientManager;
  5. ClientManager::ClientManager()
  6. {
  7. }
  8. ClientManager::~ClientManager()
  9. {
  10. }
  11. bool ClientManager::RegistClient(UINT64 Addr)
  12. {
  13. Thread_Lock();
  14. m_ClientMap[Addr] = (ClientSysIF*)Addr;
  15. Thread_UnLock();
  16. return true;
  17. }
  18. void ClientManager::UnRegistAll()
  19. {
  20. //框架需要做2件事情
  21. //作为Client需要发送Close命令给设备
  22. // 没必要,在CDI传递->Local失败的情况,有对应.
  23. //作为Device,需要发送Close通知给Client
  24. // 没必要,本地驱动卸载的时候,自动发送Close给Client.
  25. // 非本地本进程的Client,直接清除即可.
  26. //问题:Bus线程和DrvTree线程中监视ROOT驱动的Client端也会被干掉
  27. //方案:需要清除的Client应该是非本地本进程的Client.
  28. // 而本地本进程的Client将会在驱动卸载的时候收到CloseNotify.
  29. //所以,简单方案是,本地驱动全部卸载后,进行UnRegistAll就可以了.
  30. Thread_Lock();
  31. //NOT FINISHED YET
  32. //need to send close notify to current clients
  33. m_ClientMap.clear();
  34. Thread_UnLock();
  35. }
  36. bool ClientManager::UnRegistClient(UINT64 Addr)
  37. {
  38. bool ret = false;
  39. Thread_Lock();
  40. map<UINT64, ClientSysIF*>::iterator proc_iter = m_ClientMap.find(Addr);
  41. if (proc_iter != m_ClientMap.end())
  42. {
  43. m_ClientMap.erase(proc_iter);
  44. Thread_UnLock();
  45. ret = true;
  46. }
  47. else
  48. {
  49. Thread_UnLock();
  50. printf("Driver Thread:%d,UnRegistClient Empty\n", GetCurrentThreadId());
  51. }
  52. return ret;
  53. }
  54. bool ClientManager::FindClient(UINT64 Addr)
  55. {
  56. bool ret = false;
  57. Thread_Lock();
  58. map<UINT64, ClientSysIF*>::iterator proc_iter = m_ClientMap.find(Addr);
  59. if (proc_iter != m_ClientMap.end())
  60. {
  61. ret = true;
  62. }
  63. Thread_UnLock();
  64. return ret;
  65. }
  66. int ClientManager::ResToClient(ResDataObject &Res, UINT64 pClientSysIF)
  67. {
  68. RET_STATUS ret = RET_INVALID;
  69. Thread_Lock();
  70. map<UINT64, ClientSysIF*>::iterator iter = m_ClientMap.find(pClientSysIF);
  71. if (iter != m_ClientMap.end())
  72. {
  73. ret = iter->second->CmdToLogicDev(&Res);
  74. }
  75. Thread_UnLock();
  76. return (int)ret;
  77. }