windows-nt/Source/XPSP1/NT/base/cluster/service/init/tstpoint.c
2020-09-26 16:20:57 +08:00

230 lines
5.3 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
tstpoint.c
Abstract:
Implementation of cluster test points
Author:
John Vert (jvert) 11/25/1996
Revision History:
--*/
#include "initp.h"
#ifdef CLUSTER_TESTPOINT
PTESTPOINT_ENTRY TestArray=NULL;
HANDLE gTestPtFileMapping;
extern DWORD CsTestPoint;
extern DWORD CsTestTrigger;
extern DWORD CsTestAction;
TESTPOINT_NAME TestPointNames[TestpointMax]={
L"JoinFailPetition", //0
L"FailNmJoinCluster", //1
L"FailRegisterIntraClusterRpc", //2
L"FailJoinCreateBindings", //3
L"FailJoinPetitionForMembership", //4
L"FailNmJoin", //5
L"FailDmJoin", //6
L"FailApiInitPhase1", //7
L"FailFmJoinPhase1", //8
L"FailDmUpdateJoinCluster", //9
L"FailEvInitialize", //10
L"FailNmJoinComplete", //11
L"FailApiInitPhase2", //12
L"FailFmJoinPhase2", //13
L"FailLogCommitSize", //14
L"FailClusterShutdown", //15
L"FailLocalXsaction", //16
L"FailOnlineResource", //17
L"FailSecurityInit", //18
L"FailOmInit", //19
L"FailEpInit", //20
L"FailDmInit", //21
L"FailNmInit", //22
L"FailGumInit", //23
L"FailFmInit", //24
L"FailLmInit", //25
L"FailCpInit", //26
L"FailNmPauseNode", //27
L"FailNmResumeNode", //28
L"FailNmEvictNodeAbort", //29
L"FailNmEvictNodeHalt", //30
L"FailNmCreateNetwork", //31
L"FailNmSetNetworkPriorityOrder", //32
L"FailNmSetNetworkPriorityOrder2", //33
L"FailNmSetNetworkCommonProperties", //34
L"FailNmSetInterfaceInfoAbort", //35
L"FailNmSetInterfaceInfoHalt", //36
L"FailPreMoveWithNodeDown", //37
L"FailPostMoveWithNodeDown", //38
L"FailFormNewCluster" //39
};
VOID
TestpointInit(
VOID
)
/*++
Routine Description:
Initializes the testpoint code.
Arguments:
None
Return Value:
None
--*/
{
DWORD ArraySize;
DWORD i;
//
// Create the array of testpoint entries in named shared memory.
//
ArraySize = sizeof(TESTPOINT_ENTRY)*TestpointMax;
gTestPtFileMapping = CreateFileMapping((HANDLE)-1,
NULL,
PAGE_READWRITE,
0,
ArraySize,
L"Cluster_Testpoints");
if (gTestPtFileMapping == NULL) {
CL_UNEXPECTED_ERROR( GetLastError() );
return;
}
TestArray = MapViewOfFile(gTestPtFileMapping,
FILE_MAP_READ | FILE_MAP_WRITE,
0,0,
ArraySize);
if (TestArray == NULL) {
CL_UNEXPECTED_ERROR( GetLastError() );
return;
}
//
// Initialize test point array
//
for (i=0; i<TestpointMax; i++) {
lstrcpyW(TestArray[i].TestPointName,TestPointNames[i]);
if ( i == CsTestPoint ) {
TestArray[i].Trigger = CsTestTrigger;
TestArray[i].Action = CsTestAction;
} else {
TestArray[i].Trigger = TestTriggerNever;
TestArray[i].Action = TestActionTrue;
}
TestArray[i].HitCount = 0;
TestArray[i].TargetCount = 0;
}
return;
}
void TestpointDeInit()
{
if (TestArray) UnmapViewOfFile(TestArray);
if (gTestPtFileMapping) CloseHandle(gTestPtFileMapping);
return;
}
BOOL
TestpointCheck(
IN TESTPOINT Testpoint
)
/*++
Routine Description:
Checks a testpoint to see if it should fire.
Arguments:
Testpoint - Supplies the testpoint number.
Return Value:
TRUE if the testpoint has fired.
FALSE otherwise
--*/
{
PTESTPOINT_ENTRY Entry;
if (TestArray == NULL) {
return(FALSE);
}
Entry = &TestArray[Testpoint];
Entry->HitCount += 1;
switch (Entry->Trigger) {
case TestTriggerNever:
return(FALSE);
case TestTriggerAlways:
break;
case TestTriggerOnce:
Entry->Trigger = TestTriggerNever;
break;
case TestTriggerTargetCount:
if (Entry->HitCount == Entry->TargetCount) {
Entry->HitCount = 0;
break;
} else {
return(FALSE);
}
default:
CL_UNEXPECTED_ERROR( Entry->Trigger );
}
CsDbgPrint(LOG_CRITICAL,
"[TP] Testpoint %1!ws! being executed.\n",
TestPointNames[Testpoint] );
//
// The testpoint has fired, figure out what we are supposed to do.
//
switch (Entry->Action) {
case TestActionTrue:
return(TRUE);
case TestActionExit:
ExitProcess(Testpoint);
break;
case TestActionDebugBreak:
DebugBreak();
break;
}
return(FALSE);
}
#endif