Ignore:
Timestamp:
Jul 13, 2009, 9:42:32 AM (15 years ago)
Author:
Christoph Mayer
Message:

periodic bootstrap vervollständigt

Location:
source/ariba/utility/bootstrap/modules/periodicbroadcast
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • source/ariba/utility/bootstrap/modules/periodicbroadcast/PeriodicBroadcast.cpp

    r4853 r4866  
    5959use_logging_cpp(PeriodicBroadcast);
    6060const long PeriodicBroadcast::timerinterval = 1000;
     61const long PeriodicBroadcast::servicetimeout = 3000;
    6162const unsigned int PeriodicBroadcast::serverport_v4 = 5634;
    6263const unsigned int PeriodicBroadcast::serverport_v6 = 5636;
     
    130131void PeriodicBroadcast::updateRemoteServices(){
    131132
     133        // cleanup the services that timed out
     134        // so they are seen of as new after timeout
     135        {
     136                boost::mutex::scoped_lock lock( remoteServicesMutex );
     137                bool deleted;
     138
     139                do {
     140                        deleted = false;
     141
     142                        ServiceList::iterator i = remoteServices.begin();
     143                        ServiceList::iterator iend = remoteServices.end();
     144
     145                        for( ; i != iend; i++ ){
     146
     147                                if( time(NULL) > (i->second.lastseen + servicetimeout) ){
     148                                        remoteServices.erase( i );
     149                                        deleted = true;
     150                                        break;
     151                                }
     152                        }
     153
     154                }while(deleted);
     155        }
     156
     157        // check if we received new services:
     158        // check remoteServices against newRemoteServices
     159        {
     160                boost::mutex::scoped_lock lock( newRemoteServicesMutex );
     161                typedef std::pair<string,Service> mapitem;
     162
     163                BOOST_FOREACH( mapitem item, newRemoteServices ){
     164
     165                        string name = item.first;
     166                        Service service = item.second;
     167
     168                        ServiceList::iterator i = remoteServices.find( name );
     169                        if( i != remoteServices.end() ) {
     170                                // update the item lastseen time
     171                                i->second.lastseen = service.lastseen;
     172                                continue;
     173                        }
     174
     175                        {
     176                                // insert the new item as new, lastseen has been set in the
     177                                // receive function, as this timer only runs in intervals
     178                                boost::mutex::scoped_lock lock2( remoteServicesMutex );
     179                                remoteServices.insert( std::make_pair(name, service) );
     180                        }
     181
     182                        callback->onBootstrapServiceFound(name, service.info1, service.info2, service.info3);
     183                }
     184
     185                // we have checked and transfered all new items
     186                newRemoteServices.clear();
     187        }
    132188}
    133189
  • source/ariba/utility/bootstrap/modules/periodicbroadcast/PeriodicBroadcast.h

    r4853 r4866  
    4444#include <map>
    4545#include <string>
     46#include <ctime>
    4647#include <iostream>
    4748#include <boost/asio.hpp>
     
    5657using std::map;
    5758using std::string;
     59using std::cout;
    5860using boost::asio::ip::udp;
    5961
     
    8385        void updateRemoteServices();
    8486
    85         static const long timerinterval;
     87        static const long timerinterval; // used to send out updates on our services and check for new services
     88        static const long servicetimeout; // timeout after that a service is dead when we did not receive updates
    8689        static const unsigned int serverport_v4;
    8790        static const unsigned int serverport_v6;
     
    9295                string info2;
    9396                string info3;
     97                time_t lastseen;
     98
     99                _Service()
     100                        : name(""), info1(""), info2(""), info3(""), lastseen(0){
     101                }
    94102        } Service;
    95103
     
    133141                        Data data = data_serialize( msg, DEFAULT_V );
    134142                        uint8_t* pnt = data.getBuffer();
    135                         size_t len = data.getLength();
     143                        size_t len = data.getLength() / 8;
    136144                        boost::system::error_code ignored_error;
     145
     146                        cout << "-----------> sending out " << data << std::endl;
    137147
    138148                        {
     
    172182                                data_deserialize( msg, data );
    173183
     184                                cout << "-----------> received " << data << std::endl;
     185
    174186                                { // insert new found service
    175187                                        boost::mutex::scoped_lock( *servicesmutex );
     
    182194                                        s.info2 = msg.getInfo2();
    183195                                        s.info3 = msg.getInfo3();
     196                                        s.lastseen = time(NULL);
    184197                                        services->insert( std::make_pair(msg.getName(), s) );
    185198                                }
Note: See TracChangeset for help on using the changeset viewer.