Leaked source code of windows server 2003
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.
|
|
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-1997 Microsoft Corporation
//
// Module Name:
// Barf.h
//
// Abstract:
// Definition of the Basic Artifical Resource Failure classes.
// BARF allows API call failures to be simulated automatically to
// ensure full code test coverage.
//
// Implementation File:
// Barf.cpp
//
// Author:
// David Potter (davidp) April 11, 1997
//
// Revision History:
//
// Notes:
// This file compiles only in _DEBUG mode.
//
// To implement a new BARF type, declare a global instance of CBarf:
// CBarf g_barfMyApi(_T("My API"));
//
// To bring up the BARF dialog:
// DoBarfDialog();
// This brings up a modeless dialog with the BARF settings.
//
// A few functions are provided for special circumstances.
// Usage of these should be fairly limited:
// BarfAll(void); Top Secret -> NYI.
// EnableBarf(BOOL); Allows you to disable/reenable BARF.
// FailOnNextBarf; Force the next failable call to fail.
//
// NOTE: Your code calls the standard APIs (e.g. LoadIcon) and the
// BARF files do the rest.
//
/////////////////////////////////////////////////////////////////////////////
#ifndef _BARF_H_
#define _BARF_H_
// Only process the rest of this file if BARF is to be implemented in the
// including module.
//#ifndef _NO_BARF_DEFINITIONS_
//#define _USING_BARF_
/////////////////////////////////////////////////////////////////////////////
// Forward Class Declarations
/////////////////////////////////////////////////////////////////////////////
class CBarf; class CBarfSuspend;
/////////////////////////////////////////////////////////////////////////////
// External Class Declarations
/////////////////////////////////////////////////////////////////////////////
class CTraceTag;
/////////////////////////////////////////////////////////////////////////////
// Type Definitions
/////////////////////////////////////////////////////////////////////////////
#define BARF_REG_SECTION _T("Debug\\BARF")
#define BARF_REG_SECTION_FMT BARF_REG_SECTION _T("\\%s")
/////////////////////////////////////////////////////////////////////////////
// Include Files
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//
// CBarf
//
// Purpose:
// Basic Artificial Resource Failure class. Contains the BARF
// information for a class of calls
//
// The constructor initializes a bunch of parameters. CBarfDialog
// (a friend class) adjusts the various flags. The only public API
// is FFail(). This method determines if the next call should generate
// an artificial failure or not.
//
/////////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
typedef void (*PFNBARFPOSTUPDATE)(void);
class CBarf : public CObject { friend class CBarfSuspend; friend class CBarfDialog; friend void InitBarf(void); friend void CleanupBarf(void); friend void EnableBarf(BOOL); friend void BarfAll(void); friend void DoBarfDialog(void);
public: CBarf(IN LPCTSTR pszName);
protected: void Init(void);
// Attributes
protected: LPCTSTR m_pszName;
BOOL m_bDisabled; BOOL m_bContinuous; DWORD m_nFail; DWORD m_nCurrent; DWORD m_nCurrentSave; DWORD m_nBarfAll;
public: LPCTSTR PszName(void) const { return m_pszName; } BOOL BDisabled(void) const { return m_bDisabled; } BOOL BContinuous(void) const { return m_bContinuous; } DWORD NFail(void) const { return m_nFail; } DWORD NCurrent(void) const { return m_nCurrent; } DWORD NCurrentSave(void) const { return m_nCurrentSave; } DWORD NBarfAll(void) const { return m_nBarfAll; }
// Operations
public: BOOL BFail(void);
// Implementation
public: static PVOID PvSpecialMem(void) { return s_pvSpecialMem; }
protected: static CBarf * s_pbarfFirst; CBarf * m_pbarfNext;
static LONG s_nSuspend; static BOOL s_bGlobalEnable;
// Routine for use by the BARF dialog so that it can be
// automatically updated with results of the BARF run.
static PFNBARFPOSTUPDATE s_pfnPostUpdate; static void SetPostUpdateFn(IN PFNBARFPOSTUPDATE pfn) { ASSERT(pfn != NULL); s_pfnPostUpdate = pfn; } static void ClearPostUpdateFn(void) { ASSERT(s_pfnPostUpdate != NULL); s_pfnPostUpdate = NULL; } static PFNBARFPOSTUPDATE PfnPostUpdate(void) { return s_pfnPostUpdate; }
// Pointer for use by the memory subsystem so that the BARF
// dialog can be ignored.
static PVOID s_pvSpecialMem; static void SetSpecialMem(IN PVOID pv) { ASSERT(pv != NULL); s_pvSpecialMem = pv; }
}; //*** class CBarf
#endif // _DEBUG
/////////////////////////////////////////////////////////////////////////////
//
// class CBarfSuspend
//
// Purpose:
// Temporarily suspends BARF counters. This is especially useful
// from within BARF code.
//
// Usage:
// Create an object on the stack. Counting will be
// suspended while the object exist.
//
// For example:
//
// void Foo(void)
// {
// DoFuncA(); // BARF counters are enabled
//
// {
// CBarfSuspend bs;
//
// DoFuncB(); // BARF counters are suspended
// }
//
// DoFuncC(); // BARF counters are enabled again
// }
//
// NOTE: This is mostly for use within the DEBUG subsystem
// to avoid testing the DEBUG code against BARF.
//
/////////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
class CBarfSuspend { private: static CRITICAL_SECTION s_critsec; static BOOL s_bCritSecValid;
protected: static PCRITICAL_SECTION Pcritsec(void) { return &s_critsec; } static BOOL BCritSecValid(void) { return s_bCritSecValid; }
public: CBarfSuspend(void); ~CBarfSuspend(void);
// for initialization only.
static void Init(void); static void Cleanup(void);
}; //*** class CBarfSuspend
#endif // _DEBUG
/////////////////////////////////////////////////////////////////////////////
// Global Functions and Data
/////////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
extern BOOL g_bFailOnNextBarf;
void EnableBarf(IN BOOL bEnable); inline void FailOnNextBarf(void) { g_bFailOnNextBarf = TRUE; } void InitBarf(void); void CleanupBarf(void);
extern CTraceTag g_tagBarf;
#else
inline void EnableBarf(IN BOOL bEnable) { } inline void FailOnNextBarf(void) { } inline void InitBarf(void) { } inline void CleanupBarf(void) { }
#endif // _DEBUG
/////////////////////////////////////////////////////////////////////////////
//#endif // _NO_BARF_DEFINITIONS_
#endif // _BARF_H_
|