//------------------------------------------------------------------------------ // Get the next socket/port connection belonging to the same UM as ios. // The selected socket/port connection will be returned in outIos. It can // then be used for sending the next response message back to the applicable // UM module. // ios (in) - socket/port connection where a UM request originated from // outIos (out) - socket/port connection to use in sending the // corresponding response // writelock (out) - mutex lock to be used when writing to outIos // return - bool indicating if socket/port connection was assigned to // outIos //------------------------------------------------------------------------------ bool UmSocketSelector::nextIOSocket( const IOSocket& ios, SP_UM_IOSOCK& outIos, SP_UM_MUTEX& writeLock ) { sockaddr sa = ios.sa(); const sockaddr_in* sinp = reinterpret_cast<const sockaddr_in*>(&sa); IpAddressUmMap_t::iterator mapIter = fIpAddressUmMap.find ( sinp->sin_addr.s_addr ); if ( mapIter != fIpAddressUmMap.end() ) { unsigned int umIdx = mapIter->second; if (fUmModuleIPs[umIdx]->nextIOSocket( outIos, writeLock )) { #ifdef SEL_CONN_DEBUG std::ostringstream oss; oss << "UM " << fUmModuleIPs[umIdx]->moduleName() << "; in: " << ios.toString() << "; selected out: " << outIos->toString() << std::endl; std::cout << oss.str(); #endif return true; } } //..This should not happen. Application is asking for next socket/port for // a connection not in our UM module list. return false; }
//------------------------------------------------------------------------------ // Add a new socket/port connection to this UM. It will be grouped with other // socket/port connections having the same IP address for this UM. // ioSock (in) - socket/port connection to be added // writeLock (in) - mutex to use when writing to ioSock. // return - boolean indicating whether socket/port connection was added. //------------------------------------------------------------------------------ bool UmModuleIPs::addSocketConn( const SP_UM_IOSOCK& ioSock, const SP_UM_MUTEX& writeLock ) { bool bConnAdded = false; boost::mutex::scoped_lock lock( fUmModuleMutex ); for (unsigned int i=0; i<fUmIPSocketConns.size(); ++i) { sockaddr sa = ioSock->sa(); const sockaddr_in* sinp = reinterpret_cast<const sockaddr_in*>(&sa); if (fUmIPSocketConns[i]->ipAddress() == sinp->sin_addr.s_addr) { #ifdef MOD_CONN_DEBUG std::ostringstream oss; oss << "UM " << fUmModuleName << "; adding connection " << ioSock->toString() << std::endl; std::cout << oss.str(); #endif fUmIPSocketConns[i]->addSocketConn ( ioSock, writeLock ); bConnAdded = true; //..Initialize fNextUmIPSocketIdx if this is the first socket/port // connection for this UM. if ( fNextUmIPSocketIdx == NEXT_IP_SOCKET_UNASSIGNED) fNextUmIPSocketIdx = i; break; } } return bConnAdded; }
//------------------------------------------------------------------------------ // Add a new socket/port connection. It will be grouped with other // socket/port connections belonging to the same UM. // ios (in) - socket/port connection to be added // writeLock (in) - mutex to use when writing to ios. // return - boolean indicating whether socket/port connection was added. //------------------------------------------------------------------------------ bool UmSocketSelector::addConnection( const SP_UM_IOSOCK& ios, const SP_UM_MUTEX& writeLock ) { bool bConnAdded = false; sockaddr sa = ios->sa(); const sockaddr_in* sinp = reinterpret_cast<const sockaddr_in*>(&sa); IpAddressUmMap_t::iterator mapIter = fIpAddressUmMap.find ( sinp->sin_addr.s_addr ); // Add this socket/port connection to the UM connection list it belongs to. if ( mapIter != fIpAddressUmMap.end() ) { unsigned int umIdx = mapIter->second; bConnAdded = fUmModuleIPs[umIdx]->addSocketConn( ios, writeLock ); } if (!bConnAdded) { #ifdef SEL_CONN_DEBUG std::ostringstream oss; oss << "No UM/IP match found to add connection " << ios->toString() << std::endl; std::cout << oss.str(); #endif } return bConnAdded; }