Changeset 7598 for trunk/src/kernel32/overlappedio.cpp
- Timestamp:
- Dec 9, 2001, 10:55:17 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/overlappedio.cpp
r7596 r7598 1 /* $Id: overlappedio.cpp,v 1. 8 2001-12-09 21:19:28sandervl Exp $ */1 /* $Id: overlappedio.cpp,v 1.9 2001-12-09 21:55:17 sandervl Exp $ */ 2 2 3 3 /* … … 27 27 OverlappedIOHandler::OverlappedIOHandler(LPOVERLAPPED_HANDLER lpReadHandler, 28 28 LPOVERLAPPED_HANDLER lpWriteHandler, 29 LPOVERLAPPED_HANDLER lpPollHandler) : 29 LPOVERLAPPED_HANDLER lpPollHandler, 30 BOOL fFullDuplex) : 30 31 hThreadRead(0), hThreadWrite(0), hThreadPoll(0) 31 32 { 32 33 OverlappedIOError errcode = OutOfMemory; 34 35 this->fFullDuplex = fFullDuplex; 33 36 34 37 if(lpReadHandler == NULL || lpPollHandler == NULL) { … … 49 52 hEventRead = ::CreateEventA(NULL, FALSE, FALSE, NULL); 50 53 hEventWrite = ::CreateEventA(NULL, FALSE, FALSE, NULL); 54 55 dprintf(("OverlappedIOThread: hEventRead %x hEventWrite %x hEventPoll %x", hEventRead, hEventWrite, hEventPoll)); 51 56 52 57 //the exit event semaphore is manual reset, because this event … … 63 68 LPOVERLAPPED_THREAD_PARAM threadparam; 64 69 65 dwAsyncType = (lpWriteHandler ) ? ASYNCIO_READ : ASYNCIO_READWRITE;70 dwAsyncType = (lpWriteHandler && fFullDuplex) ? ASYNCIO_READ : ASYNCIO_READWRITE; 66 71 threadparam = (LPOVERLAPPED_THREAD_PARAM)malloc(sizeof(OVERLAPPED_THREAD_PARAM)); 67 72 if(!threadparam) goto outofmem; … … 70 75 hThreadRead = ::CreateThread(NULL, 32*1024, OverlappedIOThread, (LPVOID)threadparam, 0, &dwThreadId); 71 76 72 if(lpWriteHandler ) {77 if(lpWriteHandler && fFullDuplex) { 73 78 dwAsyncType |= ASYNCIO_WRITE; 74 79 … … 90 95 } 91 96 92 if((lpPollHandler && !hThreadPoll) || !hThreadRead || (lpWriteHandler && !hThreadWrite))97 if((lpPollHandler && !hThreadPoll) || !hThreadRead || (lpWriteHandler && fFullDuplex && !hThreadWrite)) 93 98 { 94 99 DebugInt3(); … … 226 231 case ASYNCIO_READ: 227 232 case ASYNCIO_READWRITE: 228 lpRequest->dwLastError = lpReadHandler(lpRequest, &dwResult, NULL); 233 if(lpRequest->dwAsyncType == ASYNCIO_READ || lpWriteHandler == NULL) { 234 lpRequest->dwLastError = lpReadHandler(lpRequest, &dwResult, NULL); 235 } 236 else lpRequest->dwLastError = lpWriteHandler(lpRequest, &dwResult, NULL); 237 229 238 lpOverlapped->Internal = lpRequest->dwLastError; 230 239 lpOverlapped->InternalHigh = dwResult; … … 331 340 lpRequest->next = NULL; 332 341 333 if(dwAsyncType ==ASYNCIO_READWRITE) {342 if(dwAsyncType & ASYNCIO_READWRITE) { 334 343 index = ASYNC_INDEX_READ; 335 344 } … … 355 364 356 365 //wake up async thread 357 ::SetEvent((dwAsyncType ==ASYNCIO_READWRITE) ? hEventRead : hEventWrite);366 ::SetEvent((dwAsyncType & ASYNCIO_READWRITE) ? hEventRead : hEventWrite); 358 367 359 368 ::SetLastError(ERROR_IO_PENDING);
Note:
See TracChangeset
for help on using the changeset viewer.