/* * cac::beaconNotify */ void cac::beaconNotify ( const inetAddrID & addr, const epicsTime & currentTime, ca_uint32_t beaconNumber, unsigned protocolRevision ) { epicsGuard < epicsMutex > guard ( this->mutex ); if ( ! this->pudpiiu ) { return; } /* * look for it in the hash table */ bhe *pBHE = this->beaconTable.lookup ( addr ); if ( pBHE ) { /* * return if the beacon period has not changed significantly */ if ( ! pBHE->updatePeriod ( guard, this->programBeginTime, currentTime, beaconNumber, protocolRevision ) ) { return; } } else { /* * This is the first beacon seen from this server. * Wait until 2nd beacon is seen before deciding * if it is a new server (or just the first * time that we have seen a server's beacon * shortly after the program started up) */ pBHE = new ( this->bheFreeList ) bhe ( this->mutex, currentTime, beaconNumber, addr ); if ( pBHE ) { if ( this->beaconTable.add ( *pBHE ) < 0 ) { pBHE->~bhe (); this->bheFreeList.release ( pBHE ); } } return; } this->beaconAnomalyCount++; this->pudpiiu->beaconAnomalyNotify ( guard ); # ifdef DEBUG { char buf[128]; addr.name ( buf, sizeof ( buf ) ); ::printf ( "New server available: %s\n", buf ); } # endif }
/* * set average to -1.0 so that when the next beacon * occurs we can distinguish between: * o new server * o existing server's beacon we are seeing * for the first time shortly after program * start up * * if creating this in response to a search reply * and not in response to a beacon then * we set the beacon time stamp to * zero (so we can correctly compute the period * between the 1st and 2nd beacons) */ bhe::bhe ( epicsMutex & mutexIn, const epicsTime & initialTimeStamp, unsigned initialBeaconNumber, const inetAddrID & addr ) : inetAddrID ( addr ), timeStamp ( initialTimeStamp ), averagePeriod ( - DBL_MAX ), mutex ( mutexIn ), pIIU ( 0 ), lastBeaconNumber ( initialBeaconNumber ) { # ifdef DEBUG { char name[64]; addr.name ( name, sizeof ( name ) ); ::printf ( "created beacon entry for %s\n", name ); } # endif }