| 1 | /* $Id: asyncthread.cpp,v 1.1 2000-03-22 20:01:04 sandervl Exp $ */
|
|---|
| 2 |
|
|---|
| 3 | /*
|
|---|
| 4 | * Async thread help functions
|
|---|
| 5 | *
|
|---|
| 6 | * Copyright 2000 Sander van Leeuwen (sandervl@xs4all.nl)
|
|---|
| 7 | *
|
|---|
| 8 | *
|
|---|
| 9 | * Not everything is thread safe
|
|---|
| 10 | *
|
|---|
| 11 | * Project Odin Software License can be found in LICENSE.TXT
|
|---|
| 12 | */
|
|---|
| 13 | #define INCL_BASE
|
|---|
| 14 | #include <os2wrap.h>
|
|---|
| 15 | #include <os2sel.h>
|
|---|
| 16 | #include <wprocess.h>
|
|---|
| 17 | #include <win32api.h>
|
|---|
| 18 | #include <misc.h>
|
|---|
| 19 | #include <string.h>
|
|---|
| 20 | #include <vmutex.h>
|
|---|
| 21 | #include "wsock32.h"
|
|---|
| 22 | #include "asyncthread.h"
|
|---|
| 23 |
|
|---|
| 24 | static PASYNCTHREADPARM threadList = NULL;
|
|---|
| 25 | static VMutex asyncThreadMutex;
|
|---|
| 26 |
|
|---|
| 27 | static void AddToQueue(PASYNCTHREADPARM pThreadParm);
|
|---|
| 28 |
|
|---|
| 29 | //******************************************************************************
|
|---|
| 30 | //******************************************************************************
|
|---|
| 31 | static void APIENTRY AsyncThread(ULONG arg)
|
|---|
| 32 | {
|
|---|
| 33 | PASYNCTHREADPARM pThreadParm = (PASYNCTHREADPARM)arg;
|
|---|
| 34 |
|
|---|
| 35 | pThreadParm->asyncProc((PVOID)arg);
|
|---|
| 36 |
|
|---|
| 37 | WSASetBlocking(TRUE, pThreadParm->hThread);
|
|---|
| 38 |
|
|---|
| 39 | DosExit(EXIT_THREAD, 0);
|
|---|
| 40 | }
|
|---|
| 41 | //******************************************************************************
|
|---|
| 42 | //******************************************************************************
|
|---|
| 43 | ULONG QueueAsyncJob(ASYNCTHREADPROC asyncproc, PASYNCTHREADPARM pThreadParm)
|
|---|
| 44 | {
|
|---|
| 45 | APIRET rc;
|
|---|
| 46 | TID tid;
|
|---|
| 47 |
|
|---|
| 48 | pThreadParm->asyncProc = asyncproc;
|
|---|
| 49 | pThreadParm->fActive = TRUE;
|
|---|
| 50 | pThreadParm->fCancelled = FALSE;
|
|---|
| 51 | pThreadParm->next = NULL;
|
|---|
| 52 | pThreadParm->hAsyncTaskHandle = 0;
|
|---|
| 53 |
|
|---|
| 54 | pThreadParm->hThread = GetCurrentThread();
|
|---|
| 55 | AddToQueue(pThreadParm);
|
|---|
| 56 |
|
|---|
| 57 | WSASetBlocking(TRUE);
|
|---|
| 58 |
|
|---|
| 59 | rc = DosCreateThread(&tid, AsyncThread, (ULONG)pThreadParm, CREATE_READY, 16384);
|
|---|
| 60 | if(rc)
|
|---|
| 61 | {
|
|---|
| 62 | dprintf(("QueueAsyncJob: DosCreateThread failed with error %x", rc));
|
|---|
| 63 | WSASetBlocking(FALSE);
|
|---|
| 64 | RemoveFromQueue(pThreadParm);
|
|---|
| 65 | WSASetLastError(WSAEFAULT);
|
|---|
| 66 | return 0;
|
|---|
| 67 | }
|
|---|
| 68 | pThreadParm->hAsyncTaskHandle = tid;
|
|---|
| 69 | WSASetLastError(NO_ERROR);
|
|---|
| 70 | return pThreadParm->hAsyncTaskHandle;
|
|---|
| 71 | }
|
|---|
| 72 | //******************************************************************************
|
|---|
| 73 | //******************************************************************************
|
|---|
| 74 | void AddToQueue(PASYNCTHREADPARM pThreadParm)
|
|---|
| 75 | {
|
|---|
| 76 | asyncThreadMutex.enter();
|
|---|
| 77 | pThreadParm->next = threadList;
|
|---|
| 78 | threadList = pThreadParm;
|
|---|
| 79 | asyncThreadMutex.leave();
|
|---|
| 80 | }
|
|---|
| 81 | //******************************************************************************
|
|---|
| 82 | //******************************************************************************
|
|---|
| 83 | void RemoveFromQueue(PASYNCTHREADPARM pThreadParm)
|
|---|
| 84 | {
|
|---|
| 85 | PASYNCTHREADPARM parm;
|
|---|
| 86 |
|
|---|
| 87 | asyncThreadMutex.enter();
|
|---|
| 88 | parm = threadList;
|
|---|
| 89 |
|
|---|
| 90 | if(parm == pThreadParm) {
|
|---|
| 91 | threadList = pThreadParm->next;
|
|---|
| 92 | }
|
|---|
| 93 | else {
|
|---|
| 94 | while(parm->next) {
|
|---|
| 95 | if(parm->next == pThreadParm) {
|
|---|
| 96 | parm->next = pThreadParm->next;
|
|---|
| 97 | break;
|
|---|
| 98 | }
|
|---|
| 99 | parm = parm->next;
|
|---|
| 100 | }
|
|---|
| 101 | if(parm == NULL) {
|
|---|
| 102 | dprintf(("RemoveFromQueue: parm %x not found!!", pThreadParm));
|
|---|
| 103 | DebugInt3();
|
|---|
| 104 | }
|
|---|
| 105 | }
|
|---|
| 106 | memset(pThreadParm, 0, sizeof(*pThreadParm));
|
|---|
| 107 | asyncThreadMutex.leave();
|
|---|
| 108 | }
|
|---|
| 109 | //******************************************************************************
|
|---|
| 110 | //******************************************************************************
|
|---|
| 111 | int WIN32API WSACancelAsyncRequest(LHANDLE hAsyncTaskHandle)
|
|---|
| 112 | {
|
|---|
| 113 | PASYNCTHREADPARM parm;
|
|---|
| 114 | BOOL found = FALSE;
|
|---|
| 115 |
|
|---|
| 116 | dprintf(("WSACancelAsyncRequest: cancel task %x", hAsyncTaskHandle));
|
|---|
| 117 | asyncThreadMutex.enter();
|
|---|
| 118 | parm = threadList;
|
|---|
| 119 |
|
|---|
| 120 | while(parm) {
|
|---|
| 121 | if(parm->hAsyncTaskHandle == hAsyncTaskHandle) {
|
|---|
| 122 | parm->fCancelled = TRUE;
|
|---|
| 123 | found = TRUE;
|
|---|
| 124 | break;
|
|---|
| 125 | }
|
|---|
| 126 | parm = parm->next;
|
|---|
| 127 | }
|
|---|
| 128 | asyncThreadMutex.leave();
|
|---|
| 129 | if(found == FALSE) {
|
|---|
| 130 | WSASetLastError(WSAEINVAL);
|
|---|
| 131 | dprintf(("WSACancelAsyncRequest: task not found!!"));
|
|---|
| 132 | }
|
|---|
| 133 | return (found) ? NO_ERROR : SOCKET_ERROR;
|
|---|
| 134 | }
|
|---|
| 135 | //******************************************************************************
|
|---|
| 136 | //******************************************************************************
|
|---|
| 137 | void EnableAsyncEvent(SOCKET s, ULONG flags)
|
|---|
| 138 | {
|
|---|
| 139 | }
|
|---|
| 140 | //******************************************************************************
|
|---|
| 141 | //******************************************************************************
|
|---|
| 142 | BOOL QueryAsyncEvent(SOCKET s, HWND *pHwnd, int *pMsg, ULONG *plEvent)
|
|---|
| 143 | {
|
|---|
| 144 | return FALSE;
|
|---|
| 145 | }
|
|---|
| 146 | //******************************************************************************
|
|---|
| 147 | //******************************************************************************
|
|---|