diff --git a/pvAccessApp/utils/transportRegistry.cpp b/pvAccessApp/utils/transportRegistry.cpp index 11194d0..c319387 100644 --- a/pvAccessApp/utils/transportRegistry.cpp +++ b/pvAccessApp/utils/transportRegistry.cpp @@ -28,15 +28,13 @@ void TransportRegistry::put(Transport* transport) //const string type = transport.getType(); const int16 priority = transport->getPriority(); const osiSockAddr* address = transport->getRemoteAddress(); - const int32 intAddress = ipv4AddressToInt(*address); - - _transportsIter = _transports.find(intAddress); + _transportsIter = _transports.find(address); prioritiesMap_t* priorities; if(_transportsIter == _transports.end()) { priorities = new prioritiesMap_t(); - _transports[intAddress] = priorities; + _transports[address] = priorities; } else { @@ -55,8 +53,7 @@ Transport* TransportRegistry::get(const string type, const osiSockAddr* address, } Lock guard(&_mutex); - const int32 intAddress = ipv4AddressToInt(*address); - _transportsIter = _transports.find(intAddress); + _transportsIter = _transports.find(address); if(_transportsIter != _transports.end()) { prioritiesMap_t* priorities = _transportsIter->second; @@ -78,8 +75,7 @@ Transport** TransportRegistry::get(const string type, const osiSockAddr* address } Lock guard(&_mutex); - const int32 intAddress = ipv4AddressToInt(*address); - _transportsIter = _transports.find(intAddress); + _transportsIter = _transports.find(address); if(_transportsIter != _transports.end()) { prioritiesMap_t* priorities = _transportsIter->second; @@ -106,9 +102,8 @@ Transport* TransportRegistry::remove(Transport* transport) Lock guard(&_mutex); const int16 priority = transport->getPriority(); const osiSockAddr* address = transport->getRemoteAddress(); - const int32 intAddress = ipv4AddressToInt(*address); Transport* retTransport = NULL; - _transportsIter = _transports.find(intAddress); + _transportsIter = _transports.find(address); if(_transportsIter != _transports.end()) { prioritiesMap_t* priorities = _transportsIter->second; diff --git a/pvAccessApp/utils/transportRegistry.h b/pvAccessApp/utils/transportRegistry.h index f4ed110..c051903 100644 --- a/pvAccessApp/utils/transportRegistry.h +++ b/pvAccessApp/utils/transportRegistry.h @@ -5,7 +5,6 @@ #ifndef TRANSPORTREGISTRY_H #define TRANSPORTREGISTRY_H - #include #include #include @@ -24,9 +23,20 @@ using namespace std; namespace epics { namespace pvAccess { +//TODO if unordered map is used instead of map we can use sockAddrAreIdentical routine from osiSock.h +struct comp_osiSockAddr +{ + bool operator()(osiSockAddr const *a, osiSockAddr const *b) + { + if (a->sa.sa_family < b->sa.sa_family) return true; + if ((a->sa.sa_family == b->sa.sa_family) && (a->ia.sin_addr.s_addr < b->ia.sin_addr.s_addr )) return true; + if ((a->sa.sa_family == b->sa.sa_family) && (a->ia.sin_addr.s_addr == b->ia.sin_addr.s_addr ) && ( a->ia.sin_port < b->ia.sin_port )) return true; + return false; + } +}; typedef std::map prioritiesMap_t; -typedef std::map transportsMap_t; +typedef std::map transportsMap_t; typedef std::vector allTransports_t; class TransportRegistry { diff --git a/testApp/utils/transportRegistryTest.cpp b/testApp/utils/transportRegistryTest.cpp index 872c42f..4a15cb6 100644 --- a/testApp/utils/transportRegistryTest.cpp +++ b/testApp/utils/transportRegistryTest.cpp @@ -68,6 +68,8 @@ int main(int argc, char *argv[]) osiSockAddr* addr = new osiSockAddr; addrArray[i] = addr; addr->ia.sin_addr.s_addr = i; + addr->ia.sin_port = i; + addr->ia.sin_family = AF_INET; //priority for(int16 j = 0; j < priority_max; j++)