From e611b132f9b8abe35b362e5870b74bce94a1e58e Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 16 May 2020 20:51:50 -0700 Subject: initial commit --- private/nw/vwipxspx/dll/vwasync.c | 167 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 private/nw/vwipxspx/dll/vwasync.c (limited to 'private/nw/vwipxspx/dll/vwasync.c') diff --git a/private/nw/vwipxspx/dll/vwasync.c b/private/nw/vwipxspx/dll/vwasync.c new file mode 100644 index 000000000..686d05816 --- /dev/null +++ b/private/nw/vwipxspx/dll/vwasync.c @@ -0,0 +1,167 @@ +/*++ + +Copyright (c) 1993 Microsoft Corporation + +Module Name: + + vwasync.c + +Abstract: + + ntVdm netWare (Vw) IPX/SPX Functions + + Vw: The peoples' network + + Contains Asyncrhonous Event Scheduler (thread) + + Contents: + VwAesThread + (CheckPendingIpxRequests) + +Author: + + Richard L Firth (rfirth) 30-Sep-1993 + +Environment: + + User-mode Win32 + +Revision History: + + 30-Sep-1993 rfirth + Created + +--*/ + +#include "vw.h" +#pragma hdrstop + +// +// private routine prototypes +// + +PRIVATE +VOID +CheckPendingIpxRequests( + VOID + ); + +// +// global data +// + +WORD AesTickCount; + +// +// functions +// + + +DWORD +VwAesThread( + IN LPVOID Parameters + ) + +/*++ + +Routine Description: + + Provides the functionality of the Asynchronous Event Scheduler (AES) in the + Netware world: + + - updates the tick count + - completes any matured timer events + - checks any pending requests and schedules the next action + + This thread wakes up every PC tick (1/18 second) + +Arguments: + + Parameters - unused + +Return Value: + + DWORD + 0 + +--*/ + +{ + BOOL fOperationPerformed = FALSE ; + static int n = 1 ; + + UNREFERENCED_PARAMETER(Parameters); + + while (TRUE) + { + // + // we will always yield in this loop to be friendly to others, + // but occasionally we will forcefully do a non zero sleep for + // lower priority threads to run. + // + if ((n % 100) == 0) + { + Sleep(ONE_TICK) ; + n = 1 ; + } + if (!fOperationPerformed && ((n % 4) == 0)) + { + Sleep(10) ; + n++ ; + } + else + { + Sleep(0) ; + n++ ; + } + + ++AesTickCount; + ScanTimerList(); + CheckPendingIpxRequests(); + CheckPendingSpxRequests(&fOperationPerformed); + } + + return 0; // compiler-pacifier +} + + +PRIVATE +VOID +CheckPendingIpxRequests( + VOID + ) + +/*++ + +Routine Description: + + Polls the opened, active non-blocking IPX sockets to see if there is anything + to do (data to receive, availability to send, timeouts) + +Arguments: + + None. + +Return Value: + + None. + +--*/ + +{ + LPSOCKET_INFO pActiveSocket = NULL; + + // + // search SOCKET_INFO structures for something to do. Could do select() + // but we have most of the info anyway. We use the BFI filter mechanism + // + + while (pActiveSocket = FindActiveSocket(pActiveSocket)) { + if (pActiveSocket->Flags & SOCKET_FLAG_SENDING) { + IpxSendNext(pActiveSocket); + } + if (pActiveSocket->Flags & SOCKET_FLAG_LISTENING) { + IpxReceiveNext(pActiveSocket); + } + } +} -- cgit v1.2.3