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.
631 lines
13 KiB
631 lines
13 KiB
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
os2que.c
|
|
|
|
Abstract:
|
|
|
|
This is a test OS/2 application to test the Queue component of OS/2
|
|
|
|
Author:
|
|
|
|
Mark Lucovsky (markl) 10-Jul-1990
|
|
|
|
Environment:
|
|
|
|
User Mode Only
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#define OS2_API32
|
|
#define INCL_OS2V20_ERRORS
|
|
#define INCL_OS2V20_MEMORY
|
|
#define INCL_OS2V20_QUEUES
|
|
#define INCL_OS2V20_TASKING
|
|
#define INCL_OS2V20_SEMAPHORES
|
|
#include <os2.h>
|
|
|
|
BOOLEAN
|
|
Queue1()
|
|
|
|
{
|
|
APIRET rc;
|
|
HQUEUE Queue1,Queue2,Queue3;
|
|
PID Owner;
|
|
PNT_TIB NtTib;
|
|
PPIB Pib;
|
|
|
|
DbgPrint( "*** Queue1 ***\n" );
|
|
|
|
|
|
rc = DosGetThreadInfo(&NtTib,&Pib);
|
|
ASSERT(rc == NO_ERROR);
|
|
|
|
//
|
|
// Good create
|
|
//
|
|
|
|
DbgPrint( "(1)\n" );
|
|
rc = DosCreateQueue(&Queue1,QUE_FIFO,"\\queues\\testq");
|
|
ASSERT(rc == NO_ERROR);
|
|
|
|
//
|
|
// Create Duplicate
|
|
//
|
|
|
|
DbgPrint( "(2)\n" );
|
|
rc = DosCreateQueue(&Queue2,QUE_FIFO,"\\queues\\testq");
|
|
ASSERT(rc == ERROR_QUE_DUPLICATE);
|
|
|
|
//
|
|
// invalid prefix
|
|
//
|
|
|
|
DbgPrint( "(3)\n" );
|
|
rc = DosCreateQueue(&Queue2,QUE_FIFO,"\\xqueues\\testq");
|
|
ASSERT(rc == ERROR_QUE_INVALID_NAME);
|
|
|
|
//
|
|
// invalid priority
|
|
//
|
|
|
|
DbgPrint( "(4)\n" );
|
|
rc = DosCreateQueue(&Queue2,4,"\\queues\\xue");
|
|
ASSERT(rc == ERROR_QUE_INVALID_PRIORITY);
|
|
|
|
//
|
|
// bad address for queue handle
|
|
//
|
|
|
|
DbgPrint( "(5)\n" );
|
|
rc = DosCreateQueue((PHQUEUE)1,QUE_FIFO,"\\queues\\xue");
|
|
ASSERT(rc == ERROR_INVALID_PARAMETER);
|
|
|
|
//
|
|
// bad address for queue name
|
|
//
|
|
|
|
DbgPrint( "(6)\n" );
|
|
rc = DosCreateQueue(&Queue2,QUE_FIFO,(PSZ) 1);
|
|
ASSERT(rc == ERROR_QUE_INVALID_NAME);
|
|
|
|
//
|
|
// open of previous good queue
|
|
//
|
|
|
|
DbgPrint( "(7)\n" );
|
|
rc = DosOpenQueue(&Owner,&Queue3,"\\queues\\testq");
|
|
ASSERT(rc == NO_ERROR);
|
|
ASSERT(Queue1 == Queue3);
|
|
ASSERT(Owner == Pib->ProcessId);
|
|
|
|
//
|
|
// open of non-existent queue
|
|
//
|
|
|
|
DbgPrint( "(8)\n" );
|
|
rc = DosOpenQueue(&Owner,&Queue2,"\\queues\\xx");
|
|
ASSERT(rc == ERROR_QUE_NAME_NOT_EXIST);
|
|
|
|
//
|
|
// re-open of good queue
|
|
//
|
|
|
|
DbgPrint( "(9)\n" );
|
|
Queue3 = NULL;
|
|
Owner = 0;
|
|
rc = DosOpenQueue(&Owner,&Queue3,"\\queues\\testq");
|
|
ASSERT(rc == NO_ERROR);
|
|
ASSERT(Queue1 == Queue3);
|
|
ASSERT(Owner == Pib->ProcessId);
|
|
|
|
//
|
|
// Good close. Should do this 3 times...
|
|
//
|
|
|
|
DbgPrint( "(10)\n" );
|
|
rc = DosCloseQueue(Queue3);
|
|
ASSERT(rc == NO_ERROR);
|
|
DbgPrint( "(10a)\n" );
|
|
rc = DosOpenQueue(&Owner,&Queue2,"\\queues\\testq");
|
|
ASSERT(rc == ERROR_QUE_NAME_NOT_EXIST);
|
|
|
|
//
|
|
// Close bad handle
|
|
//
|
|
|
|
rc = DosCloseQueue((HQUEUE)0x10000);
|
|
ASSERT(rc == ERROR_QUE_INVALID_HANDLE);
|
|
|
|
DbgPrint( "*** Exiting Queue1 ***\n" );
|
|
return( TRUE );
|
|
}
|
|
|
|
BOOLEAN
|
|
Queue2()
|
|
|
|
{
|
|
APIRET rc;
|
|
HQUEUE Queue1,Queue2;
|
|
PID Owner;
|
|
ULONG QueryCount;
|
|
PNT_TIB NtTib;
|
|
PPIB Pib;
|
|
|
|
DbgPrint( "*** Queue2 ***\n" );
|
|
|
|
|
|
rc = DosGetThreadInfo(&NtTib,&Pib);
|
|
ASSERT(rc == NO_ERROR);
|
|
|
|
//
|
|
// Good create
|
|
//
|
|
|
|
DbgPrint( "(1)\n" );
|
|
rc = DosCreateQueue(&Queue1,QUE_FIFO,"\\queues\\testq");
|
|
ASSERT(rc == NO_ERROR);
|
|
|
|
|
|
//
|
|
// Good Write
|
|
//
|
|
|
|
DbgPrint( "(2)\n" );
|
|
rc = DosWriteQueue(Queue1,1,0x00001111,(PVOID)0x11110001,0x0);
|
|
ASSERT(rc == NO_ERROR);
|
|
|
|
//
|
|
// Query should be 1
|
|
//
|
|
|
|
DbgPrint( "(3)\n" );
|
|
rc = DosQueryQueue(Queue1,&QueryCount);
|
|
ASSERT(rc == NO_ERROR);
|
|
ASSERT(QueryCount == 1);
|
|
|
|
//
|
|
// Good Write
|
|
//
|
|
|
|
DbgPrint( "(4)\n" );
|
|
rc = DosWriteQueue(Queue1,1,0x00002222,(PVOID)0x22220001,0x0);
|
|
ASSERT(rc == NO_ERROR);
|
|
rc = DosWriteQueue(Queue1,1,0x00003333,(PVOID)0x33330001,0x0);
|
|
ASSERT(rc == NO_ERROR);
|
|
|
|
//
|
|
// Query should be 3
|
|
//
|
|
|
|
DbgPrint( "(5)\n" );
|
|
rc = DosQueryQueue(Queue1,&QueryCount);
|
|
ASSERT(rc == NO_ERROR);
|
|
ASSERT(QueryCount == 3);
|
|
|
|
//
|
|
// Purge and then check query. Should be 0
|
|
//
|
|
|
|
DbgPrint( "(6)\n" );
|
|
rc = DosPurgeQueue(Queue1);
|
|
ASSERT(rc == NO_ERROR);
|
|
rc = DosQueryQueue(Queue1,&QueryCount);
|
|
ASSERT(rc == NO_ERROR);
|
|
ASSERT(QueryCount == 0);
|
|
rc = DosCloseQueue(Queue1);
|
|
ASSERT(rc == NO_ERROR);
|
|
|
|
DbgPrint( "*** Exiting Queue2 ***\n" );
|
|
return( TRUE );
|
|
}
|
|
|
|
BOOLEAN
|
|
Queue3()
|
|
|
|
{
|
|
APIRET rc;
|
|
HQUEUE Queue1;
|
|
ULONG QueryCount;
|
|
REQUESTDATA RequestInfo;
|
|
ULONG DataLength;
|
|
ULONG Data;
|
|
ULONG ReadPosition;
|
|
BOOL32 NoWait;
|
|
BYTE ElementPriority;
|
|
|
|
DbgPrint( "*** Queue3 ***\n" );
|
|
|
|
|
|
//
|
|
// Good create
|
|
//
|
|
|
|
DbgPrint( "(1)\n" );
|
|
rc = DosCreateQueue(&Queue1,QUE_FIFO,"\\queues\\testq");
|
|
ASSERT(rc == NO_ERROR);
|
|
|
|
|
|
//
|
|
// Good Write
|
|
//
|
|
|
|
DbgPrint( "(2)\n" );
|
|
rc = DosWriteQueue(Queue1,1,0x00001111,(PVOID)0x11110001,0x3);
|
|
ASSERT(rc == NO_ERROR);
|
|
|
|
//
|
|
// Good Read
|
|
//
|
|
|
|
DbgPrint( "(3)\n" );
|
|
rc = DosReadQueue(
|
|
Queue1,
|
|
&RequestInfo,
|
|
&DataLength,
|
|
&Data,
|
|
0,
|
|
DCWW_NOWAIT,
|
|
&ElementPriority,
|
|
NULL
|
|
);
|
|
ASSERT( rc == NO_ERROR );
|
|
ASSERT( DataLength == 0x00001111);
|
|
ASSERT( Data == 0x11110001);
|
|
ASSERT( ElementPriority == 0x0);
|
|
DbgPrint( "(3a)\n" );
|
|
rc = DosQueryQueue(Queue1,&QueryCount);
|
|
ASSERT(rc == NO_ERROR);
|
|
ASSERT(QueryCount == 0);
|
|
|
|
//
|
|
// Good Write
|
|
//
|
|
|
|
DbgPrint( "(4)\n" );
|
|
rc = DosWriteQueue(Queue1,1,0x00001111,(PVOID)0x11110001,0x3);
|
|
ASSERT(rc == NO_ERROR);
|
|
rc = DosWriteQueue(Queue1,1,0x00002222,(PVOID)0x22220001,0x4);
|
|
ASSERT(rc == NO_ERROR);
|
|
rc = DosWriteQueue(Queue1,1,0x00003333,(PVOID)0x33330001,0x5);
|
|
ASSERT(rc == NO_ERROR);
|
|
|
|
//
|
|
// Good Read using element number
|
|
//
|
|
|
|
DbgPrint( "(4a)\n" );
|
|
rc = DosReadQueue(
|
|
Queue1,
|
|
&RequestInfo,
|
|
&DataLength,
|
|
&Data,
|
|
3,
|
|
DCWW_NOWAIT,
|
|
&ElementPriority,
|
|
NULL
|
|
);
|
|
ASSERT( rc == NO_ERROR );
|
|
ASSERT( DataLength == 0x00002222);
|
|
ASSERT( Data == 0x22220001);
|
|
ASSERT( ElementPriority == 0x0);
|
|
DbgPrint( "(4b)\n" );
|
|
rc = DosReadQueue(
|
|
Queue1,
|
|
&RequestInfo,
|
|
&DataLength,
|
|
&Data,
|
|
4,
|
|
DCWW_NOWAIT,
|
|
&ElementPriority,
|
|
NULL
|
|
);
|
|
ASSERT( rc == NO_ERROR );
|
|
ASSERT( DataLength == 0x00003333);
|
|
ASSERT( Data == 0x33330001);
|
|
ASSERT( ElementPriority == 0x0);
|
|
DbgPrint( "(4c)\n" );
|
|
rc = DosReadQueue(
|
|
Queue1,
|
|
&RequestInfo,
|
|
&DataLength,
|
|
&Data,
|
|
2,
|
|
DCWW_NOWAIT,
|
|
&ElementPriority,
|
|
NULL
|
|
);
|
|
ASSERT( rc == NO_ERROR );
|
|
ASSERT( DataLength == 0x00001111);
|
|
ASSERT( Data == 0x11110001);
|
|
ASSERT( ElementPriority == 0x0);
|
|
|
|
rc = DosCloseQueue(Queue1);
|
|
ASSERT( rc == NO_ERROR);
|
|
|
|
DbgPrint( "*** Exiting Queue3 ***\n" );
|
|
return( TRUE );
|
|
}
|
|
|
|
VOID
|
|
Queue4Reader( IN ULONG QueueHandle )
|
|
{
|
|
APIRET rc;
|
|
REQUESTDATA RequestInfo;
|
|
ULONG DataLength;
|
|
ULONG Data;
|
|
BYTE ElementPriority;
|
|
PNT_TIB NtTib;
|
|
POS2_TIB Tib;
|
|
PPIB Pib;
|
|
|
|
rc = DosGetThreadInfo(&NtTib,&Pib);
|
|
ASSERT(rc == NO_ERROR);
|
|
Tib = (POS2_TIB)NtTib->SubSystemTib;
|
|
|
|
DbgPrint( "++Queue4Reader++ %d\n",Tib->ThreadId );
|
|
rc = DosReadQueue(
|
|
(HQUEUE) QueueHandle,
|
|
&RequestInfo,
|
|
&DataLength,
|
|
&Data,
|
|
0,
|
|
DCWW_WAIT,
|
|
&ElementPriority,
|
|
NULL
|
|
);
|
|
ASSERT( rc == NO_ERROR );
|
|
ASSERT( DataLength == 0x00001111);
|
|
ASSERT( Data == (ULONG)(Tib->ThreadId));
|
|
ASSERT( ElementPriority == 0x0);
|
|
DbgPrint( "--Queue4Reader-- %d\n",Tib->ThreadId );
|
|
DosExit( EXIT_THREAD, rc );
|
|
}
|
|
|
|
BOOLEAN
|
|
Queue4()
|
|
|
|
{
|
|
APIRET rc;
|
|
HQUEUE Queue1;
|
|
ULONG QueryCount;
|
|
REQUESTDATA RequestInfo;
|
|
ULONG DataLength;
|
|
ULONG Data;
|
|
ULONG ReadPosition;
|
|
BOOL32 NoWait;
|
|
BYTE ElementPriority;
|
|
TID Tid1,Tid2;
|
|
|
|
DbgPrint( "*** Queue4 ***\n" );
|
|
|
|
|
|
//
|
|
// Good create
|
|
//
|
|
|
|
DbgPrint( "(1)\n" );
|
|
rc = DosCreateQueue(&Queue1,QUE_FIFO,"\\queues\\testq");
|
|
ASSERT(rc == NO_ERROR);
|
|
|
|
rc = DosQueryQueue(Queue1,&QueryCount);
|
|
ASSERT(rc == NO_ERROR);
|
|
ASSERT(QueryCount == 0);
|
|
|
|
rc = DosCreateThread(&Tid1,Queue4Reader,(ULONG)Queue1,FALSE,1);
|
|
ASSERT( rc == NO_ERROR );
|
|
|
|
DosSleep(1000);
|
|
|
|
rc = DosQueryQueue(Queue1,&QueryCount);
|
|
ASSERT(rc == NO_ERROR);
|
|
ASSERT(QueryCount == 0);
|
|
NtPartyByNumber(6,1);
|
|
//
|
|
// Good Write
|
|
//
|
|
|
|
DbgPrint( "(3)\n" );
|
|
rc = DosWriteQueue(Queue1,1,0x00001111,(PVOID)Tid1,0x3);
|
|
ASSERT(rc == NO_ERROR);
|
|
DbgPrint( "(3a)\n" );
|
|
rc = DosWaitThread(&Tid1,DCWW_WAIT);
|
|
ASSERT( rc == NO_ERROR || rc == ERROR_INVALID_THREADID );
|
|
DbgPrint( "(3b)\n" );
|
|
|
|
rc = DosQueryQueue(Queue1,&QueryCount);
|
|
ASSERT(rc == NO_ERROR);
|
|
ASSERT(QueryCount == 0);
|
|
|
|
rc = DosCreateThread(&Tid1,Queue4Reader,(ULONG)Queue1,FALSE,1);
|
|
ASSERT( rc == NO_ERROR );
|
|
rc = DosCreateThread(&Tid2,Queue4Reader,(ULONG)Queue1,FALSE,1);
|
|
ASSERT( rc == NO_ERROR );
|
|
|
|
DosSleep(1000);
|
|
|
|
//
|
|
// Good Write
|
|
//
|
|
|
|
rc = DosQueryQueue(Queue1,&QueryCount);
|
|
ASSERT(rc == NO_ERROR);
|
|
ASSERT(QueryCount == 0);
|
|
|
|
DbgPrint( "(4)\n" );
|
|
rc = DosWriteQueue(Queue1,1,0x00001111,(PVOID)Tid1,0x3);
|
|
ASSERT(rc == NO_ERROR);
|
|
rc = DosWriteQueue(Queue1,2,0x00001111,(PVOID)Tid2,0x3);
|
|
ASSERT(rc == NO_ERROR);
|
|
DbgPrint( "(4a)\n" );
|
|
rc = DosWaitThread(&Tid1,DCWW_WAIT);
|
|
ASSERT( rc == NO_ERROR || rc == ERROR_INVALID_THREADID );
|
|
DbgPrint( "(4b)\n" );
|
|
rc = DosWaitThread(&Tid2,DCWW_WAIT);
|
|
ASSERT( rc == NO_ERROR || rc == ERROR_INVALID_THREADID );
|
|
|
|
|
|
|
|
rc = DosCloseQueue(Queue1);
|
|
ASSERT( rc == NO_ERROR);
|
|
|
|
DbgPrint( "*** Exiting Queue4 ***\n" );
|
|
return( TRUE );
|
|
}
|
|
|
|
|
|
VOID
|
|
Queue5Writer( IN ULONG QueueHandle )
|
|
{
|
|
APIRET rc;
|
|
REQUESTDATA RequestInfo;
|
|
ULONG DataLength;
|
|
ULONG Data;
|
|
BYTE ElementPriority;
|
|
PNT_TIB NtTib;
|
|
PPIB Pib;
|
|
POS2_TIB Tib;
|
|
|
|
|
|
rc = DosGetThreadInfo(&NtTib,&Pib);
|
|
ASSERT(rc == NO_ERROR);
|
|
Tib = (POS2_TIB)NtTib->SubSystemTib;
|
|
|
|
DbgPrint( "++Queue5Writer++ %d\n",Tib->ThreadId );
|
|
DosSleep(1000);
|
|
rc = DosWriteQueue((HQUEUE)QueueHandle,1,0x00001111,
|
|
(PVOID)Tib->ThreadId,0x3);
|
|
ASSERT(rc == NO_ERROR);
|
|
DbgPrint( "--Queue5Writer-- %d\n",Tib->ThreadId );
|
|
DosExit( EXIT_THREAD, rc );
|
|
}
|
|
|
|
BOOLEAN
|
|
Queue5()
|
|
|
|
{
|
|
APIRET rc;
|
|
HQUEUE Queue1;
|
|
HSEM Sem;
|
|
ULONG QueryCount;
|
|
REQUESTDATA RequestInfo;
|
|
ULONG DataLength;
|
|
ULONG Data;
|
|
ULONG ReadPosition;
|
|
BOOL32 NoWait;
|
|
BYTE ElementPriority;
|
|
TID Tid1,Tid2;
|
|
|
|
DbgPrint( "*** Queue5 ***\n" );
|
|
|
|
|
|
//
|
|
// Good create
|
|
//
|
|
|
|
DbgPrint( "(1)\n" );
|
|
rc = DosCreateQueue(&Queue1,QUE_FIFO,"\\queues\\testq");
|
|
ASSERT(rc == NO_ERROR);
|
|
DbgPrint( "(1a)\n" );
|
|
rc = DosCreateEventSem(NULL,&Sem,DC_SEM_SHARED,FALSE);
|
|
ASSERT(rc == NO_ERROR);
|
|
|
|
//
|
|
// Create a writer thread
|
|
//
|
|
|
|
DbgPrint( "(1b)\n" );
|
|
rc = DosCreateThread(&Tid1,Queue5Writer,(ULONG)Queue1,FALSE,1);
|
|
ASSERT( rc == NO_ERROR );
|
|
|
|
//
|
|
// Issue a no wait read with a semaphore handle
|
|
//
|
|
|
|
DbgPrint( "(1c)\n" );
|
|
rc = DosReadQueue(
|
|
Queue1,
|
|
&RequestInfo,
|
|
&DataLength,
|
|
&Data,
|
|
0,
|
|
DCWW_NOWAIT,
|
|
&ElementPriority,
|
|
Sem
|
|
);
|
|
ASSERT( rc == ERROR_QUE_EMPTY );
|
|
|
|
//
|
|
// Wait on the semaphore and then read again
|
|
//
|
|
|
|
DbgPrint( "(1d)\n" );
|
|
rc = DosWaitEventSem(Sem,SEM_INDEFINITE_WAIT);
|
|
ASSERT(rc == NO_ERROR);
|
|
|
|
DbgPrint( "(1e)\n" );
|
|
rc = DosReadQueue(
|
|
Queue1,
|
|
&RequestInfo,
|
|
&DataLength,
|
|
&Data,
|
|
0,
|
|
DCWW_WAIT,
|
|
&ElementPriority,
|
|
NULL
|
|
);
|
|
ASSERT(rc == NO_ERROR);
|
|
ASSERT( DataLength == 0x00001111);
|
|
ASSERT( Data == (ULONG)Tid1);
|
|
ASSERT( ElementPriority == 0x0);
|
|
|
|
DbgPrint( "(1f)\n" );
|
|
rc = DosWaitThread(&Tid1,DCWW_WAIT);
|
|
ASSERT( rc == NO_ERROR || rc == ERROR_INVALID_THREADID );
|
|
|
|
DbgPrint( "*** Exiting Queue5 ***\n" );
|
|
return( TRUE );
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
main(
|
|
int argc,
|
|
char *argv[],
|
|
char *envp[]
|
|
)
|
|
{
|
|
|
|
BOOLEAN ret;
|
|
|
|
DbgPrint( "*** Entering OS/2 Queue Test Application\n" );
|
|
#ifndef MIPS
|
|
NtPartyByNumber(6,8);
|
|
|
|
ret = Queue1();
|
|
ASSERT(ret);
|
|
|
|
ret = Queue2();
|
|
ASSERT(ret);
|
|
|
|
ret = Queue3();
|
|
ASSERT(ret);
|
|
|
|
ret = Queue4();
|
|
ASSERT(ret);
|
|
|
|
ret = Queue5();
|
|
ASSERT(ret);
|
|
#endif // MIPS
|
|
DbgPrint( "*** Exiting OS/2 Queues Test Application\n" );
|
|
return( 0 );
|
|
}
|