NetworkIDManager.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /*
  2. * Copyright (c) 2014, Oculus VR, Inc.
  3. * All rights reserved.
  4. *
  5. * This source code is licensed under the BSD-style license found in the
  6. * LICENSE file in the root directory of this source tree. An additional grant
  7. * of patent rights can be found in the PATENTS file in the same directory.
  8. *
  9. */
  10. /// \file
  11. ///
  12. #include "NetworkIDManager.h"
  13. #include "NetworkIDObject.h"
  14. #include "RakAssert.h"
  15. #include "GetTime.h"
  16. #include "RakSleep.h"
  17. #include "SuperFastHash.h"
  18. #include "RakPeerInterface.h"
  19. using namespace RakNet;
  20. STATIC_FACTORY_DEFINITIONS(NetworkIDManager,NetworkIDManager)
  21. NetworkIDManager::NetworkIDManager()
  22. {
  23. startingOffset = RakPeerInterface::Get64BitUniqueRandomNumber();
  24. Clear();
  25. }
  26. NetworkIDManager::~NetworkIDManager(void)
  27. {
  28. }
  29. void NetworkIDManager::Clear(void)
  30. {
  31. memset(networkIdHash,0,sizeof(networkIdHash));
  32. }
  33. NetworkIDObject *NetworkIDManager::GET_BASE_OBJECT_FROM_ID(NetworkID x)
  34. {
  35. unsigned int hashIndex=NetworkIDToHashIndex(x);
  36. NetworkIDObject *nio=networkIdHash[hashIndex];
  37. while (nio)
  38. {
  39. if (nio->GetNetworkID()==x)
  40. return nio;
  41. nio=nio->nextInstanceForNetworkIDManager;
  42. }
  43. return 0;
  44. }
  45. NetworkID NetworkIDManager::GetNewNetworkID(void)
  46. {
  47. while (GET_BASE_OBJECT_FROM_ID(++startingOffset))
  48. ;
  49. if (startingOffset==UNASSIGNED_NETWORK_ID)
  50. {
  51. while (GET_BASE_OBJECT_FROM_ID(++startingOffset))
  52. ;
  53. }
  54. return startingOffset;
  55. }
  56. unsigned int NetworkIDManager::NetworkIDToHashIndex(NetworkID networkId)
  57. {
  58. // return SuperFastHash((const char*) &networkId.guid.g,sizeof(networkId.guid.g)) % NETWORK_ID_MANAGER_HASH_LENGTH;
  59. return (unsigned int) (networkId % NETWORK_ID_MANAGER_HASH_LENGTH);
  60. }
  61. void NetworkIDManager::TrackNetworkIDObject(NetworkIDObject *networkIdObject)
  62. {
  63. RakAssert(networkIdObject->GetNetworkIDManager()==this);
  64. NetworkID rawId = networkIdObject->GetNetworkID();
  65. RakAssert(rawId!=UNASSIGNED_NETWORK_ID);
  66. networkIdObject->nextInstanceForNetworkIDManager=0;
  67. unsigned int hashIndex=NetworkIDToHashIndex(rawId);
  68. // printf("TrackNetworkIDObject hashIndex=%i guid=%s\n",hashIndex, networkIdObject->GetNetworkID().guid.ToString()); // removeme
  69. if (networkIdHash[hashIndex]==0)
  70. {
  71. networkIdHash[hashIndex]=networkIdObject;
  72. return;
  73. }
  74. NetworkIDObject *nio=networkIdHash[hashIndex];
  75. // Duplicate insertion?
  76. RakAssert(nio!=networkIdObject);
  77. // Random GUID conflict?
  78. RakAssert(nio->GetNetworkID()!=rawId);
  79. while (nio->nextInstanceForNetworkIDManager!=0)
  80. {
  81. nio=nio->nextInstanceForNetworkIDManager;
  82. // Duplicate insertion?
  83. RakAssert(nio!=networkIdObject);
  84. // Random GUID conflict?
  85. RakAssert(nio->GetNetworkID()!=rawId);
  86. }
  87. nio->nextInstanceForNetworkIDManager=networkIdObject;
  88. }
  89. void NetworkIDManager::StopTrackingNetworkIDObject(NetworkIDObject *networkIdObject)
  90. {
  91. RakAssert(networkIdObject->GetNetworkIDManager()==this);
  92. NetworkID rawId = networkIdObject->GetNetworkID();
  93. RakAssert(rawId!=UNASSIGNED_NETWORK_ID);
  94. // RakAssert(networkIdObject->GetNetworkID()!=UNASSIGNED_NETWORK_ID);
  95. unsigned int hashIndex=NetworkIDToHashIndex(rawId);
  96. // printf("hashIndex=%i\n",hashIndex); // removeme
  97. NetworkIDObject *nio=networkIdHash[hashIndex];
  98. if (nio==0)
  99. {
  100. RakAssert("NetworkIDManager::StopTrackingNetworkIDObject didn't find object" && 0);
  101. return;
  102. }
  103. if (nio==networkIdObject)
  104. {
  105. networkIdHash[hashIndex]=nio->nextInstanceForNetworkIDManager;
  106. return;
  107. }
  108. while (nio)
  109. {
  110. if (nio->nextInstanceForNetworkIDManager==networkIdObject)
  111. {
  112. nio->nextInstanceForNetworkIDManager=networkIdObject->nextInstanceForNetworkIDManager;
  113. return;
  114. }
  115. nio=nio->nextInstanceForNetworkIDManager;
  116. }
  117. RakAssert("NetworkIDManager::StopTrackingNetworkIDObject didn't find object" && 0);
  118. }
粤ICP备19079148号