コード例 #1
0
ファイル: node.cpp プロジェクト: iCollage/Collage
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;
            }
        }
    }
}