summaryrefslogtreecommitdiffstats
path: root/private/nw/vwipxspx/dll/vwasync.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/nw/vwipxspx/dll/vwasync.c')
-rw-r--r--private/nw/vwipxspx/dll/vwasync.c167
1 files changed, 167 insertions, 0 deletions
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);
+ }
+ }
+}