Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

300 lines
7.8 KiB

/*++
Copyright (c) 1994 Microsoft Corporation
Module Name :
stats.cxx
Abstract:
Defines functions required for server statistics
Author:
Murali R. Krishnan ( MuraliK ) 04-Nov-1994
Project:
Gopher Server DLL
Functions Exported:
SERVER_STATISTICS::SERVER_STATISTICS( VOID)
VOID SERVER_STATISTICS::ClearStatistics( VOID)
DWORD CopyToStatBuffer( LPGOPHERD_STATISTICS_INFO lpStat);
Revision History:
--*/
/************************************************************
* Include Headers
************************************************************/
# include "gdpriv.h"
# include "gdglobal.hxx"
# include "stats.hxx"
//
// size of half dword in bits
//
# define HALF_DWORD_SIZE ( sizeof(DWORD) * 8 / 2)
//
// To Avoid overflows I multiply using two parts
//
# define LargeIntegerToDouble( li) \
( ( ( 1 << HALF_DWORD_SIZE) * \
(( double) (li).HighPart) * ( 1 << HALF_DWORD_SIZE)) + \
((li).LowPart) \
)
/************************************************************
* Functions
************************************************************/
SERVER_STATISTICS::SERVER_STATISTICS( VOID)
/*++
Initializes statistics information for server.
--*/
{
InitializeCriticalSection( & m_csLock);
// Clear the Current* counters and call ClearStatistics() for others
m_CurrentAnonymousUsers = 0;
m_CurrentNonAnonymousUsers = 0;
ClearStatistics();
} // SERVER_STATISTICS::SERVER_STATISTICS();
VOID
SERVER_STATISTICS::ClearStatistics( VOID)
/*++
Clears the counters used for statistics information
We do not clear the Current* counters, since they reflect dynamic values.
--*/
{
Lock();
m_TotalBytesRecvd.HighPart = 0;
m_TotalBytesRecvd.LowPart = 0;
m_TotalBytesSent.HighPart = 0;
m_TotalBytesSent.LowPart = 0;
m_TotalFilesSent = 0;
m_TotalDirectoryListings = 0;
m_TotalSearches = 0;
m_GopherPlusRequests = 0;
m_MaxAnonymousUsers = 0;
m_MaxNonAnonymousUsers = 0;
m_TotalAnonymousUsers = 0;
m_TotalNonAnonymousUsers = 0;
m_ConnectionAttempts = 0;
m_LogonAttempts = 0;
m_AbortedConnections = 0;
m_ErroredConnections = 0;
m_TimeOfLastClear = GetTickCount();
Unlock();
} // SERVER_STATISTICS::ClearStatistics()
DWORD
SERVER_STATISTICS::CopyToStatBuffer( LPGOPHERD_STATISTICS_INFO lpStat)
/*++
Description:
copies the statistics data from the server statistcs structure
to the GOPHERD_STATISTICS_INFO structure for RPC access.
Arugments:
lpStat pointer to GOPHERD_STATISTICS_INFO object which
contains the data on successful return
Returns:
Win32 error codes. NO_ERROR on success.
--*/
{
ASSERT( lpStat != NULL);
Lock();
lpStat->TotalBytesSent = m_TotalBytesSent;
lpStat->TotalBytesRecvd = m_TotalBytesRecvd;
lpStat->TotalFilesSent = m_TotalFilesSent;
lpStat->TotalDirectoryListings = m_TotalDirectoryListings;
lpStat->TotalSearches = m_TotalSearches;
lpStat->GopherPlusRequests = m_GopherPlusRequests;
lpStat->CurrentAnonymousUsers = m_CurrentAnonymousUsers;
lpStat->CurrentNonAnonymousUsers = m_CurrentNonAnonymousUsers;
lpStat->MaxAnonymousUsers = m_MaxAnonymousUsers;
lpStat->MaxNonAnonymousUsers = m_MaxNonAnonymousUsers;
lpStat->TotalAnonymousUsers = m_TotalAnonymousUsers;
lpStat->TotalNonAnonymousUsers= m_TotalNonAnonymousUsers;
lpStat->ConnectionAttempts = m_ConnectionAttempts;
lpStat->AbortedAttempts = m_AbortedConnections;
lpStat->LogonAttempts = m_LogonAttempts;
lpStat->ErroredConnections = m_ErroredConnections;
lpStat->TimeOfLastClear = m_TimeOfLastClear;
// Is this useful?
Unlock();
lpStat->CurrentConnections =
g_pGserverConfig->GetCurrentConnectionsCount();
lpStat->MaxConnections =
g_pGserverConfig->GetMaxCurrentConnectionsCount();
lpStat->TotalConnections = (lpStat->ConnectionAttempts
- lpStat->AbortedAttempts);
return ( NO_ERROR);
} // CopyToStatBuffer()
# if DBG
VOID
SERVER_STATISTICS::Print( VOID)
/*++
temporarily prints statistics information to stdout.
( need to clean this output and redirect to proper files later)
--*/
{
DWORD dwCurrTicks;
DWORD msInterval; // interval from last clear to now
// in milliseconds
DWORD nHours;
DWORD nMinutes;
DWORD nSeconds;
double dSent;
double dRecvd;
IF_DEBUG( STATISTICS) {
DWORD cCurrConns = g_pGserverConfig->GetCurrentConnectionsCount();
DWORD cMaxConns = g_pGserverConfig->GetMaxCurrentConnectionsCount();
Lock();
dwCurrTicks = GetTickCount();
DBGPRINTF( ( DBG_CONTEXT, "\nPrinting Statistics Information\n"));
DBGPRINTF( ( DBG_CONTEXT,
" AnonUsers Total = %d\t Current = %d\t Max = %d\n",
m_TotalAnonymousUsers,
m_CurrentAnonymousUsers,
m_MaxAnonymousUsers));
DBGPRINTF( ( DBG_CONTEXT,
" NonAnon Total = %d\t Current = %d\t Max = %d\n",
m_TotalNonAnonymousUsers,
m_CurrentNonAnonymousUsers,
m_MaxNonAnonymousUsers));
DBGPRINTF( ( DBG_CONTEXT,
" Connections Total = %d\t Current = %d\t Max = %d\n",
m_ConnectionAttempts,
cCurrConns,
cMaxConns));
DBGPRINTF( ( DBG_CONTEXT, " Logon Attempts = %d\n",
m_LogonAttempts));
DBGPRINTF( ( DBG_CONTEXT, " Aborted Conns = %d\n",
m_AbortedConnections));
DBGPRINTF( ( DBG_CONTEXT, " Errored Conns = %d\n",
m_ErroredConnections));
DBGPRINTF( ( DBG_CONTEXT,
" Files Sent = %d\n"
" Directory Sent = %d\n"
" Searches Performed= %d\n"
" Gopher Plus Requests = %d\n",
m_TotalFilesSent,
m_TotalDirectoryListings,
m_TotalSearches,
m_GopherPlusRequests ));
dRecvd = LargeIntegerToDouble( m_TotalBytesRecvd);
dSent = LargeIntegerToDouble( m_TotalBytesSent);
Unlock();
msInterval = dwCurrTicks - m_TimeOfLastClear;
nHours = msInterval/ ( 3600 * 1000);
nMinutes = msInterval/ ( 60*1000) - nHours*60;
nSeconds = msInterval/1000 - nMinutes * 60 - nHours * 3600;
DBGPRINTF( ( DBG_CONTEXT, " Interval = %d:%d:%d.%d\n",
nHours,
nMinutes,
nSeconds,
msInterval % 1000 ));
DBGPRINTF( ( DBG_CONTEXT, " Bytes Recvd = %20.3f KBytes\n",
dRecvd/1000));
DBGPRINTF( ( DBG_CONTEXT, " Bytes Recvd = %20.3g KB/second\n",
dRecvd/ msInterval));
DBGPRINTF( ( DBG_CONTEXT, " Bytes Sent = %20.3f KBytes\n",
dSent/1000));
DBGPRINTF( ( DBG_CONTEXT, " Bytes Sent = %20.3g KB/second\n\n",
dSent/msInterval));
} // DEBUG_IF( STATISTICS)
return;
} // SERVER_STATISTICS::Print()
# endif // DBG
/************************ End of File ***********************/