Changeset 7550 for trunk/src/kernel32/overlappedio.cpp
- Timestamp:
- Dec 5, 2001, 7:06:02 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/overlappedio.cpp
r7549 r7550 1 /* $Id: overlappedio.cpp,v 1. 1 2001-12-05 14:16:38sandervl Exp $ */1 /* $Id: overlappedio.cpp,v 1.2 2001-12-05 18:06:02 sandervl Exp $ */ 2 2 3 3 /* 4 * Win32 overlapped IO class 5 * 6 * Copyright 2001 Sander van Leeuwen <sandervl@xs4all.nl> 7 * 4 8 * Project Odin Software License can be found in LICENSE.TXT 5 *6 * Win32 COM device access class7 *8 * 1999 Achim Hasenmueller <achimha@innotek.de>9 * 2001 Sander van Leeuwen <sandervl@xs4all.nl>10 *11 * TODO: Overlapped IO only supports one request at a time12 * TODO: Overlapped IO not thread safe13 9 * 14 10 */ … … 19 15 #include <string.h> 20 16 #include <handlemanager.h> 21 #include "handlenames.h"22 17 #include <heapstring.h> 23 #include "hmdevice.h" 24 #include "hmcomm.h" 18 #include "overlappedio.h" 25 19 #include "oslibdos.h" 26 20 … … 29 23 30 24 31 DWORD CALLBACK OverlappedIOEventThread(LPVOID lpThreadParam); 32 DWORD CALLBACK OverlappedIOReadWriteThread(LPVOID lpThreadParam); 33 34 //****************************************************************************** 35 //****************************************************************************** 36 37 38 //****************************************************************************** 39 //****************************************************************************** 25 //****************************************************************************** 26 //****************************************************************************** 27 OverlappedIOHandler::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 84 outofmem: 85 errcode = OutOfMemory; 86 //fall through 87 failed: 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 //****************************************************************************** 110 OverlappedIOHandler::~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 //****************************************************************************** 128 DWORD 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 //****************************************************************************** 147 DWORD 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 //****************************************************************************** 191 BOOL 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 //****************************************************************************** 202 BOOL 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 //****************************************************************************** 213 BOOL OverlappedIOHandler::CancelIo(HANDLE hOS2Handle) 214 { 215 return FALSE; 216 } 217 //****************************************************************************** 218 //****************************************************************************** 219 BOOL OverlappedIOHandler::GetOverlappedResult(HANDLE hOS2Handle, 220 LPOVERLAPPED lpoOverlapped, 221 LPDWORD lpcbTransfer, 222 DWORD dwTimeout) 223 { 224 return FALSE; 225 } 226 //****************************************************************************** 227 //******************************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.