source: source/ariba/utility/bootstrap/modules/periodicbroadcast/PeriodicBroadcast.cpp@ 9990

Last change on this file since 9990 was 7532, checked in by Christoph Mayer, 15 years ago

-von außen konfigurierbare bootstrap module, -periodicbroadcast crash fix

File size: 5.8 KB
RevLine 
[4850]1// [License]
2// The Ariba-Underlay Copyright
3//
4// Copyright (c) 2008-2009, Institute of Telematics, UniversitÀt Karlsruhe (TH)
5//
6// Institute of Telematics
7// UniversitÀt Karlsruhe (TH)
8// Zirkel 2, 76128 Karlsruhe
9// Germany
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of co// [License]
17// The Ariba-Underlay Copyright
18//
19// Copyright (c) 2008-2009, Institute of Telematics, UniversitÀt Karlsruhe (TH)
20//
21// Institute of Telematics
22// UniversitÀt Karlsruhe (TH)
23// Zirkel 2, 76128 Karlsruhe
24// Germany
25//
26// Redistribution and use in source and binary forms, with or without
27// modification, are permitted provided that the following conditions are
28// met:
29//
30// 1. Redistributions of source code must retain the above copyright
31// notice, this list of conditions and the following disclaimer.
32// 2. Redistributions in binary form must reproduce the above copyright
33// notice, this list of conditions and the following disclaimer in the
34// documentation and/or other materials provided with the distribution.
35//
36// THIS SOFTWARE IS PROVIDED BY THE INSTITUTE OF TELEMATICS ``AS IS'' AND
37// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARIBA PROJECT OR
40// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
41// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
42// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
43// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
44// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
45// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
46// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47//
48// The views and conclusions contained in the software and documentation
49// are those of the authors and should not be interpreted as representing
50// official policies, either expressed or implied, of the Institute of
51// Telematics.
52// [License]
53
54#include "PeriodicBroadcast.h"
55
56namespace ariba {
57namespace utility {
58
59use_logging_cpp(PeriodicBroadcast);
[5838]60const long PeriodicBroadcast::timerinterval = 1;
61const long PeriodicBroadcast::servicetimeout = 3;
[4853]62const unsigned int PeriodicBroadcast::serverport_v4 = 5634;
63const unsigned int PeriodicBroadcast::serverport_v6 = 5636;
[4850]64
[7532]65PeriodicBroadcast::PeriodicBroadcast(BootstrapInformationCallback* _callback, string info)
[4853]66 : BootstrapModule(_callback),
67 server(io_service, &newRemoteServices, &newRemoteServicesMutex) {
[4850]68}
69
70PeriodicBroadcast::~PeriodicBroadcast(){
71}
72
[4924]73void PeriodicBroadcast::threadFunc(PeriodicBroadcast* obj){
74 obj->io_service.run();
75}
76
[4850]77string PeriodicBroadcast::getName(){
78 return "PeriodicBroadcast";
79}
80
81string PeriodicBroadcast::getInformation(){
82 return "periodic broadcasting of service information";
83}
84
85bool PeriodicBroadcast::isFunctional(){
86 return true;
87}
88
89void PeriodicBroadcast::start(){
[4934]90 io_service_thread = new boost::thread(
91 boost::bind(&PeriodicBroadcast::threadFunc, this) );
92
[5531]93 Timer::setInterval( timerinterval*1000 );
[4850]94 Timer::start();
95}
96
97void PeriodicBroadcast::stop(){
[4934]98 io_service.stop();
99 io_service_thread->join();
100 delete io_service_thread;
101 io_service_thread = NULL;
102
[4850]103 Timer::stop();
104}
105
106void PeriodicBroadcast::publishService(string name, string info1, string info2, string info3){
[5420]107 Service service(name, info1, info2, info3) ;
[4850]108
109 boost::mutex::scoped_lock lock( localServicesMutex );
[7532]110 if(name.empty()) return;
111
[4850]112 localServices.insert( std::make_pair(name, service) );
113}
114
115void PeriodicBroadcast::revokeService(string name){
116 boost::mutex::scoped_lock lock( localServicesMutex );
[7532]117 if(name.empty()) return;
[4850]118
119 ServiceList::iterator i = localServices.find( name );
120 if( i != localServices.end() ) localServices.erase( name );
121}
122
123void PeriodicBroadcast::eventFunction(){
124 sendLocalServices();
125 updateRemoteServices();
126}
127
128void PeriodicBroadcast::sendLocalServices(){
[4851]129 boost::mutex::scoped_lock lock( localServicesMutex );
[4850]130
[4851]131 ServiceList::iterator i = localServices.begin();
132 ServiceList::iterator iend = localServices.end();
133
[4853]134 for( ; i != iend; i++)
135 server.sendservice( i->second );
[4850]136}
137
138void PeriodicBroadcast::updateRemoteServices(){
139
[4866]140 // cleanup the services that timed out
141 // so they are seen of as new after timeout
142 {
143 boost::mutex::scoped_lock lock( remoteServicesMutex );
144 bool deleted;
145
146 do {
147 deleted = false;
148
149 ServiceList::iterator i = remoteServices.begin();
150 ServiceList::iterator iend = remoteServices.end();
151
152 for( ; i != iend; i++ ){
153
[5532]154 if( time(NULL) > (i->second.getLastseen() + servicetimeout) ){
[5516]155 remoteServices.erase( i );
[4866]156 deleted = true;
157 break;
158 }
159 }
160
[5516]161 } while(deleted);
[4866]162 }
163
164 // check if we received new services:
165 // check remoteServices against newRemoteServices
166 {
167 boost::mutex::scoped_lock lock( newRemoteServicesMutex );
168 typedef std::pair<string,Service> mapitem;
169
170 BOOST_FOREACH( mapitem item, newRemoteServices ){
171
172 string name = item.first;
173 Service service = item.second;
174
175 ServiceList::iterator i = remoteServices.find( name );
176 if( i != remoteServices.end() ) {
177 // update the item lastseen time
[5531]178 i->second.setLastseen( service.getLastseen() );
[4866]179 continue;
180 }
181
182 {
183 // insert the new item as new, lastseen has been set in the
184 // receive function, as this timer only runs in intervals
185 boost::mutex::scoped_lock lock2( remoteServicesMutex );
186 remoteServices.insert( std::make_pair(name, service) );
187 }
188
[5531]189 callback->onBootstrapServiceFound(name,
190 service.getInfo1(), service.getInfo2(), service.getInfo3());
[4866]191 }
192
193 // we have checked and transfered all new items
194 newRemoteServices.clear();
195 }
[4850]196}
197
198}} //namespace ariba, utility
Note: See TracBrowser for help on using the repository browser.