void Node::_connectMulticast( NodePtr node ) { lunchbox::ScopedMutex<> mutex( _impl->outMulticast ); if( node->_impl->outMulticast.data.isValid( )) // multicast already connected by previous _cmdID return; // Search if the connected node is in the same multicast group as we are const ConnectionDescriptions& descriptions = getConnectionDescriptions(); for( ConnectionDescriptionsCIter i = descriptions.begin(); i != descriptions.end(); ++i ) { ConnectionDescriptionPtr description = *i; if( description->type < CONNECTIONTYPE_MULTICAST ) continue; const ConnectionDescriptions& fromDescs = node->getConnectionDescriptions(); for( ConnectionDescriptionsCIter j = fromDescs.begin(); j != fromDescs.end(); ++j ) { ConnectionDescriptionPtr fromDescription = *j; if( !description->isSameMulticastGroup( fromDescription )) continue; LBASSERT( !node->_impl->outMulticast.data ); LBASSERT( node->_impl->multicasts.empty( )); if( _impl->outMulticast->isValid() && _impl->outMulticast.data->getDescription() == description ) { node->_impl->outMulticast.data = _impl->outMulticast.data; LBINFO << "Using " << description << " as multicast group for " << node->getNodeID() << std::endl; } // find unused multicast connection to node else for( MCDatas::const_iterator k = _impl->multicasts.begin(); k != _impl->multicasts.end(); ++k ) { const MCData& data = *k; ConstConnectionDescriptionPtr dataDesc = data.connection->getDescription(); if( !description->isSameMulticastGroup( dataDesc )) continue; node->_impl->multicasts.push_back( data ); LBINFO << "Adding " << dataDesc << " as multicast group for " << node->getNodeID() << std::endl; } } } }