source: trunk/src/kernel32/overlappedio.cpp@ 7550

Last change on this file since 7550 was 7550, checked in by sandervl, 24 years ago

overlapped io updates

File size: 8.1 KB
Line 
1/* $Id: overlappedio.cpp,v 1.2 2001-12-05 18:06:02 sandervl Exp $ */
2
3/*
4 * Win32 overlapped IO class
5 *
6 * Copyright 2001 Sander van Leeuwen <sandervl@xs4all.nl>
7 *
8 * Project Odin Software License can be found in LICENSE.TXT
9 *
10 */
11
12
13
14#include <os2win.h>
15#include <string.h>
16#include <handlemanager.h>
17#include <heapstring.h>
18#include "overlappedio.h"
19#include "oslibdos.h"
20
21#define DBG_LOCALLOG DBG_overlappedio
22#include "dbglocal.h"
23
24
25//******************************************************************************
26//******************************************************************************
27OverlappedIOHandler::OverlappedIOHandler(LPOVERLAPPED_HANDLER lpReadHandler,
28 LPOVERLAPPED_HANDLER lpWriteHandler,
29 LPOVERLAPPED_HANDLER lpPollHandler) :
30 hThreadRead(0), hThreadWrite(0), hThreadPoll(0)
31{
32 OverlappedIOError errcode = OutOfMemory;
33
34 pending = NULL;
35 this->lpReadHandler = lpReadHandler;
36 this->lpWriteHandler = lpWriteHandler;
37 this->lpPollHandler = lpPollHandler;
38
39 ::InitializeCriticalSection(&critsect);
40 hEventPoll = ::CreateEventA(NULL, TRUE, FALSE, NULL);
41 hEventRead = ::CreateEventA(NULL, TRUE, FALSE, NULL);
42 hEventWrite = ::CreateEventA(NULL, TRUE, FALSE, NULL);
43 hEventExit = ::CreateEventA(NULL, TRUE, FALSE, NULL);
44 if(!hEventPoll || !hEventRead || !hEventWrite || !hEventExit)
45 {
46 DebugInt3();
47 errcode = EventCreationFailed;
48 goto failed;
49 }
50
51 DWORD dwThreadId;
52 LPOVERLAPPED_THREAD_PARAM threadparam;
53
54 threadparam = (LPOVERLAPPED_THREAD_PARAM)malloc(sizeof(OVERLAPPED_THREAD_PARAM));
55 if(!threadparam) goto outofmem;
56
57 threadparam->fEvent = (lpWriteHandler) ? EVENT_READ : EVENT_READWRITE;
58 threadparam->lpOverlappedObj = this;
59 hThreadRead = ::CreateThread(NULL, 32*1024, OverlappedIOThread, (LPVOID)threadparam, 0, &dwThreadId);
60 if(lpWriteHandler) {
61 threadparam = (LPOVERLAPPED_THREAD_PARAM)malloc(sizeof(OVERLAPPED_THREAD_PARAM));
62 if(!threadparam) goto outofmem;
63 threadparam->fEvent = EVENT_WRITE;
64 threadparam->lpOverlappedObj = this;
65 hThreadWrite = ::CreateThread(NULL, 32*1024, OverlappedIOThread, (LPVOID)threadparam, 0, &dwThreadId);
66 }
67
68 if(lpPollHandler) {
69 threadparam = (LPOVERLAPPED_THREAD_PARAM)malloc(sizeof(OVERLAPPED_THREAD_PARAM));
70 if(!threadparam) goto outofmem;
71 threadparam->fEvent = EVENT_POLL;
72 threadparam->lpOverlappedObj = this;
73 hThreadPoll = ::CreateThread(NULL, 32*1024, OverlappedIOThread, (LPVOID)threadparam, 0, &dwThreadId);
74 }
75
76 if((lpPollHandler && !hThreadPoll) || !hThreadRead || (lpWriteHandler && !hThreadWrite))
77 {
78 DebugInt3();
79 errcode = ThreadCreationFailed;
80 goto failed;
81 }
82 return;
83
84outofmem:
85 errcode = OutOfMemory;
86 //fall through
87failed:
88 //SvL: NOTE: We might not failed gracefully when threads have already been
89 // created. (thread accessing memory that has been freed)
90 // Don't feel like wasting time to fix this as this should never
91 // happen anyway.
92 if(hEventExit) {
93 ::SetEvent(hEventExit);
94 ::CloseHandle(hEventExit);
95 }
96
97 if(hEventRead) ::CloseHandle(hEventRead);
98 if(hEventWrite) ::CloseHandle(hEventWrite);
99 if(hEventPoll) ::CloseHandle(hEventPoll);
100
101 if(hThreadRead) ::CloseHandle(hThreadRead);
102 if(hThreadPoll) ::CloseHandle(hThreadPoll);
103 if(hThreadWrite) ::CloseHandle(hThreadWrite);
104 ::DeleteCriticalSection(&critsect);
105
106 throw(errcode);
107}
108//******************************************************************************
109//******************************************************************************
110OverlappedIOHandler::~OverlappedIOHandler()
111{
112 dprintf(("~OverlappedIOHandler: signalling overlapped serial threads"));
113 ::SetEvent(hEventExit);
114
115 ::CloseHandle(hEventExit);
116 ::CloseHandle(hEventRead);
117 ::CloseHandle(hEventWrite);
118 ::CloseHandle(hEventPoll);
119
120 ::CloseHandle(hThreadRead);
121 if(hThreadPoll) ::CloseHandle(hThreadPoll);
122 if(hThreadWrite) ::CloseHandle(hThreadWrite);
123
124 DeleteCriticalSection(&critsect);
125}
126//******************************************************************************
127//******************************************************************************
128DWORD CALLBACK OverlappedIOThread(LPVOID lpThreadParam)
129{
130 LPOVERLAPPED_THREAD_PARAM threadparam = (LPOVERLAPPED_THREAD_PARAM)lpThreadParam;
131 DWORD fEvent;
132 OverlappedIOHandler *lpOverlappedObj;
133
134 if(threadparam == NULL) {
135 DebugInt3();
136 return 0;
137 }
138 lpOverlappedObj = threadparam->lpOverlappedObj;
139 fEvent = threadparam->fEvent;
140 //free thread parameter first
141 free(threadparam);
142
143 return lpOverlappedObj->threadHandler(fEvent);
144}
145//******************************************************************************
146//******************************************************************************
147DWORD OverlappedIOHandler::threadHandler(DWORD fEvent)
148{
149 HANDLE hEvents[2];
150 DWORD ret;
151
152 dprintf(("OverlappedIOThread: started for event %d", fEvent));
153 switch(fEvent) {
154 case EVENT_READ:
155 case EVENT_READWRITE:
156 hEvents[0] = hEventRead;
157 break;
158
159 case EVENT_WRITE:
160 hEvents[0] = hEventWrite;
161 break;
162
163 case EVENT_POLL:
164 hEvents[0] = hEventPoll;
165 break;
166 default:
167 DebugInt3();
168 }
169 hEvents[1] = hEventExit;
170
171 while(TRUE) {
172 ret = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);
173 if(ret == WAIT_FAILED) {
174 dprintf(("!WARNING!: WaitForMultipleObjects -> WAIT_FAILED!"));
175 break;
176 }
177 if(ret == WAIT_FAILED) {
178 dprintf(("!WARNING!: WaitForMultipleObjects -> WAIT_FAILED!"));
179 break;
180 }
181 //if hEventExit has been signalled, then we are told to exit
182 if(ret == (WAIT_OBJECT_0+1)) {
183 dprintf(("end of threadHandler signalled"));
184 break;
185 }
186 }
187 return 0;
188}
189//******************************************************************************
190//******************************************************************************
191BOOL OverlappedIOHandler::WriteFile(HANDLE hOS2Handle,
192 LPCVOID lpBuffer,
193 DWORD nNumberOfBytesToWrite,
194 LPDWORD lpNumberOfBytesWritten,
195 LPOVERLAPPED lpOverlapped,
196 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
197{
198 return FALSE;
199}
200//******************************************************************************
201//******************************************************************************
202BOOL OverlappedIOHandler::ReadFile(HANDLE hOS2Handle,
203 LPCVOID lpBuffer,
204 DWORD nNumberOfBytesToRead,
205 LPDWORD lpNumberOfBytesRead,
206 LPOVERLAPPED lpOverlapped,
207 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
208{
209 return FALSE;
210}
211//******************************************************************************
212//******************************************************************************
213BOOL OverlappedIOHandler::CancelIo(HANDLE hOS2Handle)
214{
215 return FALSE;
216}
217//******************************************************************************
218//******************************************************************************
219BOOL OverlappedIOHandler::GetOverlappedResult(HANDLE hOS2Handle,
220 LPOVERLAPPED lpoOverlapped,
221 LPDWORD lpcbTransfer,
222 DWORD dwTimeout)
223{
224 return FALSE;
225}
226//******************************************************************************
227//******************************************************************************
Note: See TracBrowser for help on using the repository browser.