source: trunk/src/wsock32/asyncthread.cpp@ 3195

Last change on this file since 3195 was 3195, checked in by sandervl, 25 years ago

wsock32 rewrite (no pmwsock dependancy)

File size: 4.3 KB
Line 
1/* $Id: asyncthread.cpp,v 1.1 2000-03-22 18:46:15 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
24static PASYNCTHREADPARM threadList = NULL;
25static VMutex asyncThreadMutex;
26
27static void AddToQueue(PASYNCTHREADPARM pThreadParm);
28
29//******************************************************************************
30//******************************************************************************
31static 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//******************************************************************************
43ULONG 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//******************************************************************************
74void AddToQueue(PASYNCTHREADPARM pThreadParm)
75{
76 asyncThreadMutex.enter();
77 pThreadParm->next = threadList;
78 threadList = pThreadParm;
79 asyncThreadMutex.leave();
80}
81//******************************************************************************
82//******************************************************************************
83void 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//******************************************************************************
111int 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//******************************************************************************
137void EnableAsyncEvent(SOCKET s, ULONG flags)
138{
139}
140//******************************************************************************
141//******************************************************************************
142BOOL QueryAsyncEvent(SOCKET s, HWND *pHwnd, int *pMsg, ULONG *plEvent)
143{
144 return FALSE;
145}
146//******************************************************************************
147//******************************************************************************
Note: See TracBrowser for help on using the repository browser.