blob: ad778b900124c3711fb35a412e70b677217f5489 [file]
/* **********************************************************
* Copyright (c) 2007-2008 VMware, Inc. All rights reserved.
* **********************************************************/
/*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of VMware, Inc. nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/
/* Copyright (c) 2003-2007 Determina Corp. */
/* Copyright (c) 2002-2003 Massachusetts Institute of Technology */
/* Copyright (c) 2002 Hewlett-Packard Company */
// LoggingDlg.cpp : implementation file
//
#ifndef DRSTATS_DEMO /* around whole file */
#include "stdafx.h"
#include "DynamoRIO.h"
#include "LoggingDlg.h"
#include <assert.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// FIXME: duplicate information with utils.h...
enum {
LOG_NONE = 0,
LOG_STATS,
LOG_TOP,
LOG_THREADS,
LOG_SYSCALLS,
LOG_ASYNCH,
LOG_INTERP,
LOG_EMIT,
LOG_LINKS,
LOG_CACHE,
LOG_FRAGMENT,
LOG_DISPATCH,
LOG_MONITOR,
LOG_HEAP,
LOG_VMAREAS,
LOG_ALL,
};
static const int checkboxes[] = {
IDC_LOG_NONE,
IDC_LOG_STATS,
IDC_LOG_TOP,
IDC_LOG_THREADS,
IDC_LOG_SYSCALLS,
IDC_LOG_ASYNCH,
IDC_LOG_INTERP,
IDC_LOG_EMIT,
IDC_LOG_LINKS,
IDC_LOG_CACHE,
IDC_LOG_FRAGMENT,
IDC_LOG_DISPATCH,
IDC_LOG_MONITOR,
IDC_LOG_HEAP,
IDC_LOG_VMAREAS,
IDC_LOG_ALL,
};
static const int masks[] = {
0x00000000, // LOG_NONE
0x00000001, // LOG_STATS
0x00000002, // LOG_TOP
0x00000004, // LOG_THREADS
0x00000008, // LOG_SYSCALLS
0x00000010, // LOG_ASYNCH
0x00000020, // LOG_INTERP
0x00000040, // LOG_EMIT
0x00000080, // LOG_LINKS
0x00000100, // LOG_CACHE
0x00000200, // LOG_FRAGMENT
0x00000400, // LOG_DISPATCH
0x00000800, // LOG_MONITOR
0x00001000, // LOG_HEAP
0x00002000, // LOG_VMAREAS
0x00003fff, // LOG_ALL
};
static const int num_options = sizeof(checkboxes) / sizeof(int);
/////////////////////////////////////////////////////////////////////////////
// CLoggingDlg dialog
CLoggingDlg::CLoggingDlg(CWnd* pParent /*=NULL*/)
: CDialog(CLoggingDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CLoggingDlg)
m_Mask = _T("3FFF");
//}}AFX_DATA_INIT
m_Level = 1;
}
CLoggingDlg::CLoggingDlg(int level, int mask, CWnd* pParent /*=NULL*/)
: CDialog(CLoggingDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CLoggingDlg)
//}}AFX_DATA_INIT
if ((mask & 0xcfff0000) != 0) {
::MessageBox(NULL, _T("Mask must be between 0x0000 and 0x3fff"),
_T("Warning"), MB_OK | MYMBFLAGS);
mask = 0x3fff;
}
m_Mask.Format(_T("%04X"), mask);
m_Level = level;
}
void CLoggingDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLoggingDlg)
DDX_Control(pDX, IDOK, m_OKButton);
DDX_Control(pDX, IDC_VERBOSITY, m_Verbosity);
DDX_Text(pDX, IDC_EDIT_MASK, m_Mask);
DDV_MaxChars(pDX, m_Mask, 4);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CLoggingDlg, CDialog)
//{{AFX_MSG_MAP(CLoggingDlg)
ON_EN_CHANGE(IDC_EDIT_MASK, OnChangeEditMask)
ON_BN_CLICKED(IDC_LOG_ALL, OnLogAll)
ON_BN_CLICKED(IDC_LOG_VMAREAS, OnLogVmareas)
ON_BN_CLICKED(IDC_LOG_ASYNCH, OnLogAsynch)
ON_BN_CLICKED(IDC_LOG_CACHE, OnLogCache)
ON_BN_CLICKED(IDC_LOG_DISPATCH, OnLogDispatch)
ON_BN_CLICKED(IDC_LOG_EMIT, OnLogEmit)
ON_BN_CLICKED(IDC_LOG_FRAGMENT, OnLogFragment)
ON_BN_CLICKED(IDC_LOG_HEAP, OnLogHeap)
ON_BN_CLICKED(IDC_LOG_INTERP, OnLogInterp)
ON_BN_CLICKED(IDC_LOG_LINKS, OnLogLinks)
ON_BN_CLICKED(IDC_LOG_MONITOR, OnLogMonitor)
ON_BN_CLICKED(IDC_LOG_STATS, OnLogStats)
ON_BN_CLICKED(IDC_LOG_SYSCALLS, OnLogSyscalls)
ON_BN_CLICKED(IDC_LOG_THREADS, OnLogThreads)
ON_BN_CLICKED(IDC_LOG_TOP, OnLogTop)
ON_BN_CLICKED(IDC_LOG_NONE, OnLogNone)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLoggingDlg message handlers
BOOL CLoggingDlg::OnInitDialog()
{
CDialog::OnInitDialog();
VerifyMaskString();
m_Verbosity.SetCurSel(m_Level);
return TRUE;
}
// returns -1 on error
int CLoggingDlg::GetMaskValue()
{
UpdateData(TRUE); // get values from controls
if (m_Mask.IsEmpty())
return 0;
int mask;
int res = _stscanf(m_Mask, _T("%X"), &mask);
// sscanf will return 3 and success on "3ugh", so manually scan it
if (!_istxdigit(m_Mask.GetAt(0)) ||
(m_Mask.GetLength() > 1 && !_istxdigit(m_Mask.GetAt(1))) ||
(m_Mask.GetLength() > 2 && !_istxdigit(m_Mask.GetAt(2))) ||
(m_Mask.GetLength() > 3 && !_istxdigit(m_Mask.GetAt(3)))) {
return -1;
}
if (res <= 0 || res == EOF)
return -1;
else
return mask;
}
BOOL CLoggingDlg::SetMaskValue(int mask)
{
m_Mask.Format(_T("%04X"), mask);
UpdateData(FALSE); // write values to controls
return TRUE;
}
void CLoggingDlg::VerifyMaskString()
{
int mask = GetMaskValue();
if (mask == -1)
mask = 0;
int i;
for (i=1; i<num_options-1; i++) { // skip ALL and NONE
CButton *button = (CButton *) GetDlgItem(checkboxes[i]);
assert(button != NULL);
if ((mask & masks[i]) != 0) {
if (button->GetCheck() == 0)
button->SetCheck(1);
} else {
if (button->GetCheck() != 0)
button->SetCheck(0);
}
}
}
void CLoggingDlg::OnChangeEditMask()
{
UpdateData(TRUE); // get values from controls
int mask = GetMaskValue();
if (mask < 0 || mask > masks[LOG_ALL]) {
m_OKButton.EnableWindow(FALSE);
} else {
m_OKButton.EnableWindow(TRUE);
VerifyMaskString();
}
}
void CLoggingDlg::CheckboxChange(int id)
{
CButton *button = (CButton *) GetDlgItem(checkboxes[id]);
assert(button != NULL);
int mask = GetMaskValue();
if (mask == -1) {
// don't allow checkbox change
button->SetCheck(1 - button->GetCheck());
return;
}
if (button->GetCheck() > 0) {
mask |= masks[id];
} else {
mask &= ~(masks[id]);
}
SetMaskValue(mask);
}
void CLoggingDlg::OnLogVmareas() { CheckboxChange(LOG_VMAREAS); }
void CLoggingDlg::OnLogAsynch() { CheckboxChange(LOG_ASYNCH); }
void CLoggingDlg::OnLogCache() { CheckboxChange(LOG_CACHE); }
void CLoggingDlg::OnLogDispatch() { CheckboxChange(LOG_DISPATCH); }
void CLoggingDlg::OnLogEmit() { CheckboxChange(LOG_EMIT); }
void CLoggingDlg::OnLogFragment() { CheckboxChange(LOG_FRAGMENT); }
void CLoggingDlg::OnLogHeap() { CheckboxChange(LOG_HEAP); }
void CLoggingDlg::OnLogInterp() { CheckboxChange(LOG_INTERP); }
void CLoggingDlg::OnLogLinks() { CheckboxChange(LOG_LINKS); }
void CLoggingDlg::OnLogMonitor() { CheckboxChange(LOG_MONITOR); }
void CLoggingDlg::OnLogStats() { CheckboxChange(LOG_STATS); }
void CLoggingDlg::OnLogSyscalls() { CheckboxChange(LOG_SYSCALLS); }
void CLoggingDlg::OnLogThreads() { CheckboxChange(LOG_THREADS); }
void CLoggingDlg::OnLogTop() { CheckboxChange(LOG_TOP); }
void CLoggingDlg::OnLogAll() {
SetMaskValue(masks[LOG_ALL]);
VerifyMaskString();
m_OKButton.EnableWindow(TRUE);
}
void CLoggingDlg::OnLogNone() {
SetMaskValue(masks[LOG_NONE]);
VerifyMaskString();
m_OKButton.EnableWindow(TRUE);
}
int CLoggingDlg::GetLevel()
{
return final_level;
}
int CLoggingDlg::GetMask()
{
return final_mask;
}
void CLoggingDlg::OnOK()
{
UpdateData(TRUE); // get values from controls
final_mask = GetMaskValue();
if (final_mask == -1)
final_mask = 0;
final_level = m_Verbosity.GetCurSel();
CDialog::OnOK();
}
#endif /* !DRSTATS_DEMO */ /* around whole file */