2025-04-27 07:49:33 -04:00

645 lines
13 KiB
C++
Raw Blame History

/*++
Copyright (c) 1994-1998 Microsoft Corporation
Module Name :
perform.cpp
Abstract:
WWW Performance Property Page
Author:
Ronald Meijer (ronaldm)
Project:
Internet Services Manager
Revision History:
--*/
//
// Include Files
//
#include "stdafx.h"
#include "w3scfg.h"
#include "perform.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
//
// WWW Performance Property Page
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
IMPLEMENT_DYNCREATE(CW3PerfPage, CInetPropertyPage)
/* static */
void
CW3PerfPage::ParseMaxNetworkUse(
IN CILong & nMaxNetworkUse,
OUT CILong & nVisibleMaxNetworkUse,
OUT BOOL & fLimitNetworkUse
)
/*++
Routine Description:
Break out max network use function
Arguments:
CILong & nMaxNetworkUse : Maximum network value from metabase
CILong & nVisibleMaxNetworkUse : Max network use to go in the edit box.
BOOL & fLimitMaxNetworkUse : TRUE if max network is not infinite
Return Value
None
--*/
{
//
// Special case: If nMaxNetworkUse is 0(an invalid value), the
// value likely could not be inherited from the root (the user
// is an operator and can't see the properties there). Adjust
// the value to a possibly misleading value.
//
if (nMaxNetworkUse == 0L)
{
TRACEEOLID("Adjusting invalid bandwidth throttling value -- "
"are you an operator?");
nMaxNetworkUse = INFINITE_BANDWIDTH;
}
fLimitNetworkUse = (nMaxNetworkUse != INFINITE_BANDWIDTH);
nVisibleMaxNetworkUse = fLimitNetworkUse
? (nMaxNetworkUse / KILOBYTE)
: (DEF_BANDWIDTH / KILOBYTE);
}
CW3PerfPage::CW3PerfPage(
IN CInetPropertySheet * pSheet
)
/*++
Routine Description:
Constructor
Arguments:
CInetPropertySheet * pSheet : Sheet object
Return Value:
N/A
--*/
: CInetPropertyPage(CW3PerfPage::IDD, pSheet)
{
#ifdef _DEBUG
afxMemDF |= checkAlwaysMemDF;
#endif // _DEBUG
//
// Default value
//
#if 0 // Keep ClassWizard Happy
//{{AFX_DATA_INIT(CW3PerfPage)
m_dwCPUPercentage = 0;
m_fEnableCPUAccounting = FALSE;
m_fEnforceLimits = TRUE;
//}}AFX_DATA_INIT
m_nServerSize = 0L;
m_nMaxNetworkUse = INFINITE_BANDWIDTH;
m_nVisibleMaxNetworkUse = DEF_BANDWIDTH;
#endif // 0
}
CW3PerfPage::~CW3PerfPage()
/*++
Routine Description:
Destructor
Arguments:
N/A
Return Value:
N/A
--*/
{
}
void
CW3PerfPage::DoDataExchange(
IN CDataExchange * pDX
)
/*++
Routine Description:
Initialise/Store control data
Arguments:
CDataExchange * pDX - DDX/DDV control structure
Return Value:
None
--*/
{
CInetPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CW3PerfPage)
DDX_Check(pDX, IDC_CHECK_ENABLE_CPU_ACCOUNTING, m_fEnableCPUAccounting);
DDX_Check(pDX, IDC_CHECK_ENFORCE_LIMITS, m_fEnforceLimits);
DDX_Check(pDX, IDC_CHECK_LIMIT_NETWORK_USE, m_fLimitNetworkUse);
DDX_Control(pDX, IDC_EDIT_MAX_NETWORK_USE, m_edit_MaxNetworkUse);
DDX_Control(pDX, IDC_EDIT_CPU, m_edit_CPUPercentage);
DDX_Control(pDX, IDC_CHECK_LOG_EVENT_ONLY, m_check_LogEventOnly);
DDX_Control(pDX, IDC_CHECK_LIMIT_NETWORK_USE, m_check_LimitNetworkUse);
DDX_Control(pDX, IDC_CHECK_ENABLE_CPU_ACCOUNTING, m_check_EnableCPUAccounting);
DDX_Control(pDX, IDC_STATIC_MAX_NETWORK_USE, m_static_MaxNetworkUse);
DDX_Control(pDX, IDC_STATIC_KBS, m_static_KBS);
DDX_Control(pDX, IDC_STATIC_THROTTLING, m_static_Throttling);
DDX_Control(pDX, IDC_STATIC_PERCENT, m_static_Percent);
DDX_Control(pDX, IDC_STATIC_CPU_PROMPT, m_static_CPU_Prompt);
DDX_Control(pDX, IDC_SLIDER_PERFORMANCE_TUNING, m_sld_PerformanceTuner);
//}}AFX_DATA_MAP
if (m_edit_CPUPercentage.IsWindowEnabled() && HasCPUThrottling())
{
DDX_Text(pDX, IDC_EDIT_CPU, m_dwCPUPercentage);
DDV_MinMaxDWord(pDX, m_dwCPUPercentage, 0, 100);
}
if (!pDX->m_bSaveAndValidate || m_fLimitNetworkUse)
{
DDX_Text(pDX, IDC_EDIT_MAX_NETWORK_USE, m_nVisibleMaxNetworkUse);
DDV_MinMaxLong(pDX, m_nVisibleMaxNetworkUse, 1, UD_MAXVAL);
}
if (pDX->m_bSaveAndValidate)
{
m_nServerSize = m_sld_PerformanceTuner.GetPos();
}
else
{
m_sld_PerformanceTuner.SetRange(MD_SERVER_SIZE_SMALL, MD_SERVER_SIZE_LARGE);
m_sld_PerformanceTuner.SetPos(m_nServerSize);
}
}
//
// Message Map
//
BEGIN_MESSAGE_MAP(CW3PerfPage, CInetPropertyPage)
//{{AFX_MSG_MAP(CW3PerfPage)
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_BN_CLICKED(IDC_CHECK_ENABLE_CPU_ACCOUNTING, OnCheckEnableCpuAccounting)
ON_BN_CLICKED(IDC_CHECK_LIMIT_NETWORK_USE, OnCheckLimitNetworkUse)
//}}AFX_MSG_MAP
ON_EN_CHANGE(IDC_EDIT_MAX_NETWORK_USE, OnItemChanged)
ON_EN_CHANGE(IDC_EDIT_CPU, OnItemChanged)
ON_BN_CLICKED(IDC_CHECK_LOG_EVENT_ONLY, OnItemChanged)
END_MESSAGE_MAP()
BOOL
CW3PerfPage::SetControlStates()
/*++
Routine Description:
Set control states depending on contents of the dialog
Arguments:
None
Return Value:
TRUE if the 'limit network use' is on.
--*/
{
BOOL fLimitOn = m_check_LimitNetworkUse.GetCheck() > 0
&& HasBwThrottling()
&& HasAdminAccess();
m_static_MaxNetworkUse.EnableWindow(fLimitOn);
m_edit_MaxNetworkUse.EnableWindow(fLimitOn);
m_static_KBS.EnableWindow(fLimitOn);
m_static_Throttling.EnableWindow(fLimitOn);
BOOL fCPULimitOn = m_fEnableCPUAccounting
&& HasAdminAccess()
&& HasCPUThrottling();
m_edit_CPUPercentage.EnableWindow(fCPULimitOn);
m_check_LogEventOnly.EnableWindow(fCPULimitOn);
m_static_Percent.EnableWindow(fCPULimitOn);
m_static_CPU_Prompt.EnableWindow(fCPULimitOn);
return fLimitOn;
}
/* virtual */
HRESULT
CW3PerfPage::FetchLoadedValues()
/*++
Routine Description:
Move configuration data from sheet to dialog controls
Arguments:
None
Return Value:
HRESULT
--*/
{
CError err;
BEGIN_META_INST_READ(CW3Sheet)
FETCH_INST_DATA_FROM_SHEET(m_nServerSize);
FETCH_INST_DATA_FROM_SHEET(m_nMaxNetworkUse);
FETCH_INST_DATA_FROM_SHEET(m_fEnableCPUAccounting);
FETCH_INST_DATA_FROM_SHEET(m_dwCPULimitLogEventRaw);
FETCH_INST_DATA_FROM_SHEET(m_dwCPULimitPriorityRaw);
FETCH_INST_DATA_FROM_SHEET(m_dwCPULimitPauseRaw);
FETCH_INST_DATA_FROM_SHEET(m_dwCPULimitProcStopRaw);
ParseMaxNetworkUse(
m_nMaxNetworkUse,
m_nVisibleMaxNetworkUse,
m_fLimitNetworkUse
);
if (m_dwCPULimitLogEventRaw == INFINITE_CPU_RAW)
{
//
// Set default value
//
m_dwCPUPercentage = DEFAULT_CPU_PERCENTAGE;
}
else
{
m_dwCPUPercentage = m_dwCPULimitLogEventRaw / CPU_THROTTLING_FACTOR;
}
m_fEnforceLimits = m_dwCPULimitPriorityRaw != 0L
|| m_dwCPULimitPauseRaw != 0L
|| m_dwCPULimitProcStopRaw != 0L;
END_META_INST_READ(err)
return err;
}
/* virtual */
HRESULT
CW3PerfPage::SaveInfo()
/*++
Routine Description:
Save the information on this property page
Arguments:
None
Return Value:
Error return code
--*/
{
ASSERT(IsDirty());
TRACEEOLID("Saving W3 performance page now...");
CError err;
BuildMaxNetworkUse(
m_nMaxNetworkUse,
m_nVisibleMaxNetworkUse,
m_fLimitNetworkUse
);
m_dwCPULimitLogEventRaw = m_fEnableCPUAccounting
? m_dwCPUPercentage * CPU_THROTTLING_FACTOR
: INFINITE_CPU_RAW;
if (m_fEnforceLimits)
{
m_dwCPULimitPauseRaw = 0L;
m_dwCPULimitPriorityRaw = m_dwCPULimitLogEventRaw * 3L / 2L;
m_dwCPULimitProcStopRaw = m_dwCPULimitLogEventRaw * 2L;
}
else
{
m_dwCPULimitPriorityRaw = m_dwCPULimitPauseRaw
= m_dwCPULimitProcStopRaw = 0L;
}
BeginWaitCursor();
BEGIN_META_INST_WRITE(CW3Sheet)
STORE_INST_DATA_ON_SHEET(m_nServerSize);
STORE_INST_DATA_ON_SHEET(m_nMaxNetworkUse);
STORE_INST_DATA_ON_SHEET(m_fEnableCPUAccounting);
STORE_INST_DATA_ON_SHEET(m_dwCPULimitLogEventRaw);
STORE_INST_DATA_ON_SHEET(m_dwCPULimitPriorityRaw);
STORE_INST_DATA_ON_SHEET(m_dwCPULimitPauseRaw);
STORE_INST_DATA_ON_SHEET(m_dwCPULimitProcStopRaw);
END_META_INST_WRITE(err)
EndWaitCursor();
return err;
}
//
// Message Handlers
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
BOOL
CW3PerfPage::OnSetActive()
/*++
Routine Description:
Handle page activation
Arguments:
None
Return Value:
TRUE if the page activation was successful,
FALSE otherwise.
--*/
{
return CInetPropertyPage::OnSetActive();
}
void
CW3PerfPage::OnItemChanged()
/*++
Routine Description:
All EN_CHANGE and BN_CLICKED messages map to this function
Arguments:
None
Return Value:
None
--*/
{
SetControlStates();
SetModified(TRUE);
}
void
CW3PerfPage::OnCheckLimitNetworkUse()
/*++
Routine Description:
The "limit network use" checkbox has been clicked
Enable/disable the "max network use" controls.
Arguments:
None
Return Value:
None
--*/
{
if (SetControlStates())
{
m_edit_MaxNetworkUse.SetSel(0, -1);
m_edit_MaxNetworkUse.SetFocus();
}
OnItemChanged();
}
void
CW3PerfPage::OnCheckEnableCpuAccounting()
/*++
Routine Description:
'Enable CPU Accounting' checkbox hander.
Arguments:
None
Return Value:
None
--*/
{
m_fEnableCPUAccounting = !m_fEnableCPUAccounting;
OnItemChanged();
if (m_fEnableCPUAccounting)
{
m_edit_CPUPercentage.SetSel(0, -1);
m_edit_CPUPercentage.SetFocus();
}
}
BOOL
CW3PerfPage::OnInitDialog()
/*++
Routine Description:
WM_INITDIALOG handler. Initialize the dialog.
Arguments:
None.
Return Value:
TRUE if no focus is to be set automatically, FALSE if the focus
is already set.
--*/
{
CInetPropertyPage::OnInitDialog();
//
// Disable some settings based on what's possible
//
m_check_LimitNetworkUse.EnableWindow(
!IsMasterInstance()
&& HasBwThrottling()
&& HasAdminAccess()
);
m_check_EnableCPUAccounting.EnableWindow(
HasCPUThrottling()
&& HasAdminAccess()
);
SetControlStates();
return TRUE;
}
void
CW3PerfPage::OnHScroll(
IN UINT nSBCode,
IN UINT nPos,
IN CScrollBar * pScrollBar
)
/*++
Routine Description:
Respond to horizontal scroll message
Arguments
UINT nSBCode Specifies a scroll-bar code that indicates the user<65>s
scrolling request.
UINT nPos Specifies the scroll-box position if the scroll-bar code
is SB_THUMBPOSITION or SB_THUMBTRACK; otherwise, not used.
Depending on the initial scroll range, nPos may be negative
and should be cast to an int if necessary.
pScrollBar If the scroll message came from a scroll-bar control,
contains a pointer to the control. If the user clicked a
window<6F>s scroll bar, this parameter is NULL. The pointer
may be temporary and should not be stored for later use.
Return Value:
None
--*/
{
//
// Track slider notifications
//
CInetPropertyPage::OnHScroll(nSBCode, nPos, pScrollBar);
OnItemChanged();
}
void
CW3PerfPage::OnVScroll(
IN UINT nSBCode,
IN UINT nPos,
IN CScrollBar * pScrollBar
)
/*++
Routine Description:
Respond to vertical scroll message
Arguments
UINT nSBCode Specifies a scroll-bar code that indicates the user<65>s
scrolling request.
UINT nPos Specifies the scroll-box position if the scroll-bar code
is SB_THUMBPOSITION or SB_THUMBTRACK; otherwise, not used.
Depending on the initial scroll range, nPos may be negative
and should be cast to an int if necessary.
pScrollBar If the scroll message came from a scroll-bar control,
contains a pointer to the control. If the user clicked a
window<6F>s scroll bar, this parameter is NULL. The pointer
may be temporary and should not be stored for later use.
Return Value:
None
--*/
{
//
// Track slider notifications
//
CInetPropertyPage::OnVScroll(nSBCode, nPos, pScrollBar);
OnItemChanged();
}