00001 /* 00002 * This file is part of openMask © INRIA, CNRS, Universite de Rennes 1 1993-2002, thereinafter the Software 00003 * 00004 * The Software has been developped within the Siames Project. 00005 * INRIA, the University of Rennes 1 and CNRS jointly hold intellectual property rights 00006 * 00007 * The Software has been registered with the Agence pour la Protection des 00008 * Programmes (APP) under registration number IDDN.FR.001.510008.00.S.P.2001.000.41200 00009 * 00010 * This file may be distributed under the terms of the Q Public License 00011 * version 1.0 as defined by Trolltech AS of Norway and appearing in the file 00012 * LICENSE.QPL included in the packaging of this file. 00013 * 00014 * Licensees holding valid specific licenses issued by INRIA, CNRS or Université de Rennes 1 00015 * for the software may use this file in accordance with that specific license 00016 * 00017 */ 00018 #ifdef _PVM 00019 #include "PsPvmNameServer.h" 00020 00021 #include <stdio.h> 00022 #include "pvm3.h" 00023 #include "PsnSvmLink.h" 00024 #include "PsController.h" 00025 #include "PsnPvmSvm.h" 00026 00027 PsPvmNameServer::PsPvmNameServer ( int mainNameServerSiteId, PsNameServer & nameServer ) : 00028 PsClassicalNameServer ( nameServer.getCanonicalRepresentation() ), 00029 _mainNameServerSiteId ( mainNameServerSiteId ) 00030 { 00031 #ifdef _DEBUGDISTRIBUTEDNAMESERVER 00032 cerr<<"PsPvmNameServer::PsPvmNameServer"<<endl; 00033 #endif 00034 00035 correspondenceContainerType::const_iterator i ; 00036 for ( i = _stringToIdCorrespondenceContainer.begin() ; 00037 i != _stringToIdCorrespondenceContainer.end(); 00038 ++i ) 00039 { 00040 _idToNamesUsingIdContainer.insert(placeOfNamesContainerType::value_type((*i).second, 00041 new list<PsName *>(nameServer.getNamesOfId ((*i).second) ) ) ) ; 00042 00043 assert ( (*_idToNamesUsingIdContainer.find((*i).second)).second->size() == _tableNbInstances[(*i).second] ) ; 00044 } 00045 00046 //make sure the constructed PvmName server is compatible with the central name server 00047 int oldbufid = pvm_setsbuf ( 0 ) ; //save the current send buffer 00048 00049 if ( oldbufid < 0 ) 00050 { 00051 cerr<<"PsPvmNameServer::PsPvmNameServer: pvm_setsbuf error "<<oldbufid<<endl; 00052 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00053 } 00054 00055 int bufid = pvm_initsend( PsnPvmSvm::pvmDataEncoding ) ; 00056 00057 if ( bufid < 0 ) 00058 { 00059 cerr<<"PsPvmNameServer::PsPvmNameServer: pvm_initsend error "<<bufid<<endl; 00060 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00061 } 00062 00063 //pack a timeStamp 00064 long toto = 0 ; 00065 int infot = pvm_pklong ( &toto, 1, 1 ) ; 00066 00067 //pack the current name server 00068 00069 long numberOfPairs = _stringToIdCorrespondenceContainer.size() ; 00070 int info = pvm_pklong ( &numberOfPairs, 1, 1 ) ; 00071 00072 long verifySize = 0 ; 00073 int stringLength ; 00074 for ( correspondenceContainerType::const_iterator i = _stringToIdCorrespondenceContainer.begin() ; 00075 i != _stringToIdCorrespondenceContainer.end() ; 00076 ++i ) 00077 { 00078 ++verifySize ; 00079 stringLength = (*i).first.getStringLength() + 1 ; 00080 pvm_pkint ( const_cast<int *> ( &stringLength), 1, 1 ) ; 00081 pvm_pkstr ( const_cast<char *>((*i).first.getCString()) ) ; 00082 pvm_pklong ( const_cast<long *> (&((*i).second)) , 1, 1 ) ; 00083 } 00084 00085 assert (verifySize == numberOfPairs ) ; 00086 00087 if (info < 0 ) 00088 { 00089 cerr<<"PsPvmNameServer::PsPvmNameServer: pvm_pkstr error "<<info<<endl; 00090 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00091 } 00092 00093 info = pvm_send (_mainNameServerSiteId, PsnPvmMessage::NameServiceVerifyLocalNameServer ) ; 00094 00095 if (info < 0 ) 00096 { 00097 cerr<<"PsPvmNameServer::PsPvmNameServer: pvm_send error "<<info<<endl; 00098 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00099 } 00100 00101 info = pvm_setsbuf ( oldbufid ) ; //replace the current send buffer 00102 00103 if (info < 0 ) 00104 { 00105 cerr<<"PsPvmNameServer::PsPvmNameServer: pvm_setsbuf error "<<info<<endl; 00106 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00107 } 00108 00109 //save the current receive buffer 00110 oldbufid = pvm_setrbuf ( 0 ) ; 00111 00112 //wait for the answer 00113 bufid = pvm_recv (_mainNameServerSiteId, PsnPvmMessage::NameServiceVerifyResult ) ; 00114 00115 if ( bufid < 0 ) 00116 { 00117 cerr<<"PsPvmNameServer::PsPvmNameServer: pvm_recv error "<<bufid<<endl; 00118 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00119 } 00120 00121 int numberOfIncompatibilities ; 00122 info = pvm_upkint ( & numberOfIncompatibilities, 1, 1 ) ; 00123 00124 00125 if (info < 0 ) 00126 { 00127 cerr<<"PsPvmNameServer::PsPvmNameServer: pvm_upkint error "<<info<<endl; 00128 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00129 } 00130 00131 PsName::idType oldId ; 00132 PsName::idType newId ; 00133 map<PsName::idType, PsName::idType> listOfNeededConversions ; 00134 for ( int i = 0 ; i < numberOfIncompatibilities ; ++ i ) 00135 { 00136 info = pvm_upklong ( & oldId, 1, 1 ) ; 00137 00138 if (info < 0 ) 00139 { 00140 cerr<<"PsPvmNameServer::PsPvmNameServer: pvm_upklong error "<<info<<endl; 00141 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00142 } 00143 00144 info = pvm_upklong ( & newId, 1, 1 ) ; 00145 if (info < 0 ) 00146 { 00147 cerr<<"PsPvmNameServer::PsPvmNameServer: pvm_upklong error "<<info<<endl; 00148 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00149 } 00150 00151 listOfNeededConversions[oldId] = newId ; 00152 00153 } 00154 00155 00156 map<PsName::idType, PsName::idType>::iterator j = listOfNeededConversions.begin() ; 00157 while ( j != listOfNeededConversions.end() ) 00158 { 00159 oldId = (*j).first ; 00160 newId = (*j).second ; 00161 00162 cerr<<"PsPvmNameServer::PsPvmNameServer: converting "<<oldId<<" to "<<newId<<endl; 00163 00164 assert ( oldId < _nextIdentifier ) ; 00165 00166 if ( newId >= _nextIdentifier ) 00167 { 00168 cerr<<"PsPvmNameServer::PsPvmNameServer: updating nextIdentifier from "<<_nextIdentifier<<" to "<< newId + 1 <<endl; 00169 _nextIdentifier = newId + 1 ; 00170 } 00171 00172 //replace the id in the name server warning : newId could be known or unknown from the name server 00173 bool newIdPresent = ( _tableNbInstances.find(newId) != _tableNbInstances.end() ) ; 00174 00175 // - first take care of the number of references to the string corresponding to each Id 00176 referenceCountingContainerType::iterator oldRefCount = _tableNbInstances.find(oldId) ; 00177 referenceCountingContainerType::iterator newRefCount = _tableNbInstances.find(newId) ; 00178 00179 int referencesToOldId = (*oldRefCount).second ; 00180 _tableNbInstances.erase ( oldRefCount ) ; 00181 00182 00183 if ( newIdPresent ) 00184 { 00185 assert ( newRefCount != _tableNbInstances.end() ) ; 00186 int referencesToNewId = (*newRefCount).second ; 00187 _tableNbInstances.erase ( newRefCount ) ; 00188 _tableNbInstances.insert(referenceCountingContainerType::value_type(oldId, referencesToNewId ) ) ; 00189 } 00190 00191 // - only insert once the eventual copy has been archived 00192 _tableNbInstances.insert(referenceCountingContainerType::value_type(newId, referencesToOldId ) ) ; 00193 00194 00195 // - then take care of the list of PsName instances of each Id 00196 placeOfNamesContainerType::iterator oldNameList = _idToNamesUsingIdContainer.find(oldId) ; 00197 placeOfNamesContainerType::iterator newNameList = _idToNamesUsingIdContainer.find(newId) ; 00198 00199 list<PsName *> * referencesToOldList = (*oldNameList).second ; 00200 _idToNamesUsingIdContainer.erase ( oldNameList ) ; 00201 00202 if ( newIdPresent ) 00203 { 00204 assert ( newNameList != _idToNamesUsingIdContainer.end() ) ; 00205 list<PsName *> * referencesToNewList = (*newNameList).second ; 00206 _idToNamesUsingIdContainer.erase ( newNameList ) ; 00207 _idToNamesUsingIdContainer.insert(placeOfNamesContainerType::value_type(oldId, referencesToNewList) ) ; 00208 } 00209 00210 // - only insert once the eventual copy has been archived 00211 _idToNamesUsingIdContainer.insert(placeOfNamesContainerType::value_type(newId, referencesToOldList) ) ; 00212 00213 00214 // - then take care of the PsString to Id references 00215 PsString newStringOfNewId ( (*(*_fastStringAccessTable.find(oldId)).second ).first ) ; 00216 _fastStringAccessTable.erase ( _fastStringAccessTable.find ( oldId ) ) ; 00217 _stringToIdCorrespondenceContainer.erase ( _stringToIdCorrespondenceContainer.find (newStringOfNewId) ); 00218 00219 if ( newIdPresent ) 00220 { 00221 PsString newStringOfOldId ( (*(*_fastStringAccessTable.find(newId)).second ).first ) ; 00222 _fastStringAccessTable.erase ( _fastStringAccessTable.find ( newId ) ) ; 00223 _stringToIdCorrespondenceContainer.erase ( _stringToIdCorrespondenceContainer.find (newStringOfOldId) ); 00224 pair<correspondenceContainerType::iterator,bool> insertRes = _stringToIdCorrespondenceContainer.insert(correspondenceContainerType::value_type(newStringOfOldId, oldId)) ; 00225 _fastStringAccessTable[oldId] = insertRes.first ; 00226 } 00227 00228 // - only insert once the eventual copy has been archived 00229 pair<correspondenceContainerType::iterator,bool> res = _stringToIdCorrespondenceContainer.insert(correspondenceContainerType::value_type(newStringOfNewId, newId)) ; 00230 _fastStringAccessTable[newId] = res.first ; 00231 00232 00233 //here, newId and oldId have been exchanged in tha data structures, but not in the PsNames nor in the listOfNeededConversions. Therefore, we will replace the PsName containing oldId with PsNames containing newId, and change the list Ofneeded conversions so that the conversion from newId to anotherId is replaced by a conversion of oldId to anotherId 00234 00235 // - replace the id in the PsNames 00236 newNameList = _idToNamesUsingIdContainer.find ( newId ) ; 00237 00238 assert ( newNameList != _idToNamesUsingIdContainer.end() ) ; 00239 assert ( (*newNameList).second != NULL ) ; 00240 assert ( (*newNameList).second->size() == _tableNbInstances[ newId ] ) ; 00241 00242 for ( list<PsName *>::iterator listIter = (*newNameList).second->begin() ; 00243 listIter != (*newNameList).second->end() ; 00244 ++listIter ) 00245 { 00246 changeNamesId (*listIter, oldId, newId) ; 00247 } 00248 00249 listOfNeededConversions.erase (j) ; 00250 00251 if ( newIdPresent ) 00252 { 00253 // - update the conversion from newId to anotherId by a conversion of oldId to anotherId 00254 map<PsName::idType, PsName::idType>::iterator k = listOfNeededConversions.find ( newId ) ; 00255 assert ( k != listOfNeededConversions.end() ) ; 00256 00257 PsName::idType anotherId = (*k).second ; 00258 00259 listOfNeededConversions.erase ( k ) ; 00260 00261 if ( anotherId != oldId ) 00262 { 00263 listOfNeededConversions[oldId] = anotherId ; 00264 } 00265 00266 // - update the PsName so that assertions won't fail and for final permutations 00267 newNameList = _idToNamesUsingIdContainer.find ( oldId ) ; 00268 for ( list<PsName *>::iterator listIter = (*newNameList).second->begin() ; 00269 listIter != (*newNameList).second->end() ; 00270 ++listIter ) 00271 { 00272 changeNamesId (*listIter, newId, oldId) ; 00273 } 00274 00275 cerr<<"PsPvmNameServer::PsPvmNameServer: "<<oldId<<" will now be converted in "<<anotherId<<endl; 00276 } 00277 00278 j = listOfNeededConversions.begin() ; 00279 } 00280 00281 printToStream ( cout, "\n" ) ; 00282 00283 cerr<<"Done "<<endl; 00284 00285 00286 //restore old receive buffer 00287 info = pvm_setrbuf ( oldbufid ); 00288 assert (info != PvmBadParam ) ; 00289 assert (info != PvmNoSuchBuf ) ; 00290 00291 #ifdef _DEBUGDISTRIBUTEDNAMESERVER 00292 cerr<<"PsPvmNameServer::PsPvmNameServer done"<<endl; 00293 #endif 00294 00295 } 00296 00297 00298 PsPvmNameServer::~PsPvmNameServer () 00299 { 00300 00301 } 00302 00303 long 00304 PsPvmNameServer::getIdentifierAsFrom(const PsString & name, long * nextId) 00305 { 00306 #ifdef _DEBUGDISTRIBUTEDNAMESERVER 00307 cerr<<"PsPvmNameServer::getIdentifierAsFrom"<<endl; 00308 #endif 00309 00310 correspondenceContainerType::iterator i; 00311 i = _stringToIdCorrespondenceContainer.find( name ); 00312 00313 if (i == _stringToIdCorrespondenceContainer.end()) 00314 { 00315 //we are going to change the values contained in the PsNameServer 00316 lock() ; 00317 00318 i = _stringToIdCorrespondenceContainer.find( name ) ; //name might have been added by an other thread 00319 00320 if (i == _stringToIdCorrespondenceContainer.end() ) //we have to add nom 00321 { 00322 #ifdef _DEBUGDISTRIBUTEDNAMESERVER 00323 cerr<<" PsPvmNameServer::getIdentifierAsFrom ("<<name<<") on central name server"<<endl; 00324 #endif 00325 //ask the central name server for the id corresponding to nom 00326 00327 int oldbufid = pvm_setsbuf ( 0 ) ; //save the current send buffer 00328 00329 if ( oldbufid < 0 ) 00330 { 00331 cerr<<"PsPvmNameServer::getIdentifierAsFrom: pvm_setsbuf error "<<oldbufid<<endl; 00332 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00333 } 00334 00335 int bufid = pvm_initsend( PsnPvmSvm::pvmDataEncoding ) ; 00336 00337 //pack a timeStamp 00338 long toto = 0 ; 00339 int infot = pvm_pklong ( &toto, 1, 1 ) ; 00340 00341 if ( bufid < 0 ) 00342 { 00343 cerr<<"PsPvmNameServer::getIdentifierAsFrom: pvm_initsend error "<<bufid<<endl; 00344 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00345 } 00346 int numberOfCaracters = name.getStringLength () + 1 ; 00347 int info = pvm_pkint ( &numberOfCaracters , 1, 1 ) ; 00348 00349 info = pvm_pkstr ( const_cast<char *> (name.getCString()) ) ; 00350 00351 if (info < 0 ) 00352 { 00353 cerr<<"PsPvmNameServer::getIdentifierAsFrom: pvm_pkstr error "<<info<<endl; 00354 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00355 } 00356 00357 info = pvm_send (_mainNameServerSiteId, PsnPvmMessage::NameServiceGetId ) ; 00358 00359 if (info < 0 ) 00360 { 00361 cerr<<"PsPvmNameServer::getIdentifierAsFrom: pvm_send error "<<info<<endl; 00362 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00363 } 00364 00365 info = pvm_setsbuf ( oldbufid ) ; //replace the current send buffer 00366 00367 if (info < 0 ) 00368 { 00369 cerr<<"PsPvmNameServer::getIdentifierAsFrom: pvm_setsbuf error "<<info<<endl; 00370 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00371 } 00372 00373 //save the current receive buffer 00374 oldbufid = pvm_setrbuf ( 0 ) ; 00375 00376 //wait for the answer 00377 bufid = pvm_recv (_mainNameServerSiteId, PsnPvmMessage::NameServiceReturnId ) ; 00378 00379 if ( bufid < 0 ) 00380 { 00381 cerr<<"PsPvmNameServer::getIdentifierAsFrom: pvm_recv error "<<bufid<<endl; 00382 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00383 } 00384 00385 PsName::idType requestedId ; 00386 info = pvm_upklong ( & requestedId, 1, 1 ) ; 00387 00388 #ifdef _DEBUGDISTRIBUTEDNAMESERVER 00389 cerr<<" got "<<requestedId<<" from the central name server"<<endl; 00390 #endif 00391 if (info < 0 ) 00392 { 00393 cerr<<"PsPvmNameServer::getIdentifierAsFrom: pvm_upklong error "<<info<<endl; 00394 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00395 } 00396 00397 //restore old receive buffer 00398 info = pvm_setrbuf ( oldbufid ); 00399 assert (info != PvmBadParam ) ; 00400 assert (info != PvmNoSuchBuf ) ; 00401 00402 pair<correspondenceContainerType::iterator,bool> res = _stringToIdCorrespondenceContainer.insert(correspondenceContainerType::value_type(name,requestedId)) ; 00403 _fastStringAccessTable[requestedId] = res.first ; 00404 00405 *nextId = requestedId + 1 ; 00406 00407 i = res.first ; 00408 } 00409 00410 unlock() ; 00411 } 00412 #ifdef _DEBUGDISTRIBUTEDNAMESERVER 00413 cerr<<"PsPvmNameServer::getIdentifierAsFrom returning "<<(*i).second<<endl; 00414 #endif 00415 return (*i).second; 00416 } 00417 00418 const PsString & 00419 PsPvmNameServer::getStringAssociatedTo (PsName::idType id) 00420 { 00421 #ifdef _DEBUGDISTRIBUTEDNAMESERVER 00422 cerr<<"PsPvmNameServer::getStringAssociatedTo ("<<id<<")"<<endl; 00423 #endif 00424 if ( _fastStringAccessTable.find(id) == _fastStringAccessTable.end() ) 00425 { 00426 lock () ; 00427 00428 if ( _fastStringAccessTable.find(id) == _fastStringAccessTable.end() ) 00429 //the request might have allready been fullfilled 00430 { 00431 //ask the central name server for the string 00432 00433 int oldbufid = pvm_setsbuf ( 0 ) ; //save the current send buffer 00434 00435 if ( oldbufid < 0 ) 00436 { 00437 cerr<<"PsPvmNameServer::getStringAssociatedTo: pvm_setsbuf error "<<oldbufid<<endl; 00438 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00439 } 00440 00441 int bufid = pvm_initsend( PsnPvmSvm::pvmDataEncoding ) ; 00442 00443 //pack a timeStamp 00444 long toto = 0 ; 00445 int infot = pvm_pklong ( &toto, 1, 1 ) ; 00446 00447 if ( bufid < 0 ) 00448 { 00449 cerr<<"PsPvmNameServer::getStringAssociatedTo: pvm_initsend error "<<bufid<<endl; 00450 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00451 } 00452 00453 int info = pvm_pklong ( &id, 1, 1 ) ;; 00454 00455 if (info < 0 ) 00456 { 00457 cerr<<"PsPvmNameServer::getStringAssociatedTo: pvm_pklong error "<<info<<endl; 00458 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00459 } 00460 00461 info = pvm_send (_mainNameServerSiteId, PsnPvmMessage::NameServiceGetString ) ; 00462 00463 if (info < 0 ) 00464 { 00465 cerr<<"PsPvmNameServer::getStringAssociatedTo: pvm_send error "<<info<<endl; 00466 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00467 } 00468 00469 info = pvm_setsbuf ( oldbufid ) ; //replace the current send buffer 00470 00471 if (info < 0 ) 00472 { 00473 cerr<<"PsPvmNameServer::getStringAssociatedTo: pvm_setsbuf error "<<info<<endl; 00474 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00475 } 00476 00477 //save the current receive buffer 00478 oldbufid = pvm_setrbuf ( 0 ) ; 00479 00480 //wait for the answer 00481 bufid = pvm_recv (_mainNameServerSiteId, PsnPvmMessage::NameServiceReturnString ) ; 00482 00483 if ( bufid < 0 ) 00484 { 00485 cerr<<"PsPvmNameServer::getStringAssociatedTo: pvm_recv error "<<bufid<<endl; 00486 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00487 } 00488 00489 int bytes, msgtag, tid ; 00490 00491 info = pvm_bufinfo ( bufid, &bytes, &msgtag, & tid ) ; 00492 00493 if (info < 0 ) 00494 { 00495 cerr<<"PsPvmNameServer::getStringAssociatedTo: pvm_bufinfo error "<<info<<endl; 00496 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00497 } 00498 00499 char * resultingString = new char [bytes] ; 00500 00501 info = pvm_upkstr ( resultingString ) ; 00502 00503 if (info < 0 ) 00504 { 00505 cerr<<"PsPvmNameServer::getStringAssociatedTo: pvm_upkstr error "<<info<<endl; 00506 if (PsController::warningLevel == PsController::FatalWarnings ) exit (2) ; 00507 } 00508 00509 //restore old receive buffer 00510 info = pvm_setrbuf ( oldbufid ); 00511 assert (info != PvmBadParam ) ; 00512 assert (info != PvmNoSuchBuf ) ; 00513 00514 //insert the new pair in the data structures 00515 pair<correspondenceContainerType::iterator,bool> res = _stringToIdCorrespondenceContainer.insert(correspondenceContainerType::value_type(PsString (resultingString), id)) ; 00516 _fastStringAccessTable[id] = res.first ; 00517 00518 if ( id >= _nextIdentifier ) 00519 { 00520 _nextIdentifier = id + 1 ; 00521 } 00522 } 00523 00524 unlock() ; 00525 } 00526 #ifdef _DEBUGDISTRIBUTEDNAMESERVER 00527 cerr<<"PsPvmNameServer::getStringAssociatedTo ("<<id<<") ="<<(*(*_fastStringAccessTable.find(id)).second).first<<endl; 00528 #endif 00529 return (*(*_fastStringAccessTable.find(id)).second).first ; 00530 } 00531 00532 00533 00534 const PsString & 00535 PsPvmNameServer::getStringAssociatedTo (PsName::idType id) const 00536 { 00537 if ( _fastStringAccessTable.find(id) == _fastStringAccessTable.end() ) 00538 { 00539 return const_cast<PsPvmNameServer *>(this)->getStringAssociatedTo( id ) ; 00540 } 00541 else 00542 { 00543 return (*(*_fastStringAccessTable.find(id)).second).first ; 00544 } 00545 } 00546 00547 bool PsPvmNameServer::includes (const PsNameServer & otherNameServer ) 00548 { 00549 return true ; 00550 } 00551 00552 void PsPvmNameServer::deleted(PsName::idType id, PsName * name) 00553 { 00554 } 00555 00556 void PsPvmNameServer::created(PsName::idType id, PsName * ) 00557 { 00558 } 00559 #endif
| Documentation generated on Mon Nov 25 15:25:02 2002 |
Generated with doxygen 1.2.12 by Dimitri van Heesch , 1997-2001 |