mirror of https://github.com/lianthony/NT4.0
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.
875 lines
26 KiB
875 lines
26 KiB
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
os2xcpt.c
|
|
|
|
Abstract:
|
|
|
|
This is a test OS/2 application to test the exception/signal component
|
|
of OS/2
|
|
|
|
Author:
|
|
|
|
Therese Stowell (thereses) 17-July-1990
|
|
|
|
Environment:
|
|
|
|
User Mode Only
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#define OS2_API32
|
|
#define INCL_OS2V20_ERRORS
|
|
#define INCL_OS2V20_MEMORY
|
|
#define INCL_OS2V20_SEMAPHORES
|
|
#define INCL_OS2V20_TASKING
|
|
#define INCL_OS2V20_EXCEPTIONS
|
|
#include <os2.h>
|
|
#include "excpt.h"
|
|
|
|
PCHAR NullApiArguments[] = {
|
|
"String Number One",
|
|
"String Number Two",
|
|
"String Number Three",
|
|
NULL
|
|
};
|
|
|
|
|
|
VOID
|
|
SigFocusTest( VOID );
|
|
|
|
VOID
|
|
MustCompleteTest( VOID );
|
|
|
|
VOID
|
|
KillProcessTest( VOID );
|
|
|
|
VOID
|
|
KillProcess2( VOID );
|
|
|
|
VOID
|
|
WaitBlockTest( VOID );
|
|
|
|
VOID
|
|
ExitTest( VOID );
|
|
|
|
int
|
|
main(
|
|
int argc,
|
|
char *argv[],
|
|
char *envp[]
|
|
)
|
|
{
|
|
DbgPrint( "*** Entering OS/2 Test Application\n" );
|
|
|
|
// ExitTest();
|
|
// SigFocusTest();
|
|
// MustCompleteTest();
|
|
// KillProcessTest();
|
|
KillProcess2();
|
|
// WaitBlockTest();
|
|
|
|
DbgPrint( "*** Exiting OS/2 Test Application\n" );
|
|
return( 0 );
|
|
}
|
|
|
|
|
|
ULONG
|
|
PrintExceptionCode(
|
|
IN PEXCEPTION_POINTERS ExceptionInfo,
|
|
IN CHAR Process,
|
|
IN ULONG RetCode
|
|
)
|
|
{
|
|
DbgPrint("In PrintExceptionCode. Exception is %lx.\n",ExceptionInfo->ExceptionRecord->ExceptionCode);
|
|
DbgPrint(" Signal is %ld.\n",ExceptionInfo->ExceptionRecord->ExceptionInformation[0]);
|
|
DbgPrint(" Signal should be %ld.\n",XCPT_SIGNAL_INTR);
|
|
DbgPrint(" Process is %c\n",Process);
|
|
return RetCode;
|
|
}
|
|
|
|
VOID
|
|
TestThread0(
|
|
IN UCHAR ThreadChar
|
|
)
|
|
{
|
|
CHAR ThreadName[2];
|
|
|
|
ThreadName[0] = ThreadChar;
|
|
ThreadName[1] = '\0';
|
|
|
|
DbgPrint( "*** Entering OS/2 Thread%s\n", (PCH)ThreadName );
|
|
try {
|
|
while (TRUE)
|
|
;
|
|
}
|
|
except( PrintExceptionCode(GetExceptionInformation(),'B',XCPT_CONTINUE_SEARCH ) ) {
|
|
ASSERT (FALSE); // we should never get here
|
|
}
|
|
DbgPrint( "*** Exiting OS/2 Thread%s\n", (PCH)ThreadName );
|
|
}
|
|
|
|
VOID
|
|
KillProcess2( VOID )
|
|
|
|
//
|
|
// This tests the DosExit API.
|
|
//
|
|
|
|
{
|
|
PPIB Pib;
|
|
PNT_TIB Tib;
|
|
APIRET rc;
|
|
PCH ImageFileName, CommandLine;
|
|
RESULTCODES ResultCodes;
|
|
CHAR ErrorBuffer[ 32 ];
|
|
HEV SemHandle, SemHandle2;
|
|
|
|
rc = DosGetThreadInfo( &Tib, &Pib );
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosGetThreadInfo failed - rc == %ld\n", rc );
|
|
return;
|
|
}
|
|
|
|
ImageFileName = "c:\\nt\\bin\\os2sig.exe";
|
|
DbgPrint("CommandLine is %s\n",Pib->CommandLine);
|
|
if (Pib->CommandLine[1] != 0) {
|
|
CommandLine = "A\000";
|
|
rc = DosExecPgm( ErrorBuffer,
|
|
sizeof( ErrorBuffer ),
|
|
EXEC_ASYNC,
|
|
CommandLine,
|
|
NULL,
|
|
&ResultCodes,
|
|
ImageFileName
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosExecPgm( %s, %s ) failed - rc == %ld\n",
|
|
ImageFileName, CommandLine, rc
|
|
);
|
|
}
|
|
else {
|
|
rc = DosCreateEventSem("\\SEM32\\SIGSEM", // wait for the other processes to be created
|
|
&SemHandle,
|
|
0,
|
|
FALSE);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosCreateEventSem failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
rc = DosWaitEventSem(SemHandle,-1);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosWaitEventSem failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
DbgPrint("calling DosKillProcess\n");
|
|
rc = DosKillProcess(DKP_PROCESSTREE,
|
|
(PID)ResultCodes.ExitReason);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosKillProcess( %ld, %ld ) failed - rc == %ld\n",
|
|
ResultCodes.ExitReason,XCPT_SIGNAL_INTR, rc
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
Pib->CommandLine[0] += 1;
|
|
if (Pib->CommandLine[0] < 'E') {
|
|
CommandLine = Pib->CommandLine;
|
|
rc = DosExecPgm( ErrorBuffer,
|
|
sizeof( ErrorBuffer ),
|
|
EXEC_ASYNC,
|
|
CommandLine,
|
|
NULL,
|
|
&ResultCodes,
|
|
ImageFileName
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosExecPgm( %s, %s ) failed - rc == %ld\n",
|
|
ImageFileName, CommandLine, rc
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
if (Pib->CommandLine[0] == 'E') {
|
|
SemHandle2 = NULL;
|
|
rc = DosOpenEventSem("\\SEM32\\SIGSEM",
|
|
&SemHandle2);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosOpenEventSem failed - rc == %ld\n",rc);
|
|
}
|
|
DbgPrint("posting event\n");
|
|
rc = DosPostEventSem(SemHandle2);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosPostEventSem failed - rc == %ld\n",rc);
|
|
}
|
|
}
|
|
try {
|
|
while (TRUE)
|
|
DbgPrint("looping in %c\n",Pib->CommandLine[0]);
|
|
} except( PrintExceptionCode(GetExceptionInformation(),Pib->CommandLine[0],XCPT_CONTINUE_SEARCH ) ) {
|
|
DbgPrint("in exception handler\n");
|
|
ASSERT ( FALSE );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
VOID
|
|
KillProcessTest( VOID )
|
|
|
|
//
|
|
// This tests the DosKillProcess API.
|
|
//
|
|
|
|
{
|
|
PPIB Pib;
|
|
PNT_TIB Tib;
|
|
APIRET rc;
|
|
PCH ImageFileName, CommandLine;
|
|
RESULTCODES ResultCodes;
|
|
ULONG NestingLevel;
|
|
CHAR ErrorBuffer[ 32 ];
|
|
HEV SemHandle;
|
|
PID Pid;
|
|
TID ThreadAId;
|
|
|
|
rc = DosGetThreadInfo( &Tib, &Pib );
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosGetThreadInfo failed - rc == %ld\n", rc );
|
|
return;
|
|
}
|
|
|
|
ImageFileName = "c:\\nt\\bin\\os2sig.exe";
|
|
DbgPrint("CommandLine is %s\n",Pib->CommandLine);
|
|
if (Pib->CommandLine[1] != 0) {
|
|
CommandLine = "A\000";
|
|
rc = DosExecPgm( ErrorBuffer,
|
|
sizeof( ErrorBuffer ),
|
|
EXEC_ASYNC,
|
|
CommandLine,
|
|
NULL,
|
|
&ResultCodes,
|
|
ImageFileName
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosExecPgm( %s, %s ) failed - rc == %ld\n",
|
|
ImageFileName, CommandLine, rc
|
|
);
|
|
return;
|
|
}
|
|
else {
|
|
rc = DosCreateEventSem("\\SEM32\\SIGSEM",
|
|
&SemHandle,
|
|
0,
|
|
FALSE);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosCreateEventSem failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
rc = DosWaitEventSem(SemHandle,-1);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosWaitEventSem failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
DbgPrint("calling DosKillProcess\n");
|
|
rc = DosKillProcess(DKP_PROCESS,
|
|
(PID)ResultCodes.ExitReason);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosKillProcess( %ld, %ld ) failed - rc == %ld\n",
|
|
ResultCodes.ExitReason,XCPT_SIGNAL_INTR, rc
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
rc = DosWaitChild(DCWA_PROCESS,
|
|
DCWW_WAIT,
|
|
&ResultCodes,
|
|
&Pid,
|
|
(PID)ResultCodes.ExitReason);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosWaitChild failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
|
|
}
|
|
else {
|
|
DbgPrint("entering MustComplete\n");
|
|
rc = DosEnterMustComplete(&NestingLevel);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosEnterMustComplete failed - rc == %ld\n",rc);
|
|
}
|
|
DbgPrint("NestingLevel is %ld\n",NestingLevel);
|
|
rc = DosSetSignalExceptionFocus(TRUE,
|
|
&NestingLevel);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosSetSignalExceptionFocus failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
DbgPrint("NestingLevel is %ld\n",NestingLevel);
|
|
rc = DosCreateThread( &ThreadAId,
|
|
(PFNTHREAD)TestThread0,
|
|
(ULONG)'a',
|
|
DCT_SUSPENDED,
|
|
0x10000
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosCreateThread( ThreadA ) failed - rc == %ld\n",
|
|
rc
|
|
);
|
|
return;
|
|
}
|
|
rc = DosResumeThread( ThreadAId );
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosResumeThread( ThreadA ) failed - rc == %ld\n",
|
|
rc
|
|
);
|
|
}
|
|
rc = DosOpenEventSem("\\SEM32\\SIGSEM",
|
|
&SemHandle);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosOpenEventSem failed - rc == %ld\n",rc);
|
|
}
|
|
DbgPrint("posting event\n");
|
|
rc = DosPostEventSem(SemHandle);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosPostEventSem failed - rc == %ld\n",rc);
|
|
}
|
|
DosSleep( 10000 ); // wait for signal to be sent
|
|
DbgPrint("leaving MustComplete\n");
|
|
rc = DosExitMustComplete(&NestingLevel);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosExitMustComplete failed - rc == %ld\n",rc);
|
|
}
|
|
DbgPrint("NestingLevel is %ld\n",NestingLevel);
|
|
while (TRUE)
|
|
;
|
|
}
|
|
}
|
|
VOID
|
|
MustCompleteTest( VOID )
|
|
|
|
//
|
|
// This tests the Dos*MustComplete API.
|
|
//
|
|
|
|
{
|
|
PPIB Pib;
|
|
PNT_TIB Tib;
|
|
APIRET rc;
|
|
PCH ImageFileName, CommandLine;
|
|
RESULTCODES ResultCodes;
|
|
ULONG NestingLevel;
|
|
CHAR ErrorBuffer[ 32 ];
|
|
HEV SemHandle;
|
|
PID Pid;
|
|
|
|
rc = DosGetThreadInfo( &Tib, &Pib );
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosGetThreadInfo failed - rc == %ld\n", rc );
|
|
return;
|
|
}
|
|
|
|
ImageFileName = "c:\\nt\\bin\\os2sig.exe";
|
|
DbgPrint("CommandLine is %s\n",Pib->CommandLine);
|
|
if (Pib->CommandLine[1] != 0) {
|
|
CommandLine = "A\000";
|
|
rc = DosExecPgm( ErrorBuffer,
|
|
sizeof( ErrorBuffer ),
|
|
EXEC_ASYNC,
|
|
CommandLine,
|
|
NULL,
|
|
&ResultCodes,
|
|
ImageFileName
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosExecPgm( %s, %s ) failed - rc == %ld\n",
|
|
ImageFileName, CommandLine, rc
|
|
);
|
|
return;
|
|
}
|
|
else {
|
|
rc = DosCreateEventSem("\\SEM32\\SIGSEM",
|
|
&SemHandle,
|
|
0,
|
|
FALSE);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosCreateEventSem failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
rc = DosWaitEventSem(SemHandle,-1);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosWaitEventSem failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
DbgPrint("calling DosSendSignalException\n");
|
|
rc = DosSendSignalException((PID)ResultCodes.ExitReason,
|
|
XCPT_SIGNAL_INTR);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosSendSignalException( %ld, %ld ) failed - rc == %ld\n",
|
|
ResultCodes.ExitReason,XCPT_SIGNAL_INTR, rc
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
rc = DosWaitChild(DCWA_PROCESS,
|
|
DCWW_WAIT,
|
|
&ResultCodes,
|
|
&Pid,
|
|
(PID)ResultCodes.ExitReason);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosWaitChild failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
|
|
}
|
|
else {
|
|
DbgPrint("entering MustComplete\n");
|
|
rc = DosEnterMustComplete(&NestingLevel);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosEnterMustComplete failed - rc == %ld\n",rc);
|
|
}
|
|
DbgPrint("NestingLevel is %ld\n",NestingLevel);
|
|
rc = DosSetSignalExceptionFocus(TRUE,
|
|
&NestingLevel);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosSetSignalExceptionFocus failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
DbgPrint("NestingLevel is %ld\n",NestingLevel);
|
|
rc = DosOpenEventSem("\\SEM32\\SIGSEM",
|
|
&SemHandle);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosOpenEventSem failed - rc == %ld\n",rc);
|
|
}
|
|
DbgPrint("posting event\n");
|
|
rc = DosPostEventSem(SemHandle);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosPostEventSem failed - rc == %ld\n",rc);
|
|
}
|
|
DosSleep( 10000 ); // wait for signal to be sent
|
|
DbgPrint("leaving MustComplete\n");
|
|
rc = DosExitMustComplete(&NestingLevel);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosExitMustComplete failed - rc == %ld\n",rc);
|
|
}
|
|
DbgPrint("NestingLevel is %ld\n",NestingLevel);
|
|
}
|
|
}
|
|
|
|
VOID
|
|
ExceptionTest( VOID )
|
|
|
|
//
|
|
// This tests the DosRaiseException API.
|
|
//
|
|
|
|
{
|
|
APIRET rc;
|
|
EXCEPTIONREPORTRECORD ExceptionRecord;
|
|
|
|
try {
|
|
ExceptionRecord.ExceptionNum = XCPT_PROCESS_TERMINATE;
|
|
ExceptionRecord.fHandlerFlags = 0;
|
|
ExceptionRecord.NestedExceptionReportRecord = (PEXCEPTIONREPORTRECORD) NULL;
|
|
ExceptionRecord.cParameters = 0;
|
|
rc = DosRaiseException(&ExceptionRecord);
|
|
}
|
|
except( PrintExceptionCode(GetExceptionInformation(),'A',XCPT_CONTINUE_EXECUTION ) ) {
|
|
ASSERT (FALSE); // we should never get here
|
|
}
|
|
}
|
|
|
|
VOID
|
|
ExitTest( VOID )
|
|
|
|
//
|
|
// This tests the DosExit API.
|
|
//
|
|
|
|
{
|
|
PPIB Pib;
|
|
PNT_TIB Tib;
|
|
APIRET rc;
|
|
PCH ImageFileName, CommandLine;
|
|
RESULTCODES ResultCodes;
|
|
CHAR ErrorBuffer[ 32 ];
|
|
HEV SemHandle;
|
|
|
|
rc = DosGetThreadInfo( &Tib, &Pib );
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosGetThreadInfo failed - rc == %ld\n", rc );
|
|
return;
|
|
}
|
|
|
|
ImageFileName = "c:\\nt\\bin\\os2sig.exe";
|
|
DbgPrint("CommandLine is %s\n",Pib->CommandLine);
|
|
if (Pib->CommandLine[1] != 0) {
|
|
CommandLine = "A\000";
|
|
rc = DosExecPgm( ErrorBuffer,
|
|
sizeof( ErrorBuffer ),
|
|
EXEC_ASYNC,
|
|
CommandLine,
|
|
NULL,
|
|
&ResultCodes,
|
|
ImageFileName
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosExecPgm( %s, %s ) failed - rc == %ld\n",
|
|
ImageFileName, CommandLine, rc
|
|
);
|
|
}
|
|
else {
|
|
rc = DosCreateEventSem("\\SEM32\\SIGSEM", // wait for the other processes to be created
|
|
&SemHandle,
|
|
0,
|
|
FALSE);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosCreateEventSem failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
rc = DosWaitEventSem(SemHandle,-1);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosWaitEventSem failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
DbgPrint("calling DosExit\n");
|
|
DosExit(EXIT_PROCESS,0xA5A5);
|
|
}
|
|
}
|
|
else {
|
|
Pib->CommandLine[0] += 1;
|
|
if (Pib->CommandLine[0] < 'E') {
|
|
CommandLine = Pib->CommandLine;
|
|
rc = DosExecPgm( ErrorBuffer,
|
|
sizeof( ErrorBuffer ),
|
|
EXEC_ASYNC,
|
|
CommandLine,
|
|
NULL,
|
|
&ResultCodes,
|
|
ImageFileName
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosExecPgm( %s, %s ) failed - rc == %ld\n",
|
|
ImageFileName, CommandLine, rc
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
if (Pib->CommandLine[0] == 'E') {
|
|
rc = DosOpenEventSem("\\SEM32\\SIGSEM",
|
|
&SemHandle);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosOpenEventSem failed - rc == %ld\n",rc);
|
|
}
|
|
DbgPrint("posting event\n");
|
|
rc = DosPostEventSem(SemHandle);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosPostEventSem failed - rc == %ld\n",rc);
|
|
}
|
|
}
|
|
try {
|
|
while (TRUE)
|
|
DbgPrint("looping in %c\n",Pib->CommandLine[0]);
|
|
} except( PrintExceptionCode(GetExceptionInformation(),Pib->CommandLine[0],XCPT_CONTINUE_SEARCH ) ) {
|
|
DbgPrint("in exception handler\n");
|
|
ASSERT ( FALSE );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
VOID
|
|
SigFocusTest( VOID )
|
|
|
|
//
|
|
// This tests the DosSetSignalExceptionFocus and DosSendSignalException API.
|
|
//
|
|
|
|
{
|
|
PPIB Pib;
|
|
PNT_TIB Tib;
|
|
APIRET rc;
|
|
PCH ImageFileName, CommandLine;
|
|
RESULTCODES ResultCodes;
|
|
ULONG NestingLevel;
|
|
CHAR ErrorBuffer[ 32 ];
|
|
PID Pid;
|
|
HEV SemHandle;
|
|
PID ChildPid;
|
|
|
|
rc = DosGetThreadInfo( &Tib, &Pib );
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosGetThreadInfo failed - rc == %ld\n", rc );
|
|
return;
|
|
}
|
|
|
|
ImageFileName = "c:\\nt\\bin\\os2sig.exe";
|
|
DbgPrint("CommandLine is %s\n",Pib->CommandLine);
|
|
if (Pib->CommandLine[1] != 0) {
|
|
CommandLine = "A\000";
|
|
rc = DosExecPgm( ErrorBuffer,
|
|
sizeof( ErrorBuffer ),
|
|
EXEC_ASYNC,
|
|
CommandLine,
|
|
NULL,
|
|
&ResultCodes,
|
|
ImageFileName
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosExecPgm( %s, %s ) failed - rc == %ld\n",
|
|
ImageFileName, CommandLine, rc
|
|
);
|
|
}
|
|
else {
|
|
rc = DosCreateEventSem("\\SEM32\\SIGSEM", // wait for the other processes to be created
|
|
&SemHandle,
|
|
0,
|
|
FALSE);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosCreateEventSem failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
rc = DosWaitEventSem(SemHandle,-1);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosWaitEventSem failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
DbgPrint("calling DosSendSignalException\n");
|
|
ChildPid = (PID)ResultCodes.ExitReason;
|
|
while (TRUE) {
|
|
rc = DosSendSignalException(ChildPid,
|
|
XCPT_SIGNAL_INTR);
|
|
|
|
if (rc) {
|
|
DbgPrint( "*** DosSendSignalException( %ld, %ld ) failed - rc == %ld\n",
|
|
ResultCodes.ExitReason,XCPT_SIGNAL_INTR, rc
|
|
);
|
|
break;
|
|
}
|
|
rc = DosWaitChild(DCWA_PROCESS,
|
|
DCWW_WAIT,
|
|
&ResultCodes,
|
|
&Pid,
|
|
(PID)0); // wait for any child
|
|
if (rc) {
|
|
DbgPrint( "*** DosWaitChild failed - rc == %ld\n",rc);
|
|
break;
|
|
}
|
|
else {
|
|
DbgPrint("returned from DosWaitChild successfully\n");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
Pib->CommandLine[0] += 1;
|
|
if (Pib->CommandLine[0] < 'E') {
|
|
CommandLine = Pib->CommandLine;
|
|
rc = DosExecPgm( ErrorBuffer,
|
|
sizeof( ErrorBuffer ),
|
|
EXEC_ASYNC,
|
|
CommandLine,
|
|
NULL,
|
|
&ResultCodes,
|
|
ImageFileName
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosExecPgm( %s, %s ) failed - rc == %ld\n",
|
|
ImageFileName, CommandLine, rc
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
rc = DosSetSignalExceptionFocus(TRUE,
|
|
&NestingLevel);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosSetSignalExceptionFocus failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
DbgPrint("NestingLevel is %ld\n",NestingLevel);
|
|
if (Pib->CommandLine[0] == 'E') {
|
|
rc = DosOpenEventSem("\\SEM32\\SIGSEM",
|
|
&SemHandle);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosOpenEventSem failed - rc == %ld\n",rc);
|
|
}
|
|
DbgPrint("posting event\n");
|
|
rc = DosPostEventSem(SemHandle);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosPostEventSem failed - rc == %ld\n",rc);
|
|
}
|
|
}
|
|
try {
|
|
while (TRUE)
|
|
DbgPrint("looping in %c\n",Pib->CommandLine[0]);
|
|
} except( PrintExceptionCode(GetExceptionInformation(),Pib->CommandLine[0],XCPT_CONTINUE_SEARCH ) ) {
|
|
DbgPrint("in exception handler\n");
|
|
ASSERT ( FALSE );
|
|
}
|
|
}
|
|
}
|
|
|
|
VOID
|
|
TestWaitThread0(
|
|
IN UCHAR ThreadChar
|
|
)
|
|
{
|
|
CHAR ThreadName[2];
|
|
APIRET rc;
|
|
HEV SemHandle;
|
|
|
|
ThreadName[0] = ThreadChar;
|
|
ThreadName[1] = '\0';
|
|
|
|
DbgPrint( "*** Entering OS/2 Thread%s\n", (PCH)ThreadName );
|
|
rc = DosOpenEventSem("\\SEM32\\SIGSEM",
|
|
&SemHandle);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosOpenEventSem failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
DbgPrint("posting event\n");
|
|
rc = DosPostEventSem(SemHandle);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosPostEventSem failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
while (TRUE)
|
|
;
|
|
|
|
DbgPrint( "*** Exiting OS/2 Thread%s\n", (PCH)ThreadName );
|
|
}
|
|
|
|
VOID
|
|
WaitBlockTest( VOID )
|
|
|
|
//
|
|
// This tests the wait block functions in the server
|
|
//
|
|
|
|
{
|
|
PPIB Pib;
|
|
PNT_TIB Tib;
|
|
APIRET rc;
|
|
PCH ImageFileName, CommandLine;
|
|
RESULTCODES ResultCodes;
|
|
ULONG NestingLevel;
|
|
CHAR ErrorBuffer[ 32 ];
|
|
PID Pid;
|
|
HEV SemHandle;
|
|
PID ChildPid;
|
|
TID ThreadAId;
|
|
|
|
rc = DosGetThreadInfo( &Tib, &Pib );
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosGetThreadInfo failed - rc == %ld\n", rc );
|
|
return;
|
|
}
|
|
|
|
ImageFileName = "c:\\nt\\bin\\os2sig.exe";
|
|
DbgPrint("CommandLine is %s\n",Pib->CommandLine);
|
|
if (Pib->CommandLine[1] != 0) {
|
|
CommandLine = "A\000";
|
|
rc = DosExecPgm( ErrorBuffer,
|
|
sizeof( ErrorBuffer ),
|
|
EXEC_ASYNC,
|
|
CommandLine,
|
|
NULL,
|
|
&ResultCodes,
|
|
ImageFileName
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosExecPgm( %s, %s ) failed - rc == %ld\n",
|
|
ImageFileName, CommandLine, rc
|
|
);
|
|
}
|
|
else {
|
|
rc = DosCreateEventSem("\\SEM32\\SIGSEM", // wait for the other processes to be created
|
|
&SemHandle,
|
|
0,
|
|
FALSE);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosCreateEventSem failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
rc = DosWaitEventSem(SemHandle,-1);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosWaitEventSem failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
DbgPrint("calling DosSendSignalException\n");
|
|
ChildPid = (PID)ResultCodes.ExitReason;
|
|
rc = DosSendSignalException(ChildPid,
|
|
XCPT_SIGNAL_INTR);
|
|
|
|
if (rc) {
|
|
DbgPrint( "*** DosSendSignalException( %ld, %ld ) failed - rc == %ld\n",
|
|
ResultCodes.ExitReason,XCPT_SIGNAL_INTR, rc
|
|
);
|
|
return;
|
|
}
|
|
rc = DosWaitChild(DCWA_PROCESS,
|
|
DCWW_WAIT,
|
|
&ResultCodes,
|
|
&Pid,
|
|
(PID)0); // wait for any child
|
|
if (rc) {
|
|
DbgPrint( "*** DosWaitChild failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
else {
|
|
DbgPrint("returned from DosWaitChild successfully\n");
|
|
}
|
|
|
|
}
|
|
}
|
|
else {
|
|
rc = DosSetSignalExceptionFocus(TRUE,
|
|
&NestingLevel);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosSetSignalExceptionFocus failed - rc == %ld\n",rc);
|
|
return;
|
|
}
|
|
DbgPrint("NestingLevel is %ld\n",NestingLevel);
|
|
rc = DosCreateThread( &ThreadAId,
|
|
(PFNTHREAD)TestWaitThread0,
|
|
(ULONG)'a',
|
|
DCT_SUSPENDED,
|
|
0x10000
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosCreateThread( ThreadA ) failed - rc == %ld\n",
|
|
rc
|
|
);
|
|
return;
|
|
}
|
|
rc = DosResumeThread( ThreadAId );
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosResumeThread( ThreadA ) failed - rc == %ld\n",
|
|
rc
|
|
);
|
|
}
|
|
try {
|
|
rc = DosWaitThread( &ThreadAId, DCWW_WAIT );
|
|
if (rc != ERROR_INTERRUPT) {
|
|
DbgPrint( "*** DosWaitThread( ThreadA ) failed - rc == %ld\n",
|
|
rc
|
|
);
|
|
DbgPrint( " ERROR_INTERRUPT expected.\n");
|
|
}
|
|
else {
|
|
DbgPrint("returned from DosWaitThread successfully\n");
|
|
}
|
|
} except ( PrintExceptionCode(GetExceptionInformation(),'B',XCPT_CONTINUE_EXECUTION ) ) {
|
|
ASSERT (FALSE);
|
|
}
|
|
}
|
|
}
|