⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gateserver.h

📁 EPICS CA gateway, base on channel access protocol
💻 H
字号:
/*************************************************************************\* Copyright (c) 2002 The University of Chicago, as Operator of Argonne* National Laboratory.* Copyright (c) 2002 Berliner Speicherring-Gesellschaft fuer Synchrotron-* Strahlung mbH (BESSY).* Copyright (c) 2002 The Regents of the University of California, as* Operator of Los Alamos National Laboratory.* This file is distributed subject to a Software License Agreement found* in the file LICENSE that is included with this distribution. \*************************************************************************/#ifndef _GATESERVER_H_#define _GATESERVER_H_// Define this to manage file descriptors//#define USE_FDS/*+********************************************************************* * * File:       gateServer.h * Project:    CA Proxy Gateway * * Descr.:     Server class header *             - CAS virtual interface *             - Gateway lists and hashes *             - Server statistics variables * * Author(s):  J. Kowalkowski, J. Anderson, K. Evans (APS) *             R. Lange (BESSY) * *********************************************************************-*/#include <sys/types.h>#ifdef WIN32#else# include <unistd.h># include <sys/time.h>#endif#include "casdef.h"#include "tsHash.h"#include "fdManager.h"#include "gateResources.h"#include "gateVc.h"#include "gatePv.h"#include "gateStat.h"class gateServer;class gateAs;class gateStat;class gdd;typedef struct exception_handler_args EXCEPT_ARGS;// ---------------------- list nodes ------------------------class gatePvNode : public tsDLHashNode<gatePvNode>{private:	gatePvNode(void);	gatePvData* pvd;public:	gatePvNode(gatePvData& d) : pvd(&d) { }	~gatePvNode(void) { }	gatePvData* getData(void) { return pvd; }	void destroy(void) { delete pvd; delete this; }};#ifdef USE_FDS// ---------------------- fd manager ------------------------class gateFd : public fdReg{public:	gateFd(const int fdIn,const fdRegType typ,gateServer& s);	virtual ~gateFd(void);private:	virtual void callBack(void);	gateServer& server;#if DEBUG_TIMES	static int count;#endif	};#endif// ---------------------- stats -----------------------------// server stats definitions#ifdef STAT_PVS# define statVcTotal      0# define statPvTotal      1// This should be connected, but left for backward compatibility# define statAlive        2# define statActive       3# define statInactive     4# define statUnconnected  5# define statDead         6# define statConnecting   7# define statDisconnected 8# ifdef USE_FDS#  define statFd          9#  define NEXT_STAT_PV   10# else		     #  define NEXT_STAT_PV    9# endif#else# define NEXT_STAT_PV     0#endif#ifdef RATE_STATS# define statClientEventRate NEXT_STAT_PV# define statPostEventRate   NEXT_STAT_PV+1# define statExistTestRate   NEXT_STAT_PV+2# define statLoopRate        NEXT_STAT_PV+3# define statCPUFract        NEXT_STAT_PV+4# define statLoad            NEXT_STAT_PV+5# define NEXT_RATE_STAT      NEXT_STAT_PV+6#else# define NEXT_RATE_STAT      NEXT_STAT_PV#endif#ifdef CAS_DIAGNOSTICS# define statServerEventRate        NEXT_RATE_STAT# define statServerEventRequestRate NEXT_RATE_STAT+1# define NEXT_CONTROL_PV            NEXT_RATE_STAT+2#else# define NEXT_CONTROL_PV            NEXT_RATE_STAT#endif#ifdef CONTROL_PVS# define statCommandFlag            NEXT_CONTROL_PV# define statReport1Flag            NEXT_CONTROL_PV+1# define statReport2Flag            NEXT_CONTROL_PV+2# define statReport3Flag            NEXT_CONTROL_PV+3# define statNewAsFlag              NEXT_CONTROL_PV+4# define statQuitFlag               NEXT_CONTROL_PV+5# define statQuitServerFlag         NEXT_CONTROL_PV+6# define NEXT_CAS_STAT              NEXT_CONTROL_PV+7#else# define NEXT_CAS_STAT              NEXT_CONTROL_PV#endif// Number of server stats definitions#define statCount NEXT_CAS_STATtypedef struct gateServerStats{	const char *name;	char *pvName;	char *descPvName;	gateStat *pv;	gateStatDesc *descPv;	// Volatile so it can be used with flags, which are volatile	// Pointer so it will use the current value at initialization	volatile unsigned long* init_value;	const char *desc;	const char *units;	short precision;} gateServerStats;#if defined(RATE_STATS) || defined(CAS_DIAGNOSTICS)#include "epicsTimer.h"class gateRateStatsTimer : public epicsTimerNotify{  public:    gateRateStatsTimer(epicsTimerQueue &queue,      double intervalIn, gateServer *m) :       interval(intervalIn), startTime(epicsTime::getCurrent()),      mrg(m), timer(queue.createTimer()) {}    virtual expireStatus expire(const epicsTime &curTime);    void start() { timer.start(*this,interval); }    void stop() { timer.cancel(); }  protected:    virtual ~gateRateStatsTimer() { timer.destroy(); }  private:    double interval;    epicsTime startTime;    gateServer *mrg;    epicsTimer &timer;};#endif// ---------------------- server ----------------------------class gateServer : public caServer{public:	gateServer(char *prefix=NULL);	virtual ~gateServer(void);	// caServer virtual overloads	virtual pvExistReturn pvExistTest(const casCtx& ctx, const caNetAddr& netAddr,	  const char* pvname);	virtual pvExistReturn pvExistTest(const casCtx& ctx, const char* pvname);	virtual pvAttachReturn pvAttach(const casCtx& ctx, const char* pvname);	// caServer overwrite    void generateBeaconAnomaly();	void mainLoop(void);	void gateCommands(const char* cfile);	void newAs(void);	void report1(void);	void report2(void);	void report3(void);	gateAs* getAs(void) { return as; }	casEventMask select_mask;	casEventMask alh_mask;	time_t start_time;	unsigned long exist_count;#if statCount	gateServerStats *getStatTable(int type) { return &stat_table[type]; }	void setStat(int type, double val);	void setStat(int type, unsigned long val);	caStatus processStat(int type, double val);	void clearStat(int type, gateStatType statType);	void initStats(char *prefix);	char* stat_prefix;	int stat_prefix_len;		gateServerStats stat_table[statCount];#endif	#ifdef STAT_PVS	unsigned long total_vc;	unsigned long total_pv;	unsigned long total_alive;	unsigned long total_active;	unsigned long total_inactive;	unsigned long total_unconnected;	unsigned long total_dead;	unsigned long total_connecting;	unsigned long total_disconnected;# ifdef USE_FDS	unsigned long total_fd;# endif#endif#ifdef RATE_STATS	unsigned long client_event_count;	unsigned long post_event_count;	unsigned long loop_count;#endif		// CAS application management functions	void checkEvent(void);	static void quickDelay(void);	static void normalDelay(void);	static double currentDelay(void);	int pvAdd(const char* name, gatePvData& pv);	int pvDelete(const char* name, gatePvData*& pv);	int pvFind(const char* name, gatePvData*& pv);	int pvFind(const char* name, gatePvNode*& pv);	int conAdd(const char* name, gatePvData& pv);	int conDelete(const char* name, gatePvData*& pv);	int conFind(const char* name, gatePvData*& pv);	int conFind(const char* name, gatePvNode*& pv);	int vcAdd(const char* name, gateVcData& pv);	int vcDelete(const char* name, gateVcData*& pv);	int vcFind(const char* name, gateVcData*& pv);	void connectCleanup(void);	void inactiveDeadCleanup(void);	void setFirstReconnectTime(void);	void markRefreshSuppressed(void);	void markNoRefreshSuppressed(void);	time_t timeDeadCheck(void) const;	time_t timeInactiveCheck(void) const;	time_t timeConnectCleanup(void) const;	time_t timeSinceLastBeacon(void) const;	tsDLHashList<gateVcData>* vcList(void) { return &vc_list; }	tsDLHashList<gatePvNode>* pvList(void) { return &pv_list; }	tsDLHashList<gatePvNode>* pvConList(void) { return &pv_con_list; }	void setQuitFlag(unsigned long flag) { quit_flag=flag; }private:	tsDLHashList<gatePvNode> pv_list;		// client pv list	tsDLHashList<gatePvNode> pv_con_list;	// pending client pv connection list	tsDLHashList<gateVcData> vc_list;		// server pv list	void setDeadCheckTime(void);	void setInactiveCheckTime(void);	void setConnectCheckTime(void);	int refreshSuppressed(void) const;	time_t last_dead_cleanup;		// checked dead PVs for cleanup here	time_t last_inactive_cleanup;	// checked inactive PVs for cleanup here	time_t last_connect_cleanup;	// cleared out connect pending list here	time_t last_beacon_time;	    // last time a beacon was sent	int suppressed_refresh_flag;	// flag to remember suppressed beacons	gateAs* as;	static double delay_quick;	static double delay_normal;	static double delay_current;	static volatile unsigned long command_flag;	static volatile unsigned long report1_flag;	static volatile unsigned long report2_flag;	static volatile unsigned long report3_flag;	static volatile unsigned long newAs_flag;	static volatile unsigned long quit_flag;	static volatile unsigned long quitserver_flag;	public:#ifndef WIN32	static void sig_usr1(int);	static void sig_usr2(int);#endif#ifdef USE_FDS	static void fdCB(void* ua, int fd, int opened);#endif	static void exCB(EXCEPT_ARGS args);	static void errlogCB(void *userData, const char *message);};// --------- time functionsinline time_t gateServer::timeDeadCheck(void) const	{ return time(NULL)-last_dead_cleanup; }inline time_t gateServer::timeInactiveCheck(void) const	{ return time(NULL)-last_inactive_cleanup; }inline time_t gateServer::timeConnectCleanup(void) const	{ return time(NULL)-last_connect_cleanup; }inline time_t gateServer::timeSinceLastBeacon(void) const	{ return time(NULL)-last_beacon_time; }inline void gateServer::setDeadCheckTime(void)    { time(&last_dead_cleanup); }inline void gateServer::setInactiveCheckTime(void)	{ time(&last_inactive_cleanup); }inline void gateServer::setConnectCheckTime(void)	{ time(&last_connect_cleanup); }inline void gateServer::setFirstReconnectTime(void)	{ time(&last_beacon_time); }inline void gateServer::markRefreshSuppressed(void)	{ suppressed_refresh_flag = 1; }inline void gateServer::markNoRefreshSuppressed(void)	{ suppressed_refresh_flag = 0; }inline int gateServer::refreshSuppressed(void) const    { return (suppressed_refresh_flag)?1:0; }// --------- add functionsinline int gateServer::pvAdd(const char* name, gatePvData& pv){	gatePvNode* x = new gatePvNode(pv);	return pv_list.add(name,*x);}inline int gateServer::conAdd(const char* name, gatePvData& pv){	gatePvNode* x = new gatePvNode(pv);	return pv_con_list.add(name,*x);}// --------- find functionsinline int gateServer::pvFind(const char* name, gatePvNode*& pv)	{ return pv_list.find(name,pv); }inline int gateServer::conFind(const char* name, gatePvNode*& pv)	{ return pv_con_list.find(name,pv); }inline int gateServer::pvFind(const char* name, gatePvData*& pv){	gatePvNode* n;	int rc;	if((rc=pvFind(name,n))==0) pv=n->getData(); else pv=NULL;	return rc;}inline int gateServer::conFind(const char* name, gatePvData*& pv){	gatePvNode* n;	int rc;	if((rc=conFind(name,n))==0) pv=n->getData(); else pv=NULL;	return rc;}// --------- delete functionsinline int gateServer::pvDelete(const char* name, gatePvData*& pv){	gatePvNode* n;	int rc;	if((rc=pvFind(name,n))==0) { pv=n->getData(); delete n; }	else pv=NULL;	return rc;}inline int gateServer::conDelete(const char* name, gatePvData*& pv){	gatePvNode* n;	int rc;	if((rc=conFind(name,n))==0) { pv=n->getData(); delete n; }	else pv=NULL;	return rc;}inline int gateServer::vcAdd(const char* name, gateVcData& pv)	{ return vc_list.add(name,pv); }inline int gateServer::vcFind(const char* name, gateVcData*& pv)	{ return vc_list.find(name,pv); }inline int gateServer::vcDelete(const char* name, gateVcData*& vc)	{ return vc_list.remove(name,vc); }#endif/* **************************** Emacs Editing Sequences ***************** *//* Local Variables: *//* tab-width: 4 *//* c-basic-offset: 4 *//* c-comment-only-line-offset: 0 *//* c-file-offsets: ((substatement-open . 0) (label . 0)) *//* End: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -