/* afs_stats.h */

/*
 * Statistics gathering stuff for the AFS cache manager.
 */
/*
 *  The remainder of this file contains the statistics gathering stuff.
 */

#ifndef __TRANSARC_AFS_STATS_H__
#define __TRANSARC_AFS_STATS_H__

#include "../afs/param.h"


/* the following is to work around a VAX compiler limitation */
#if defined(vax)
#undef AFS_NOSTATS
#define AFS_NOSTATS
#endif /* VAX environment */

#ifdef AFS_NOSTATS

/*
 * The data collection routines are simply no-ops
 */
#define AFS_STATCNT(arg)
#define AFS_MEANCNT(arg, value)
#define AFS_STATS(arg)

#else
#define AFS_STATS(arg) arg

#endif

struct afs_MeanStats {
    long average;
    long elements;
};

/*
 * struct afs_CMCallStats
 *	This is the place where we keep records on each and every
 *	function call.
 */
struct afs_CMCallStats {
    long C_afs_init;	/* afs_aix_subr.c*/
    long C_gop_rdwr;	/* afs_aix_subr.c*/
    long C_aix_gnode_rele;	/* afs_aix_subr.c*/
    long C_gettimeofday;	/* afs_aix_subr.c*/
    long C_m_cpytoc;	/* afs_aix_subr.c*/
    long C_aix_vattr_null;	/* afs_aix_subr.c*/
    long C_afs_gn_ftrunc;	/* afs_aixops.c*/
    long C_afs_gn_rdwr;	/* afs_aixops.c*/
    long C_afs_gn_ioctl;	/* afs_aixops.c*/
    long C_afs_gn_lockctl;	/* afs_aixops.c*/
    long C_afs_gn_readlink;	/* afs_aixops.c*/
    long C_afs_gn_readdir;	/* afs_aixops.c*/
    long C_afs_gn_select;	/* afs_aixops.c*/
    long C_afs_gn_strategy;	/* afs_aixops.c*/
    long C_afs_gn_symlink;	/* afs_aixops.c*/
    long C_afs_gn_revoke;	/* afs_aixops.c*/
    long C_afs_gn_link;	/* afs_aixops.c*/
    long C_afs_gn_mkdir;	/* afs_aixops.c*/
    long C_afs_gn_mknod;	/* afs_aixops.c*/
    long C_afs_gn_remove;	/* afs_aixops.c*/
    long C_afs_gn_rename;	/* afs_aixops.c*/
    long C_afs_gn_rmdir;	/* afs_aixops.c*/
    long C_afs_gn_fid;	/* afs_aixops.c*/
    long C_afs_gn_lookup;	/* afs_aixops.c*/
    long C_afs_gn_open;	/* afs_aixops.c*/
    long C_afs_gn_create;	/* afs_aixops.c*/
    long C_afs_gn_hold;	/* afs_aixops.c*/
    long C_afs_gn_close;	/* afs_aixops.c*/
    long C_afs_gn_map;	/* afs_aixops.c*/
    long C_afs_gn_rele;	/* afs_aixops.c*/
    long C_afs_gn_unmap;	/* afs_aixops.c*/
    long C_afs_gn_access;	/* afs_aixops.c*/
    long C_afs_gn_getattr;	/* afs_aixops.c*/
    long C_afs_gn_setattr;	/* afs_aixops.c*/
    long C_afs_gn_fclear;	/* afs_aixops.c*/
    long C_afs_gn_fsync;	/* afs_aixops.c*/
    long C_pHash;	/* afs_buffer.c*/
    long C_DInit;	/* afs_buffer.c*/
    long C_DRead;	/* afs_buffer.c*/
    long C_FixupBucket;	/* afs_buffer.c*/
    long C_afs_newslot;	/* afs_buffer.c*/
    long C_DRelease;	/* afs_buffer.c*/
    long C_DFlush;	/* afs_buffer.c*/
    long C_DFlushEntry;	/* afs_buffer.c*/
    long C_DVOffset;	/* afs_buffer.c*/
    long C_DZap;	/* afs_buffer.c*/
    long C_DNew;	/* afs_buffer.c*/
    long C_shutdown_bufferpackage;	/* afs_buffer.c*/
    long C_afs_CheckKnownBad;	/* afs_cache.c*/
    long C_afs_RemoveVCB;	/* afs_cache.c*/
    long C_afs_NewVCache;	/* afs_cache.c*/
    long C_afs_FlushActiveVcaches;	/* afs_cache.c*/
    long C_afs_VerifyVCache;	/* afs_cache.c*/
    long C_afs_WriteVCache;	/* afs_cache.c*/
    long C_afs_GetVCache;	/* afs_cache.c*/
    long C_afs_StuffVcache;	/* afs_cache.c*/
    long C_afs_FindVCache;	/* afs_cache.c*/
    long C_afs_PutDCache;	/* afs_cache.c*/
    long C_afs_PutVCache;	/* afs_cache.c*/
    long C_CacheStoreProc;	/* afs_cache.c*/
    long C_afs_FindDCache;	/* afs_cache.c*/
    long C_afs_TryToSmush;	/* afs_cache.c*/
    long C_afs_AdjustSize;	/* afs_cache.c*/
    long C_afs_CheckSize;	/* afs_cache.c*/
    long C_afs_StoreWarn;	/* afs_cache.c*/
    long C_CacheFetchProc;	/* afs_cache.c*/
    long C_UFS_CacheStoreProc;	/* afs_cache.c*/
    long C_UFS_CacheFetchProc;	/* afs_cache.c*/
    long C_afs_GetDCache;	/* afs_cache.c*/
    long C_afs_SimpleVStat;	/* afs_cache.c*/
    long C_afs_ProcessFS;	/* afs_cache.c*/
    long C_afs_InitCacheInfo;	/* afs_cache.c*/
    long C_afs_InitVolumeInfo;	/* afs_cache.c*/
    long C_afs_InitCacheFile;	/* afs_cache.c*/
    long C_afs_CacheInit;	/* afs_cache.c*/
    long C_afs_GetDSlot;	/* afs_cache.c*/
    long C_afs_WriteThroughDSlots;	/* afs_cache.c*/
    long C_afs_MemGetDSlot;	/* afs_cache.c*/
    long C_afs_UFSGetDSlot;	/* afs_cache.c*/
    long C_afs_StoreDCache;	/* afs_cache.c*/
    long C_afs_StoreMini;	/* afs_cache.c*/
    long C_shutdown_cache;	/* afs_cache.c*/
    long C_afs_StoreAllSegments;	/* afs_cache.c*/
    long C_afs_InvalidateAllSegments;	/* afs_cache.c*/
    long C_afs_TruncateAllSegments;	/* afs_cache.c*/
    long C_afs_CheckVolSync;	/* afs_cache.c*/
    long C_afs_wakeup;	/* afs_cache.c*/
    long C_afs_CFileOpen;	/* afs_cache.c*/
    long C_afs_CFileTruncate;	/* afs_cache.c*/
    long C_afs_GetDownD;	/* afs_cache.c*/
    long C_afs_WriteDCache;	/* afs_cache.c*/
    long C_afs_FlushDCache;	/* afs_cache.c*/
    long C_afs_GetDownDSlot;	/* afs_cache.c*/
    long C_afs_FlushVCache;	/* afs_cache.c*/
    long C_afs_GetDownV;	/* afs_cache.c*/
    long C_afs_QueueVCB;	/* afs_cache.c*/
    long C_afs_call;      /* afs_call.c */
    long C_afs_syscall_call;	/* afs_call.c*/
    long C_syscall;	/* afs_call.c*/
    long C_lpioctl;	/* afs_call.c*/
    long C_lsetpag;	/* afs_call.c*/
    long C_afs_syscall;	/* afs_call.c*/
    long C_afs_CheckInit;	/* afs_call.c*/
    long C_afs_shutdown;	/* afs_call.c*/
    long C_shutdown_BKG;	/* afs_call.c*/
    long C_shutdown_afstest;	/* afs_call.c*/
    long C_SRXAFSCB_GetCE;	/* afs_callback.c*/
    long C_ClearCallBack;	/* afs_callback.c*/
    long C_SRXAFSCB_GetLock;	/* afs_callback.c*/
    long C_SRXAFSCB_CallBack;	/* afs_callback.c*/
    long C_SRXAFSCB_InitCallBackState;	/* afs_callback.c*/
    long C_SRXAFSCB_Probe;	/* afs_callback.c*/
    long C_afs_RXCallBackServer;	/* afs_callback.c*/
    long C_shutdown_CB;	/* afs_callback.c*/
    long C_afs_Chunk;	/* afs_chunk.c*/
    long C_afs_ChunkBase;	/* afs_chunk.c*/
    long C_afs_ChunkOffset;	/* afs_chunk.c*/
    long C_afs_ChunkSize;	/* afs_chunk.c*/
    long C_afs_ChunkToBase;	/* afs_chunk.c*/
    long C_afs_ChunkToSize;	/* afs_chunk.c*/
    long C_afs_SetChunkSize;	/* afs_chunk.c*/

    long C_afs_config;	/* afs_config.c*/
    long C_mem_freebytes;	/* afs_config.c*/
    long C_mem_getbytes;	/* afs_config.c*/
    long C_fpalloc;	/* afs_config.c*/
    long C_kluge_init;	/* afs_config.c*/
    long C_ufdalloc;	/* afs_config.c*/
    long C_ufdfree;	/* afs_config.c*/
    long C_commit;	/* afs_config.c*/
    long C_dev_ialloc;	/* afs_config.c*/
    long C_ffree;	        /* afs_config.c*/
    long C_iget;	        /* afs_config.c*/
    long C_iptovp;	/* afs_config.c*/
    long C_ilock;	/* afs_config.c*/
    long C_irele;	/* afs_config.c*/
    long C_iput;	/* afs_config.c*/

    long C_afs_Daemon;	/* afs_daemons.c*/
    long C_afs_CheckRootVolume;	/* afs_daemons.c*/
    long C_BPath;	        /* afs_daemons.c*/
    long C_BPrefetch;	/* afs_daemons.c*/
    long C_BStore;	/* afs_daemons.c*/
    long C_afs_BBusy;	/* afs_daemons.c*/
    long C_afs_BQueue;	/* afs_daemons.c*/
    long C_afs_BRelease;	/* afs_daemons.c*/
    long C_afs_BackgroundDaemon;	/* afs_daemons.c*/
    long C_shutdown_daemons;	/* afs_daemons.c*/
    long C_exporter_add;	/* afs_exporter.c*/
    long C_exporter_find;	/* afs_exporter.c*/
    long C_afs_gfs_kalloc;	/* afs_gfs_subr.c*/
    long C_IsAfsVnode;	/* afs_gfs_subr.c*/
    long C_SetAfsVnode;	/* afs_gfs_subr.c*/
    long C_afs_gfs_kfree;	/* afs_gfs_subr.c*/
    long C_gop_lookupname;	/* afs_gfs_subr.c*/
    long C_gfsvop_getattr;	/* afs_gfs_subr.c*/
    long C_gfsvop_rdwr;	/* afs_gfs_subr.c*/
    long C_afs_uniqtime;	/* afs_gfs_subr.c*/
    long C_gfs_vattr_null;	/* afs_gfs_subr.c*/
    long C_afs_lock;	/* afs_gfsops.c*/
    long C_afs_unlock;	/* afs_gfsops.c*/
    long C_afs_update;	/* afs_gfsops.c*/
    long C_afs_gclose;	/* afs_gfsops.c*/
    long C_afs_gopen;	/* afs_gfsops.c*/
    long C_afs_greadlink;	/* afs_gfsops.c*/
    long C_afs_select;	/* afs_gfsops.c*/
    long C_afs_gbmap;	/* afs_gfsops.c*/
    long C_afs_getfsdata;	/* afs_gfsops.c*/
    long C_afs_gsymlink;	/* afs_gfsops.c*/
    long C_afs_namei;	/* afs_gfsops.c*/
    long C_printgnode;	/* afs_gfsops.c*/
    long C_HaveGFSLock;	/* afs_gfsops.c*/
    long C_afs_gmount;	/* afs_gfsops.c*/
    long C_AddGFSLock;	/* afs_gfsops.c*/
    long C_RemoveGFSLock;	/* afs_gfsops.c*/
    long C_afs_grlock;	/* afs_gfsops.c*/
    long C_afs_gumount;	/* afs_gfsops.c*/
    long C_afs_gget;	/* afs_gfsops.c*/
    long C_afs_glink;	/* afs_gfsops.c*/
    long C_afs_gmkdir;	/* afs_gfsops.c*/
    long C_afs_sbupdate;	/* afs_gfsops.c*/
    long C_afs_unlink;	/* afs_gfsops.c*/
    long C_afs_grmdir;	/* afs_gfsops.c*/
    long C_afs_makenode;	/* afs_gfsops.c*/
    long C_afs_grename;	/* afs_gfsops.c*/
    long C_afs_rele;	/* afs_gfsops.c*/
    long C_afs_syncgp;	/* afs_gfsops.c*/
    long C_afs_getval;	/* afs_gfsops.c*/
    long C_afs_gfshack;	/* afs_gfsops.c*/
    long C_afs_trunc;	/* afs_gfsops.c*/
    long C_afs_rwgp;	/* afs_gfsops.c*/
    long C_afs_stat;	/* afs_gfsops.c*/
    long C_afsc_link;	/* afs_hp_subr.c*/
    long C_hpsobind;	/* afs_hp_subr.c*/
    long C_hpsoclose;	/* afs_hp_subr.c*/
    long C_hpsocreate;	/* afs_hp_subr.c*/
    long C_hpsoreserve;	/* afs_hp_subr.c*/
    long C_afs_vfs_mount;	/* afs_hp_subr.c*/
    long C_devtovfs;	/* afs_istuff.c*/
    long C_igetinode;	/* afs_istuff.c*/
    long C_afs_syscall_iopen;	/* afs_istuff.c*/
    long C_iopen;	/* afs_istuff.c*/
    long C_afs_syscall_iincdec;	/* afs_istuff.c*/
    long C_afs_syscall_ireadwrite;	/* afs_istuff.c*/
    long C_iincdec;	/* afs_istuff.c*/
    long C_ireadwrite;	/* afs_istuff.c*/
    long C_oiread;	/* afs_istuff.c*/
    long C_AHash;	/* afs_istuff.c*/
    long C_QTOA;	/* afs_istuff.c*/
    long C_afs_FindPartByDev;	/* afs_istuff.c*/
    long C_aux_init;	/* afs_istuff.c*/
    long C_afs_GetNewPart;	/* afs_istuff.c*/
    long C_afs_InitAuxVolFile;	/* afs_istuff.c*/
    long C_afs_CreateAuxEntry;	/* afs_istuff.c*/
    long C_afs_GetAuxSlot;	/* afs_istuff.c*/
    long C_afs_GetDownAux;	/* afs_istuff.c*/
    long C_afs_FlushAuxCache;	/* afs_istuff.c*/
    long C_afs_GetAuxInode;	/* afs_istuff.c*/
    long C_afs_PutAuxInode;	/* afs_istuff.c*/
    long C_afs_ReadAuxInode;	/* afs_istuff.c*/
    long C_afs_WriteAuxInode;	/* afs_istuff.c*/
    long C_afs_auxcall;	/* afs_istuff.c*/
    long C_tmpdbg_auxtbl;	/* afs_istuff.c*/
    long C_tmpdbg_parttbl;	/* afs_istuff.c*/
    long C_idec;	/* afs_istuff.c*/
    long C_iinc;	/* afs_istuff.c*/
    long C_iread;	/* afs_istuff.c*/
    long C_iwrite;	/* afs_istuff.c*/
    long C_getinode;	/* afs_istuff.c*/
    long C_trygetfs;	/* afs_istuff.c*/
    long C_iforget;	/* afs_istuff.c*/
    long C_afs_syscall_icreate;	/* afs_istuff.c*/
    long C_icreate;	/* afs_istuff.c*/
    long C_Lock_Init;	/* afs_lock.c*/
    long C_Lock_Obtain;	/* afs_lock.c*/
    long C_Lock_ReleaseR;	/* afs_lock.c*/
    long C_Lock_ReleaseW;	/* afs_lock.c*/
    long C_afs_BozonLock;	/* afs_lock.c*/
    long C_afs_BozonUnlock;	/* afs_lock.c*/
    long C_osi_SleepR;	/* afs_lock.c*/
    long C_osi_SleepS;	/* afs_lock.c*/
    long C_osi_SleepW;	/* afs_lock.c*/
    long C_osi_Sleep;		/* afs_lock */
    long C_afs_BozonInit;	/* afs_lock.c*/
    long C_afs_CheckBozonLock;	/* afs_lock.c*/
    long C_xxxinit;	/* afs_main.c*/
    long C_KernelEntry;	/* afs_main.c*/
    long C_afs_InitMemCache;	/* afs_memcache.c*/
    long C_afs_LookupMCE;	/* afs_memcache.c*/
    long C_afs_MemReadBlk;	/* afs_memcache.c*/
    long C_afs_MemReadUIO;	/* afs_memcache.c*/
    long C_afs_MemWriteBlk;	/* afs_memcache.c*/
    long C_afs_MemCacheStoreProc;	/* afs_memcache.c*/
    long C_afs_MemCacheTruncate;	/* afs_memcache.c*/
    long C_afs_MemWriteUIO;	/* afs_memcache.c*/
    long C_afs_MemCacheFetchProc;	/* afs_memcache.c*/
    long C_afs_vnode_pager_create;	/* afs_next_aux.c*/
    long C_next_KernelEntry;	/* afs_next_subr.c*/
    long C_afs_GetNfsClientPag;	/* afs_nfsclnt.c*/
    long C_afs_FindNfsClientPag;	/* afs_nfsclnt.c*/
    long C_afs_PutNfsClientPag;	/* afs_nfsclnt.c*/
    long C_afs_nfsclient_reqhandler;	/* afs_nfsclnt.c*/
    long C_afs_nfsclient_GC;	/* afs_nfsclnt.c*/
    long C_afs_nfsclient_hold;	/* afs_nfsclnt.c*/
    long C_afs_nfsclient_stats;	/* afs_nfsclnt.c*/
    long C_afs_nfsclient_sysname;	/* afs_nfsclnt.c*/
    long C_afs_nfsclient_shutdown;	/* afs_nfsclnt.c*/
    long C_afs_rfs_readdir_fixup;	/* afs_nfssrv.c */
    long C_afs_rfs_dispatch;	/* afs_nfssrv.c*/
    long C_afs_xnfs_svc;	/* afs_nfssrv.c*/
    long C_afs_xdr_putrddirres;	/* afs_nfssrv.c*/
    long C_afs_rfs_readdir;	/* afs_nfssrv.c*/
    long C_afs_rfs_rddirfree;	/* afs_nfssrv.c*/
    long C_rfs_dupcreate;	/* afs_nfssrv.c*/
    long C_rfs_dupsetattr;	/* afs_nfssrv.c*/
    long C_Nfs2AfsCall;	/* afs_nfssrv.c*/
    long C_afs_sun_xuntext;	/* afs_osi.c*/
    long C_osi_Active;	/* afs_osi.c*/
    long C_osi_FlushPages;	/* afs_osi.c*/
    long C_osi_FlushText;	/* afs_osi.c*/
    long C_osi_CallProc;	/* afs_osi.c*/
    long C_osi_CancelProc;	/* afs_osi.c*/
    long C_osi_Invisible;	/* afs_osi.c*/
    long C_osi_Time;	/* afs_osi.c*/
    long C_osi_Alloc;	/* afs_osi.c*/
    long C_osi_SetTime;	/* afs_osi.c*/
    long C_osi_Dump;	/* afs_osi.c*/
    long C_osi_Free;	/* afs_osi.c*/
    long C_shutdown_osi;	/* afs_osi.c*/
    long C_osi_UFSOpen;	/* afs_osifile.c*/
    long C_osi_Close;	/* afs_osifile.c*/
    long C_osi_Stat;	/* afs_osifile.c*/
    long C_osi_Truncate;	/* afs_osifile.c*/
    long C_osi_Read;	/* afs_osifile.c*/
    long C_osi_Write;	/* afs_osifile.c*/
    long C_osi_MapStrategy;	/* afs_osifile.c*/
    long C_shutdown_osifile;	/* afs_osifile.c*/
    long C_osi_FreeLargeSpace;	/* afs_osinet.c*/
    long C_osi_FreeSmallSpace;	/* afs_osinet.c*/
    long C_pkt_iodone;	/* afs_osinet.c*/
    long C_shutdown_osinet;	/* afs_osinet.c*/
    long C_afs_cs;	/* afs_osinet.c*/
    long C_osi_AllocLargeSpace;	/* afs_osinet.c*/
    long C_osi_AllocSmallSpace;	/* afs_osinet.c*/
    long C_osi_CloseToTheEdge;	/* afs_osinet.c*/
    long C_osi_xgreedy;	/* afs_osinet.c*/
    long C_osi_FreeSocket;	/* afs_osinet.c*/
    long C_osi_NewSocket;	/* afs_osinet.c*/
    long C_trysblock;	/* afs_osinet.c*/
    long C_osi_NetSend;	/* afs_osinet.c*/
    long C_WaitHack;	/* afs_osinet.c*/
    long C_osi_CancelWait;	/* afs_osinet.c*/
    long C_osi_InitWaitHandle;	/* afs_osinet.c*/
    long C_osi_Wakeup;		/* afs_osinet.c*/
    long C_osi_Wait;	/* afs_osinet.c*/
    long C_dirp_Read;	/* afs_physio.c*/
    long C_dirp_SetCacheDev;	/* afs_physio.c*/
    long C_Die;	/* afs_physio.c*/
    long C_dirp_Cpy;	/* afs_physio.c*/
    long C_dirp_Eq;	/* afs_physio.c*/
    long C_dirp_Write;	/* afs_physio.c*/
    long C_dirp_Zap;	/* afs_physio.c*/
    long C_PSetVolumeStatus;	/* afs_pioctl.c*/
    long C_PFlush;	/* afs_pioctl.c*/
    long C_PNewStatMount;	/* afs_pioctl.c*/
    long C_PGetTokens;	/* afs_pioctl.c*/
    long C_PUnlog;	/* afs_pioctl.c*/
    long C_PCheckServers;	/* afs_pioctl.c*/
    long C_PMariner;	/* afs_pioctl.c*/
    long C_PCheckAuth;	/* afs_pioctl.c*/
    long C_PCheckVolNames;	/* afs_pioctl.c*/
    long C_PFindVolume;	/* afs_pioctl.c*/
    long C_Prefetch;	/* afs_pioctl.c*/
    long C_PGetCacheSize;	/* afs_pioctl.c*/
    long C_PRemoveCallBack;	/* afs_pioctl.c*/
    long C_PSetCacheSize;	/* afs_pioctl.c*/
    long C_PViceAccess;	/* afs_pioctl.c*/
    long C_PListCells;	/* afs_pioctl.c*/
    long C_PNewCell;	/* afs_pioctl.c*/
    long C_PRemoveMount;	/* afs_pioctl.c*/
    long C_HandleIoctl;	/* afs_pioctl.c*/
    long C__AFSIOCTL;	/* afs_pioctl.c*/
    long C__VALIDAFSIOCTL;	/* afs_pioctl.c*/
    long C_PGetCellStatus;	/* afs_pioctl.c*/
    long C_PSetCellStatus;	/* afs_pioctl.c*/
    long C_PVenusLogging;	/* afs_pioctl.c*/
    long C_PFlushVolumeData;	/* afs_pioctl.c*/
    long C_PSetSysName;	/* afs_pioctl.c*/
    long C_PExportAfs;	/* afs_pioctl.c*/
    long C_HandleClientContext;	/* afs_pioctl.c*/
    long C_afs_ioctl;	/* afs_pioctl.c*/
    long C_afs_xioctl;	/* afs_pioctl.c*/
    long C_afs_pioctl;	/* afs_pioctl.c*/
    long C_afs_syscall_pioctl;	/* afs_pioctl.c*/
    long C_HandlePioctl;	/* afs_pioctl.c*/
    long C_PGetAcl;	/* afs_pioctl.c*/
    long C_PGetFID;	/* afs_pioctl.c*/
    long C_PSetAcl;	/* afs_pioctl.c*/
    long C_PBogus;	/* afs_pioctl.c*/
    long C_PGetFileCell;	/* afs_pioctl.c*/
    long C_PGetWSCell;	/* afs_pioctl.c*/
    long C_PNoop;	/* afs_pioctl.c*/
    long C_PGetUserCell;	/* afs_pioctl.c*/
    long C_PSetTokens;	/* afs_pioctl.c*/
    long C_PGetVolumeStatus;	/* afs_pioctl.c*/
    long C_afs_ResetAccessCache;	/* afs_resource.c*/
    long C_afs_FindUser;	/* afs_resource.c*/
    long C_afs_ResetUserConns;	/* afs_resource.c*/
    long C_afs_ResourceInit;	/* afs_resource.c*/
    long C_afs_GetCell;	/* afs_resource.c*/
    long C_afs_GetCellByIndex;	/* afs_resource.c*/
    long C_afs_GetCellByName;	/* afs_resource.c*/
    long C_afs_NewCell;	/* afs_resource.c*/
    long C_afs_GetUser;	/* afs_resource.c*/
    long C_afs_PutUser;	/* afs_resource.c*/
    long C_afs_SetPrimary;	/* afs_resource.c*/
    long C_CheckVLDB;	/* afs_resource.c*/
    long C_afs_GetVolume;	/* afs_resource.c*/
    long C_afs_GetVolumeByName;	/* afs_resource.c*/
    long C_InstallVolumeEntry;	/* afs_resource.c*/
    long C_InstallVolumeInfo;	/* afs_resource.c*/
    long C_afs_FindServer;	/* afs_resource.c*/
    long C_afs_PutVolume;	/* afs_resource.c*/
    long C_afs_random;	/* afs_resource.c*/
    long C_ranstage;	/* afs_resource.c*/
    long C_RemoveUserConns;	/* afs_resource.c*/
    long C_afs_MarinerLog;	/* afs_resource.c*/
    long C_afs_vtoi;	/* afs_resource.c*/
    long C_afs_GetServer;	/* afs_resource.c*/
    long C_afs_SortServers;	/* afs_resource.c*/
    long C_afs_Conn;	/* afs_resource.c*/
    long C_afs_ConnByHost;	/* afs_resource.c*/
    long C_afs_ConnByMHosts;	/* afs_resource.c*/
    long C_afs_Analyze;	/* afs_resource.c*/
    long C_afs_PutConn;	/* afs_resource.c*/
    long C_afs_ResetVolumeInfo;	/* afs_resource.c*/
    long C_StartLogFile;	/* afs_resource.c*/
    long C_afs_SetLogFile;	/* afs_resource.c*/
    long C_EndLogFile;	/* afs_resource.c*/
    long C_afs_dp;	/* afs_resource.c*/
    long C_fprf;	/* afs_resource.c*/
    long C_fprint;	/* afs_resource.c*/
    long C_fprintn;	/* afs_resource.c*/
    long C_afs_CheckLocks;	/* afs_resource.c*/
    long C_puttofile;	/* afs_resource.c*/
    long C_shutdown_AFS;	/* afs_resource.c*/
    long C_afs_CheckCacheResets;	/* afs_resource.c*/
    long C_afs_GCUserData;	/* afs_resource.c*/
    long C_VSleep;	/* afs_resource.c*/
    long C_afs_CheckCode;	/* afs_resource.c*/
    long C_afs_CopyError;	/* afs_resource.c*/
    long C_afs_FinalizeReq;	/* afs_resource.c*/
    long C_afs_cv2string;	/* afs_resource.c*/
    long C_afs_FindVolCache;	/* afs_resource.c*/
    long C_afs_GetVolCache;	/* afs_resource.c*/
    long C_afs_GetVolSlot;	/* afs_resource.c*/
    long C_afs_WriteVolCache;	/* afs_resource.c*/
    long C_afs_UFSGetVolSlot;	/* afs_resource.c*/
    long C_afs_CheckVolumeNames;	/* afs_resource.c*/
    long C_afs_MemGetVolSlot;	/* afs_resource.c*/
    long C_print_internet_address;	/* afs_resource.c*/
    long C_CheckVLServer;	/* afs_resource.c*/
    long C_HaveCallBacksFrom;	/* afs_resource.c*/
    long C_ServerDown;	/* afs_resource.c*/
    long C_afs_CheckServers;	/* afs_resource.c*/
    long C_afs_AddToMean;	/* afs_stat.c*/
    long C_afs_GetCMStat;	/* afs_stat.c*/
    long C_afs_getpage;	/* afs_sun_subr.c*/
    long C_afs_putpage;	/* afs_sun_subr.c*/
    long C_afs_nfsrdwr;	/* afs_sun_subr.c*/
    long C_afs_map;	/* afs_sun_subr.c*/
    long C_afs_cmp;	/* afs_sun_subr.c*/
    long C_afs_cntl;	/* afs_sun_subr.c*/
    long C_afs_dump;	/* afs_sun_subr.c*/
    long C_afs_realvp;	/* afs_sun_subr.c*/
    long C_afs_PageLeft;	/* afs_sun_subr.c*/
    long C_afsinit;	/* afs_vfsops.c*/
    long C_afs_mount;	/* afs_vfsops.c*/
    long C_afs_unmount;	/* afs_vfsops.c*/
    long C_afs_root;	/* afs_vfsops.c*/
    long C_afs_statfs;	/* afs_vfsops.c*/
    long C_afs_sync;	/* afs_vfsops.c*/
    long C_afs_vget;	/* afs_vfsops.c*/
    long C_afs_mountroot;	/* afs_vfsops.c*/
    long C_afs_swapvp;	/* afs_vfsops.c*/
    long C_afs_AddMarinerName;	/* afs_vnodeops.c*/
    long C_afs_setpag;	/* afs_vnodeops.c*/
    long C_genpag;	/* afs_vnodeops.c*/
    long C_getpag;	/* afs_vnodeops.c*/
    long C_afs_GetMariner;	/* afs_vnodeops.c*/
    long C_afs_badop;	/* afs_vnodeops.c*/
    long C_afs_index;	/* afs_vnodeops.c*/
    long C_afs_noop;	/* afs_vnodeops.c*/
    long C_afs_open;	/* afs_vnodeops.c*/
    long C_afs_closex;	/* afs_vnodeops.c*/
    long C_afs_close;	/* afs_vnodeops.c*/
    long C_afs_MemWrite;	/* afs_vnodeops.c*/
    long C_afs_write;	/* afs_vnodeops.c*/
    long C_afs_UFSWrite;	/* afs_vnodeops.c*/
    long C_afs_rdwr;	/* afs_vnodeops.c*/
    long C_afs_MemRead;	/* afs_vnodeops.c*/
    long C_afs_read;	/* afs_vnodeops.c*/
    long C_FIXUPSTUPIDINODE;	/* afs_vnodeops.c*/
    long C_afs_UFSRead;	/* afs_vnodeops.c*/
    long C_afs_CopyOutAttrs;	/* afs_vnodeops.c*/
    long C_afs_getattr;	/* afs_vnodeops.c*/
    long C_afs_VAttrToAS;	/* afs_vnodeops.c*/
    long C_afs_setattr;	/* afs_vnodeops.c*/
    long C_EvalMountPoint;	/* afs_vnodeops.c*/
    long C_afs_access;	/* afs_vnodeops.c*/
    long C_ENameOK;	/* afs_vnodeops.c*/
    long C_HandleAtName;	/* afs_vnodeops.c*/
    long C_getsysname;	/* afs_vnodeops.c*/
    long C_strcat;	/* afs_vnodeops.c*/
    long C_afs_lookup;	/* afs_vnodeops.c*/
    long C_afs_create;	/* afs_vnodeops.c*/
    long C_afs_LocalHero;	/* afs_vnodeops.c*/
    long C_FetchWholeEnchilada;	/* afs_vnodeops.c*/
    long C_afs_remove;	/* afs_vnodeops.c*/
    long C_afs_link;	/* afs_vnodeops.c*/
    long C_afs_rename;	/* afs_vnodeops.c*/
    long C_afs_InitReq;	/* afs_vnodeops.c*/
    long C_afs_mkdir;	/* afs_vnodeops.c*/
    long C_BlobScan;	/* afs_vnodeops.c*/
    long C_afs_rmdir;	/* afs_vnodeops.c*/
    long C_RecLen;	/* afs_vnodeops.c*/
    long C_RoundToInt;	/* afs_vnodeops.c*/
    long C_afs_readdir_with_offlist;	/* afs_vnodeops.c*/
    long C_DIRSIZ_LEN;	/* afs_vnodeops.c*/
    long C_afs_readdir_move;	/* afs_vnodeops.c*/
    long C_afs_readdir_iter;	/* afs_vnodeops.c*/
    long C_HandleFlock;	/* afs_vnodeops.c*/
    long C_afs_readdir;	/* afs_vnodeops.c*/
    long C_afs_symlink;	/* afs_vnodeops.c*/
    long C_afs_HandleLink;	/* afs_vnodeops.c*/
    long C_afs_MemHandleLink;	/* afs_vnodeops.c*/
    long C_afs_UFSHandleLink;	/* afs_vnodeops.c*/
    long C_afs_readlink;	/* afs_vnodeops.c*/
    long C_afs_fsync;	/* afs_vnodeops.c*/
    long C_afs_inactive;	/* afs_vnodeops.c*/
    long C_afs_ustrategy;	/* afs_vnodeops.c*/
    long C_afs_bread;	/* afs_vnodeops.c*/
    long C_afs_brelse;	/* afs_vnodeops.c*/
    long C_afs_bmap;	/* afs_vnodeops.c*/
    long C_afs_fid;	/* afs_vnodeops.c*/
    long C_afs_strategy;	/* afs_vnodeops.c*/
    long C_afs_FakeClose;	/* afs_vnodeops.c*/
    long C_afs_FakeOpen;	/* afs_vnodeops.c*/
    long C_afs_StoreOnLastReference;	/* afs_vnodeops.c*/
    long C_afs_GetAccessBits;	/* afs_vnodeops.c*/
    long C_afs_AccessOK;	/* afs_vnodeops.c*/
    long C_shutdown_vnodeops;	/* afs_vnodeops.c*/
    long C_afsio_copy;	/* afs_vnodeops.c*/
    long C_afsio_trim;	/* afs_vnodeops.c*/
    long C_afs_page_read;	/* afs_vnodeops.c*/
    long C_afs_page_write;	/* afs_vnodeops.c*/
    long C_afsio_skip;	/* afs_vnodeops.c*/
    long C_afs_read1dir;	/* afs_vnodeops.c*/
    long C_afs_get_groups_from_pag;	/* afs_vnodeops.c*/
    long C_afs_get_pag_from_groups;	/* afs_vnodeops.c*/
    long C_PagInCred;	/* afs_vnodeops.c*/
    long C_afs_getgroups;	/* afs_vnodeops.c*/
    long C_setpag;	/* afs_vnodeops.c*/
    long C_afs_setgroups;	/* afs_vnodeops.c*/
    long C_afs_page_in;	/* afs_vnodeops.c*/
    long C_afs_page_out;	/* afs_vnodeops.c*/
    long C_AddPag;	/* afs_vnodeops.c*/
    long C_afs_AdvanceFD;	/* afs_vnodeops.c*/
    long C_afs_lockf;	/* afs_vnodeops.c*/
    long C_afs_xsetgroups;	/* afs_vnodeops.c*/
    long C_afs_nlinks;	/* afs_vnodeops.c*/
    long C_DoLockWarning;	/* afs_vnodeops.c*/
    long C_afs_lockctl;	/* afs_vnodeops.c*/
    long C_afs_xflock;	/* afs_vnodeops.c*/
    long C_PSetSPrefs;	/* afs_pioctl.c*/
    long C_PGetSPrefs;	/* afs_pioctl.c*/
    long C_afs_warn;     /* afs_resource.c */
    long C_afs_warnuser; /* afs_resource.c */
    long C_afs_pagein;	/* afs_hp_subr.c*/
    long C_afs_pageout;	/* afs_hp_subr.c*/
    long C_afs_hp_strategy;	/* afs_hp_subr.c*/
};

struct afs_CMMeanStats {
    struct afs_MeanStats something; /* fill this in */
};

struct afs_CMStats {
    struct afs_CMCallStats callInfo;
    struct afs_CMMeanStats meanInfo;
};

/*
 * This is the structure accessible by specifying the
 * AFSCB_XSTATSCOLL_CALL_INFO collection to the xstat package.
 */
extern struct afs_CMStats afs_cmstats;

/*
 * Constants to track downtime durations:
 *	Bucket 0:           dur <= 10 min
 *	Bucket 1: 10 min  < dur <= 30 min
 *	Bucket 2: 30 min  < dur <= 1 hour
 *	Bucket 3: 1 hour  < dur <= 2 hours
 *	Bucket 4: 2 hours < dur <= 4 hours
 *	Bucket 5: 4 hours < dur <= 8 hours
 *	Bucket 6:           dur >= 8 hours
 */
#define AFS_STATS_NUM_DOWNTIME_DURATION_BUCKETS       7

#define AFS_STATS_MAX_DOWNTIME_DURATION_BUCKET0     600	/*10 minutes*/
#define AFS_STATS_MAX_DOWNTIME_DURATION_BUCKET1    1800	/*30 minutes*/
#define AFS_STATS_MAX_DOWNTIME_DURATION_BUCKET2    3600	/*60 minutes*/
#define AFS_STATS_MAX_DOWNTIME_DURATION_BUCKET3    7200	/*2 hours*/
#define AFS_STATS_MAX_DOWNTIME_DURATION_BUCKET4   14400	/*4 hours*/
#define AFS_STATS_MAX_DOWNTIME_DURATION_BUCKET5   28800	/*8 hours*/

/*
 * Constants to track downtime incidents:
 *	Bucket 0:            down  =  0 times
 *	Bucket 1:            down  =  1 time
 *	Bucket 2:  1 time  < down <=  5 times
 *	Bucket 3:  5 times < down <= 10 times
 *	Bucket 4: 10 times < down <= 50 times
 *	Bucket 5:            down >  50 times
 */
#define AFS_STATS_NUM_DOWNTIME_INCIDENTS_BUCKETS 6

#define AFS_STATS_MAX_DOWNTIME_INCIDENTS_BUCKET0   0
#define AFS_STATS_MAX_DOWNTIME_INCIDENTS_BUCKET1   1
#define AFS_STATS_MAX_DOWNTIME_INCIDENTS_BUCKET2   5
#define AFS_STATS_MAX_DOWNTIME_INCIDENTS_BUCKET3   10
#define AFS_STATS_MAX_DOWNTIME_INCIDENTS_BUCKET4   50

/*
 * Numbers used to track aggregate up/downtime stats for servers.  We'll
 * keep these numbers separately for FS and VL server records, and then
 * again separately for servers in the same cell as this client machine
 * and those outside the client's cell.
 */
struct afs_stats_SrvUpDownInfo {
    long numTtlRecords;		/*# records, active or inactive*/
    long numUpRecords;		/*# (active) records currently marked up*/
    long numDownRecords;	/*# (active) records currently marked down*/
    long sumOfRecordAges;	/*Sum of server record lifetimes*/
    long ageOfYoungestRecord;	/*Age of youngest server record*/
    long ageOfOldestRecord;	/*Age of oldest server record*/
    long numDowntimeIncidents;	/*Number of (completed) downtime incidents*/
    long numRecordsNeverDown;	/*Number of server records never marked down*/
    long maxDowntimesInARecord;	/*Max downtimes seen by any record*/
    long sumOfDowntimes;	/*Sum of all (completed) downtimes, in seconds*/
    long shortestDowntime;	/*Shortest downtime, in seconds*/
    long longestDowntime;	/*Longest downtime, in seconds*/
    /*
     * Arrays keeping distributions on downtime durations and number of
     * downtime incidents.
     */
    long downDurations[AFS_STATS_NUM_DOWNTIME_DURATION_BUCKETS];
    long downIncidents[AFS_STATS_NUM_DOWNTIME_INCIDENTS_BUCKETS];
};

/*
 * Define indices for the server up/downtime arrays below.
 */
#define AFS_STATS_UPDOWN_IDX_SAME_CELL 0
#define AFS_STATS_UPDOWN_IDX_DIFF_CELL 1

/*
 * Performance numbers for the Cache Manager.
 */
struct afs_stats_CMPerf {
    long numPerfCalls;		/*# of performance calls rcvd*/

    long epoch;			/*Cache Manager epoch time*/
    long numCellsVisible;	/*# cells we know about*/
    long numCellsContacted;	/*# cells corresponded with*/
    long dlocalAccesses;	/*# data accesses to files within cell*/
    long vlocalAccesses;	/*# stat accesses to files within cell*/
    long dremoteAccesses;	/*# data accesses to files outside of cell*/
    long vremoteAccesses;	/*# stat accesses to files outside of cell*/
    long cacheNumEntries;	/*# cache entries*/
    long cacheBlocksTotal;	/*# (1K) blocks configured for cache*/
    long cacheBlocksInUse;	/*# cache blocks actively in use*/
    long cacheBlocksOrig;	/*# cache blocks at bootup*/
    long cacheMaxDirtyChunks;	/*Max # dirty cache chunks tolerated*/
    long cacheCurrDirtyChunks;	/*Current # dirty cache chunks*/
    long dcacheHits;		/*# data files found in local cache*/
    long vcacheHits;		/*# stat entries found in local cache*/
    long dcacheMisses;		/*# data files NOT found in local cache*/
    long vcacheMisses;		/*# stat entries NOT found in local cache*/
    long cacheFlushes;		/*# files flushed from cache*/
    long cacheFilesReused;	/*# cache files reused*/
    long ProtServerAddr;	/*Addr of Protection Server used*/
    long vcacheXAllocs;		/* Additionally allocated vcaches */
    long dcacheXAllocs;		/* Additionally allocated dcaches */

    /*
     * Some stats related to our buffer package
     */
    long bufAlloced;		/* # of buffers allocated by afs */
    long bufHits;		/* # of pages found on buffer cache */
    long bufMisses;		/* # of pages NOT found on buffer cache */
    long bufFlushDirty;		/* # of cached dirty bufs flushed because all busy */
     
    /*
     * Stats that keep track of all allocated/used objects in CM
     */
    long LargeBlocksActive;	/* # of currently used large free pool entries */
    long LargeBlocksAlloced;	/* # of allocated large free pool entries */
    long SmallBlocksActive;	/* # of currently used small free pool entries */
    long SmallBlocksAlloced;	/* # of allocated used small free pool entries */
    long OutStandingMemUsage;	/* # of alloced memory */
    long OutStandingAllocs;	/* Outstanding osi_allocs (no osi_frees yet) */
    long CallBackAlloced;	/* # callback structures allocated */
    long CallBackFlushes;	/* # callback flush operations performed */

    /*
     * Accounting stats having to do with the server table & records.
     */
    long srvRecords;		/*# of servers currently on record*/
    long srvRecordsHWM;		/* Server record high water mark */
    long srvNumBuckets;		/* Num server hash chain buckets */
    long srvMaxChainLength;	/* Max server hash chain length */
    long srvMaxChainLengthHWM;	/* Server hash chain high water mark */

    /*
     * Stats having to do with the systype upon which the Cache Manager
     * is running.
     */
    long sysName_ID;		/*Sysname ID for host hardware*/

    /*
     * Stats recording downtime characteristics for each File Server and Volume
     * Location Server we've dealt with, both within the same cell and in
     * other cells.
     */
    struct afs_stats_SrvUpDownInfo fs_UpDown[2];
    struct afs_stats_SrvUpDownInfo vl_UpDown[2];

    unsigned long cbloops;
    /*
     * Spares for future expansion.
     */
    long spare[15];		/*Spares*/
};


/*
 * Values denoting the File Server and Cache Manager opcodes.
 */
#define AFS_STATS_FS_RPCIDX_FETCHDATA		 0
#define AFS_STATS_FS_RPCIDX_FETCHACL		 1
#define AFS_STATS_FS_RPCIDX_FETCHSTATUS		 2
#define AFS_STATS_FS_RPCIDX_STOREDATA		 3
#define AFS_STATS_FS_RPCIDX_STOREACL		 4
#define AFS_STATS_FS_RPCIDX_STORESTATUS		 5
#define AFS_STATS_FS_RPCIDX_REMOVEFILE		 6
#define AFS_STATS_FS_RPCIDX_CREATEFILE		 7
#define AFS_STATS_FS_RPCIDX_RENAME		 8
#define AFS_STATS_FS_RPCIDX_SYMLINK		 9
#define AFS_STATS_FS_RPCIDX_LINK		10
#define AFS_STATS_FS_RPCIDX_MAKEDIR		11
#define AFS_STATS_FS_RPCIDX_REMOVEDIR		12
#define AFS_STATS_FS_RPCIDX_SETLOCK		13
#define AFS_STATS_FS_RPCIDX_EXTENDLOCK		14
#define AFS_STATS_FS_RPCIDX_RELEASELOCK		15
#define AFS_STATS_FS_RPCIDX_GETSTATISTICS	16
#define AFS_STATS_FS_RPCIDX_GIVEUPCALLBACKS	17
#define AFS_STATS_FS_RPCIDX_GETVOLUMEINFO	18
#define AFS_STATS_FS_RPCIDX_GETVOLUMESTATUS	19
#define AFS_STATS_FS_RPCIDX_SETVOLUMESTATUS	20
#define AFS_STATS_FS_RPCIDX_GETROOTVOLUME	21
#define AFS_STATS_FS_RPCIDX_CHECKTOKEN		22
#define AFS_STATS_FS_RPCIDX_GETTIME		23
#define AFS_STATS_FS_RPCIDX_NGETVOLUMEINFO	24
#define AFS_STATS_FS_RPCIDX_BULKSTATUS		25
#define AFS_STATS_FS_RPCIDX_XSTATSVERSION	26
#define AFS_STATS_FS_RPCIDX_GETXSTATS		27

#define AFS_STATS_NUM_FS_RPC_OPS		28

#define AFS_STATS_FS_XFERIDX_FETCHDATA		 0
#define AFS_STATS_FS_XFERIDX_STOREDATA		 1

#define AFS_STATS_NUM_FS_XFER_OPS		 2

#define AFS_STATS_CM_RPCIDX_CALLBACK		 0
#define AFS_STATS_CM_RPCIDX_INITCALLBACKSTATE	 1
#define AFS_STATS_CM_RPCIDX_PROBE		 2
#define AFS_STATS_CM_RPCIDX_GETLOCK		 3
#define AFS_STATS_CM_RPCIDX_GETCE		 4
#define AFS_STATS_CM_RPCIDX_XSTATSVERSION	 5
#define AFS_STATS_CM_RPCIDX_GETXSTATS		 6

#define AFS_STATS_NUM_CM_RPC_OPS		 7


/*
 * Record to track timing numbers for each Cache Manager RPC operation.
 */
struct afs_stats_opTimingData {
    long numOps;			/*Number of operations executed*/
    long numSuccesses;			/*Number of successful ops*/
    struct timeval sumTime;		/*Sum of sample timings*/
    struct timeval sqrTime;             /*Sum of squares of sample timings */
    struct timeval minTime;		/*Minimum timing value observed*/
    struct timeval maxTime;		/*Minimum timing value observed*/
};

/*
 * We discriminate byte size transfers into this many buckets.
 */
#define AFS_STATS_NUM_XFER_BUCKETS       9

#define AFS_STATS_MAXBYTES_BUCKET0     128
#define AFS_STATS_MAXBYTES_BUCKET1    1024
#define AFS_STATS_MAXBYTES_BUCKET2    8192
#define AFS_STATS_MAXBYTES_BUCKET3   16384
#define AFS_STATS_MAXBYTES_BUCKET4   32768
#define AFS_STATS_MAXBYTES_BUCKET5  131072
#define AFS_STATS_MAXBYTES_BUCKET6  524288
#define AFS_STATS_MAXBYTES_BUCKET7 1048576

/*
 * Record to track timings and byte sizes for data transfers.
 */
struct afs_stats_xferData {
    long numXfers;			    /*Number of successful xfers*/
    long numSuccesses;			    /*Number of successful xfers*/
    struct timeval sumTime;		    /*Sum of timing values*/
    struct timeval sqrTime;                 /*Sum of squares of timing values */
    struct timeval minTime;		    /*Minimum xfer time recorded*/
    struct timeval maxTime;		    /*Maximum xfer time recorded*/
    long sumBytes;			    /*Sum of bytes transferred*/
    long minBytes;			    /*Minimum value observed*/
    long maxBytes;			    /*Maximum value observed*/
    long count[AFS_STATS_NUM_XFER_BUCKETS]; /*Tally for each range of bytes*/
};

/*
 * Macros to operate on time values.
 *
 * afs_stats_TimeLessThan(t1, t2)     Non-zero if t1 is less than t2
 * afs_stats_TimeGreaterThan(t1, t2)  Non-zero if t1 is greater than t2
 * afs_stats_GetDiff(t3, t1, t2)      Set t3 to the difference between
 *					t1 and t2 (t1 is less than or
 *					equal to t2).
 * afs_stats_AddTo(t1, t2)            Add t2 to t1
 * afs_stats_TimeAssign(t1, t2)	     Assign time t2 to t1
 * afs_stats_SquareAddTo(t1,t2)      Add square of t2 to t1
 */
#define afs_stats_TimeLessThan(t1, t2)        \
            ((t1.tv_sec  < t2.tv_sec)  ? 1 : \
	     (t1.tv_sec  > t2.tv_sec)  ? 0 : \
	     (t1.tv_usec < t2.tv_usec) ? 1 : \
	     0)

#define afs_stats_TimeGreaterThan(t1, t2)     \
            ((t1.tv_sec  > t2.tv_sec)  ? 1 : \
	     (t1.tv_sec  < t2.tv_sec)  ? 0 : \
	     (t1.tv_usec > t2.tv_usec) ? 1 : \
	     0)

#define afs_stats_GetDiff(t3, t1, t2)				\
{								\
    /*								\
     * If the microseconds of the later time are smaller than	\
     * the earlier time, set up for proper subtraction (doing	\
     * the carry).						\
     */								\
    if (t2.tv_usec < t1.tv_usec) {				\
	t2.tv_usec += 1000000;					\
	t2.tv_sec -= 1;						\
    }								\
    t3.tv_sec  = t2.tv_sec  - t1.tv_sec;			\
    t3.tv_usec = t2.tv_usec - t1.tv_usec;			\
}

#define afs_stats_AddTo(t1, t2)    \
{                                 \
    t1.tv_sec  += t2.tv_sec;      \
    t1.tv_usec += t2.tv_usec;     \
    if (t1.tv_usec > 1000000) {   \
	t1.tv_usec -= 1000000;    \
	t1.tv_sec++;              \
    }                             \
}

#define afs_stats_TimeAssign(t1, t2)	\
{					\
    t1.tv_sec = t2.tv_sec;		\
    t1.tv_usec = t2.tv_usec;		\
}

#define afs_stats_SquareAddTo(t1, t2)                     \
{                                                         \
    /*                                                    \
     *  We use some tricks here to avoid floating point arithmetic  \
     */                                                             \
   if(t2.tv_sec > 0 )                                               \
     {                                                                        \
       t1.tv_sec += t2.tv_sec * t2.tv_sec                                     \
                    +  t2.tv_sec * t2.tv_usec /1000000;                       \
       t1.tv_usec += (2 * t2.tv_sec * t2.tv_usec) % 1000000                   \
                     + (t2.tv_usec / 1000)*(t2.tv_usec / 1000)                \
                     + 2 * (t2.tv_usec / 1000) * (t2.tv_usec % 1000) / 1000;  \
     }                                                                        \
   else                                                                       \
     {                                                                        \
       t1.tv_usec += (t2.tv_usec / 1000)*(t2.tv_usec / 1000)                  \
                     + 2 * (t2.tv_usec / 1000) * (t2.tv_usec % 1000) / 1000;  \
     }                                                                        \
   if (t1.tv_usec > 1000000) {                                                \
        t1.tv_usec -= 1000000;                                                \
        t1.tv_sec++;                                                          \
   }                                                                          \
}




/*
 * Structure recording RPC outcomes.
 */
struct afs_stats_RPCErrors {
    long err_Server;			/*Server down error*/
    long err_Network;			/*Network error*/
    long err_Protection;		/*Protection violation*/
    long err_Volume;			/*Volume-related error*/
    long err_VolumeBusies;		/*"Volume busy conditions encountered*/
    long err_Other;			/*Misc other errors*/
};


/*
 * Structure holding RPC interface opcode measurements for the Cache Manager.
 */
struct afs_stats_RPCOpInfo {
    struct afs_stats_opTimingData
	fsRPCTimes[AFS_STATS_NUM_FS_RPC_OPS];	/*Individual FS RPC op timings*/
    struct afs_stats_RPCErrors
	fsRPCErrors[AFS_STATS_NUM_FS_RPC_OPS];	/*Individual FS RPC op errors*/
    struct afs_stats_xferData
	fsXferTimes[AFS_STATS_NUM_FS_XFER_OPS];	/*Individual FS RPC xfer timings*/
    struct afs_stats_opTimingData
	cmRPCTimes[AFS_STATS_NUM_CM_RPC_OPS];	/*Individual CM RPC op timings*/
};

/*
 * Structure holding authentication info for the CM.
 */
struct afs_stats_AuthentInfo {
    /*
     * This first set of fields don't have any history - they are simply
     * snapshots of the system at the time of the probe.
     */
    long curr_PAGs;		/*Current number of PAGs*/
    long curr_Records;		/*Current # of records in table*/
    long curr_AuthRecords;	/*Current # of authenticated
				  records (w/valid ticket)*/
    long curr_UnauthRecords;	/*Current # of unauthenticated
				  records (w/o any ticket at all)*/
    long curr_MaxRecordsInPAG;	/*Max records for a single PAG*/
    long curr_LongestChain;	/*Length of longest current hash chain*/

    /*
     * This second set of fields are values accumulated over the lifetme
     * of the current CM incarnation.
     */
    long PAGCreations;		/*# PAG creations*/
    long TicketUpdates;		/*# ticket additions/refreshes*/
    long HWM_PAGs;		/*High water mark - # PAGs*/
    long HWM_Records;		/* " - # records*/
    long HWM_MaxRecordsInPAG;	/* " - max records for a single PAG*/
    long HWM_LongestChain;	/* " - longest hash chain*/
};

/*
 * [Un]replicated file access.  These count the number of RXAFS_FetchData
 * calls get accomplished, and their need to call upon other replicas in
 * case of failure.
 */
struct afs_stats_AccessInfo {
    long unreplicatedRefs;		/*# references to unreplicated data*/
    long replicatedRefs;		/*# references to replicated data*/
    long numReplicasAccessed;		/*# replicas accessed*/
    long maxReplicasPerRef;		/*Max # replicas accessed per ref*/
    long refFirstReplicaOK;		/*# references satisfied by 1st replica*/
};

/*
 * Structure holding authoring info for the CM.  We keep track of
 * the results of writes on files and directories independently.
 * Results cover all objects in the cache uniformly.
 */
struct afs_stats_AuthorInfo {
    long fileSameAuthor;	/*File write by same author*/
    long fileDiffAuthor;	/*File write by diff author*/
    long dirSameAuthor;		/*Directory write by same author*/
    long dirDiffAuthor;		/*Directory write by diff author*/
};

/*
 * Structure holding ``full'' CM peformance measurements.
 */
struct afs_stats_CMFullPerf {
    long numFullPerfCalls;			/*Number of accesses*/
    struct afs_stats_CMPerf perf;		/*General performance stats*/
    struct afs_stats_RPCOpInfo rpc;		/*RPC op stats*/
    struct afs_stats_AuthentInfo authent;	/*Authentication stats*/
    struct afs_stats_AccessInfo accessinf;	/*Access stats*/
    struct afs_stats_AuthorInfo author;		/*Authorship stats*/
};

/*
 * These are the storage declarations for the structures accessible
 * via the xstat package.
 */
extern struct afs_stats_CMPerf afs_stats_cmperf;
extern struct afs_stats_CMFullPerf afs_stats_cmfullperf;

#ifndef AFS_NOSTATS
/*
 * We define routines to keep running counts and means.  For the
 * running count, we have to concatenate the ``C_'' prefix on to
 * the routine name passed in as an argument to get the right
 * field name.
 */
#if	defined(__STDC__) && !defined(__HIGHC__)
#define AFS_STATCNT(arg)  ((afs_cmstats.callInfo.C_ ## arg)++)
#else
#define AFS_STATCNT(arg)  ((afs_cmstats.callInfo.C_/**/arg)++)
#endif

#define AFS_MEANCNT(arg, value) \
    (afs_AddToMean(((afs_cmstats.meanInfo).(arg)),value))

#endif /* AFS_NOSTATS */
#endif /* __TRANSARC_AFS_STATS_H__ */
