124 lines
3.8 KiB
C++
124 lines
3.8 KiB
C++
/*************************************************************************\
|
|
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
|
* National Laboratory.
|
|
* Copyright (c) 2002 The Regents of the University of California, as
|
|
* Operator of Los Alamos National Laboratory.
|
|
* EPICS BASE Versions 3.13.7
|
|
* and higher are distributed subject to a Software License Agreement found
|
|
* in file LICENSE that is included with this distribution.
|
|
\*************************************************************************/
|
|
|
|
/*
|
|
*
|
|
* L O S A L A M O S
|
|
* Los Alamos National Laboratory
|
|
* Los Alamos, New Mexico 87545
|
|
*
|
|
* Copyright, 1986, The Regents of the University of California.
|
|
*
|
|
* Author: Jeff Hill
|
|
*/
|
|
|
|
#ifndef bheh
|
|
#define bheh
|
|
|
|
#ifdef epicsExportSharedSymbols
|
|
# define bhehEpicsExportSharedSymbols
|
|
# undef epicsExportSharedSymbols
|
|
#endif
|
|
|
|
#include "tsDLList.h"
|
|
#include "tsFreeList.h"
|
|
#include "epicsTime.h"
|
|
#include "compilerDependencies.h"
|
|
|
|
#ifdef bhehEpicsExportSharedSymbols
|
|
# define epicsExportSharedSymbols
|
|
# include "shareLib.h"
|
|
#endif
|
|
|
|
#include "inetAddrID.h"
|
|
#include "caProto.h"
|
|
|
|
class tcpiiu;
|
|
class bheMemoryManager;
|
|
|
|
// using a pure abstract wrapper class around the free list avoids
|
|
// Tornado 2.0.1 GNU compiler bugs
|
|
class bheMemoryManager {
|
|
public:
|
|
epicsShareFunc virtual ~bheMemoryManager ();
|
|
virtual void * allocate ( size_t ) = 0;
|
|
virtual void release ( void * ) = 0;
|
|
};
|
|
|
|
class bhe : public tsSLNode < bhe >, public inetAddrID {
|
|
public:
|
|
epicsShareFunc bhe (
|
|
epicsMutex &, const epicsTime & initialTimeStamp,
|
|
unsigned initialBeaconNumber, const inetAddrID & addr );
|
|
epicsShareFunc ~bhe ();
|
|
epicsShareFunc bool updatePeriod (
|
|
epicsGuard < epicsMutex > &,
|
|
const epicsTime & programBeginTime,
|
|
const epicsTime & currentTime, ca_uint32_t beaconNumber,
|
|
unsigned protocolRevision );
|
|
epicsShareFunc double period ( epicsGuard < epicsMutex > & ) const;
|
|
epicsShareFunc epicsTime updateTime ( epicsGuard < epicsMutex > & ) const;
|
|
epicsShareFunc void show ( unsigned level ) const;
|
|
epicsShareFunc void show ( epicsGuard < epicsMutex > &, unsigned /* level */ ) const;
|
|
epicsShareFunc void registerIIU ( epicsGuard < epicsMutex > &, tcpiiu & );
|
|
epicsShareFunc void unregisterIIU ( epicsGuard < epicsMutex > &, tcpiiu & );
|
|
epicsShareFunc void * operator new ( size_t size, bheMemoryManager & );
|
|
#ifdef CXX_PLACEMENT_DELETE
|
|
epicsShareFunc void operator delete ( void *, bheMemoryManager & );
|
|
#endif
|
|
private:
|
|
epicsTime timeStamp;
|
|
double averagePeriod;
|
|
epicsMutex & mutex;
|
|
tcpiiu * pIIU;
|
|
ca_uint32_t lastBeaconNumber;
|
|
void beaconAnomalyNotify ( epicsGuard < epicsMutex > & );
|
|
void logBeacon ( const char * pDiagnostic,
|
|
const double & currentPeriod,
|
|
const epicsTime & currentTime );
|
|
void logBeaconDiscard ( unsigned beaconAdvance,
|
|
const epicsTime & currentTime );
|
|
bhe ( const bhe & );
|
|
bhe & operator = ( const bhe & );
|
|
void * operator new ( size_t size );
|
|
epicsShareFunc void operator delete ( void * );
|
|
};
|
|
|
|
// using a wrapper class around the free list avoids
|
|
// Tornado 2.0.1 GNU compiler bugs
|
|
class bheFreeStore : public bheMemoryManager {
|
|
public:
|
|
bheFreeStore () {}
|
|
void * allocate ( size_t );
|
|
void release ( void * );
|
|
private:
|
|
tsFreeList < bhe, 0x100 > freeList;
|
|
bheFreeStore ( const bheFreeStore & );
|
|
bheFreeStore & operator = ( const bheFreeStore & );
|
|
};
|
|
|
|
inline void * bhe::operator new ( size_t size,
|
|
bheMemoryManager & mgr )
|
|
{
|
|
return mgr.allocate ( size );
|
|
}
|
|
|
|
#ifdef CXX_PLACEMENT_DELETE
|
|
inline void bhe::operator delete ( void * pCadaver,
|
|
bheMemoryManager & mgr )
|
|
{
|
|
mgr.release ( pCadaver );
|
|
}
|
|
#endif
|
|
|
|
#endif // ifdef bheh
|
|
|
|
|