645 lines
13 KiB
C++
645 lines
13 KiB
C++
/*++
|
||
|
||
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();
|
||
}
|
||
|