From e611b132f9b8abe35b362e5870b74bce94a1e58e Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 16 May 2020 20:51:50 -0700 Subject: initial commit --- private/os2/client/os2que.c | 631 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 631 insertions(+) create mode 100644 private/os2/client/os2que.c (limited to 'private/os2/client/os2que.c') diff --git a/private/os2/client/os2que.c b/private/os2/client/os2que.c new file mode 100644 index 000000000..d5f6d8793 --- /dev/null +++ b/private/os2/client/os2que.c @@ -0,0 +1,631 @@ +/*++ + +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 + +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 ); +} -- cgit v1.2.3