windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/ftp/server/stats.hxx
2020-09-26 16:20:57 +08:00

243 lines
6.1 KiB
C++

/*++
Copyright (c) 1994 Microsoft Corporation
Module Name :
stats.hxx
Abstract:
Declares a class consisting of server statistics information.
( Multiple servers can make use of the same statistics
information by creating distinct server statistics object)
Author:
Murali R. Krishnan ( MuraliK ) 04-Nov-1994
Project:
Web Server DLL
Revision History:
Sophia Chung ( SophiaC ) 20-Nov-1996
--*/
# ifndef _STATS_HXX_
# define _STATS_HXX_
/************************************************************
* Include Headers
************************************************************/
# include "ftpd.h" // for definition of FTP_STATISTICS_0
# include "iperfctr.hxx" // standard macro defs for counters
/************************************************************
* Type Definitions
************************************************************/
# define IPFTP_STATS_INCR( ctrName) \
void Incr ## ctrName(void) \
{ \
IP_INCREMENT_COUNTER( m_FTPStats.ctrName); \
}
# define IPFTP_STATS_DECR( ctrName) \
void Decr ## ctrName(void) \
{ \
IP_DECREMENT_COUNTER( m_FTPStats.ctrName); \
}
# define IPFTP_STATS_QUERY( ctrName) \
LONG Query ## ctrName(void) \
{ \
return (IP_COUNTER_VALUE( m_FTPStats.ctrName)); \
}
//
// A counter inside the statistics block should use the following three
// macros for defining "query", "incr" and "decr" methods inside
// the statistics object
//
# define IPFTP_STATS_COUNTER( ctrName) \
IPFTP_STATS_INCR( ctrName); \
IPFTP_STATS_DECR( ctrName); \
IPFTP_STATS_QUERY( ctrName); \
class FTP_SERVER_STATISTICS {
private:
FTP_STATISTICS_0 m_FTPStats;
CRITICAL_SECTION m_csStatsLock; // to synchronize access among threads
IPFTP_STATS_INCR( CurrentAnonymousUsers);
IPFTP_STATS_INCR( CurrentNonAnonymousUsers);
void IncrCurrentConns( void)
{ IP_INCREMENT_COUNTER( m_FTPStats.CurrentConnections); }
public:
VOID LockStatistics( VOID) { EnterCriticalSection( &m_csStatsLock); }
VOID UnlockStatistics( VOID) { LeaveCriticalSection( &m_csStatsLock); }
FTP_SERVER_STATISTICS( VOID);
~FTP_SERVER_STATISTICS( VOID)
{ DeleteCriticalSection( &m_csStatsLock); };
VOID ClearStatistics( VOID);
LPFTP_STATISTICS_0 QueryStatsObj( VOID)
{ return &m_FTPStats; }
//
// copies statistics for RPC querying.
//
DWORD CopyToStatsBuffer( LPFTP_STATISTICS_0 lpStat );
void CheckAndSetMaxConnections( void );
void IncrCurrentConnections( void);
IPFTP_STATS_QUERY( CurrentConnections);
IPFTP_STATS_DECR( CurrentConnections);
IPFTP_STATS_COUNTER( LogonAttempts);
IPFTP_STATS_COUNTER( ConnectionAttempts);
IPFTP_STATS_COUNTER( TotalFilesSent );
IPFTP_STATS_COUNTER( TotalFilesReceived );
// Anonymous Users
void IncrAnonymousUsers( void);
IPFTP_STATS_DECR( CurrentAnonymousUsers);
IPFTP_STATS_COUNTER( TotalAnonymousUsers);
// Non Anonymous Users
void IncrNonAnonymousUsers( void);
IPFTP_STATS_DECR( CurrentNonAnonymousUsers);
IPFTP_STATS_COUNTER( TotalNonAnonymousUsers);
// Large integer updates
void UpdateTotalBytesSent( LONGLONG llBytes );
void UpdateTotalBytesReceived( LONGLONG llBytes );
// gets currenttime and stores it inside stats structure
void UpdateStartTime();
void UpdateStopTime();
}; // FTP_SERVER_STATISTICS
typedef FTP_SERVER_STATISTICS FAR * LPFTP_SERVER_STATISTICS;
/************************************************************
* Inline Methods
************************************************************/
inline void FTP_SERVER_STATISTICS::CheckAndSetMaxConnections(void)
{
# ifdef IP_ENABLE_COUNTERS
if ( m_FTPStats.CurrentConnections > m_FTPStats.MaxConnections ) {
LockStatistics();
if ( m_FTPStats.CurrentConnections > m_FTPStats.MaxConnections ) {
m_FTPStats.MaxConnections = m_FTPStats.CurrentConnections;
}
UnlockStatistics();
}
# endif
}
inline void FTP_SERVER_STATISTICS::IncrCurrentConnections(void)
{
# ifdef IP_ENABLE_COUNTERS
IncrCurrentConns();
CheckAndSetMaxConnections();
return;
# endif
} // FTP_SERVER_STATISTICS::IncrCurrentConnections()
inline void FTP_SERVER_STATISTICS::IncrAnonymousUsers( void)
{
# ifdef IP_ENABLE_COUNTERS
IncrTotalAnonymousUsers();
IncrCurrentAnonymousUsers();
if ( m_FTPStats.CurrentAnonymousUsers > m_FTPStats.MaxAnonymousUsers )
{
LockStatistics();
if ( m_FTPStats.CurrentAnonymousUsers > m_FTPStats.MaxAnonymousUsers )
{
m_FTPStats.MaxAnonymousUsers = m_FTPStats.CurrentAnonymousUsers;
}
UnlockStatistics();
}
return;
# endif
} // FTP_SERVER_STATISTICS::IncrAnonymousUsers()
inline void FTP_SERVER_STATISTICS::IncrNonAnonymousUsers( void)
{
# ifdef IP_ENABLE_COUNTERS
IncrTotalNonAnonymousUsers();
IncrCurrentNonAnonymousUsers();
if ( m_FTPStats.CurrentNonAnonymousUsers > m_FTPStats.MaxNonAnonymousUsers )
{
LockStatistics();
if ( m_FTPStats.CurrentNonAnonymousUsers >
m_FTPStats.MaxNonAnonymousUsers )
{
m_FTPStats.MaxNonAnonymousUsers =
m_FTPStats.CurrentNonAnonymousUsers;
}
UnlockStatistics();
}
return;
# endif
} // FTP_SERVER_STATISTICS::IncrNonAnonymousUsers()
inline void FTP_SERVER_STATISTICS::UpdateTotalBytesSent( LONGLONG llBytes )
{
# ifdef IP_ENABLE_COUNTERS
LockStatistics();
m_FTPStats.TotalBytesSent.QuadPart += llBytes;
UnlockStatistics();
# endif
}
inline void FTP_SERVER_STATISTICS::UpdateTotalBytesReceived( LONGLONG llBytes )
{
# ifdef IP_ENABLE_COUNTERS
LockStatistics();
m_FTPStats.TotalBytesReceived.QuadPart += llBytes;
UnlockStatistics();
# endif
}
# endif // _STATS_HXX_
/************************ End of File ***********************/