Changeset 7567 for trunk/src/kernel32/overlappedio.cpp
- Timestamp:
- Dec 7, 2001, 3:13:39 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/overlappedio.cpp
r7564 r7567 1 /* $Id: overlappedio.cpp,v 1. 6 2001-12-07 11:28:11sandervl Exp $ */1 /* $Id: overlappedio.cpp,v 1.7 2001-12-07 14:13:38 sandervl Exp $ */ 2 2 3 3 /* … … 36 36 } 37 37 38 pending[ASYNC_INDEX_READ] = pending[ASYNC_INDEX_WRITE] = pending [ASYNC_INDEX_POLL] = NULL; 38 pending[ASYNC_INDEX_READ] = pending[ASYNC_INDEX_WRITE] = NULL; 39 pending [ASYNC_INDEX_POLL] = pending [ASYNC_INDEX_BUSY] = NULL; 39 40 40 41 this->lpReadHandler = lpReadHandler; … … 165 166 LPOVERLAPPED lpOverlapped; 166 167 HANDLE hEvents[2]; 168 HANDLE hEventsWait[2]; 169 HANDLE hHandle; 167 170 DWORD ret, dwTimeOut, dwResult; 168 171 int index; … … 196 199 break; 197 200 } 198 if(ret == WAIT_FAILED) {199 dprintf(("!WARNING!: WaitForMultipleObjects -> WAIT_FAILED!"));200 break;201 }202 201 //if hEventExit has been signalled, then we are told to exit 203 202 if(ret == (WAIT_OBJECT_0+1)) { … … 215 214 lpRequest = pending[index]; 216 215 pending[index] = lpRequest->next; 217 lpRequest->next = NULL; 216 217 //add to in process list 218 lpRequest->next = pending[ASYNC_INDEX_BUSY]; 219 pending[ASYNC_INDEX_BUSY] = lpRequest; 218 220 ::LeaveCriticalSection(&critsect); 219 221 220 222 lpOverlapped = lpRequest->lpOverlapped;; 223 hHandle = lpRequest->hHandle; 221 224 222 225 switch(dwOperation) { 223 226 case ASYNCIO_READ: 224 227 case ASYNCIO_READWRITE: 225 lpRe adHandler(lpRequest, &dwResult, NULL);228 lpRequest->dwLastError = lpReadHandler(lpRequest, &dwResult, NULL); 226 229 lpOverlapped->Internal = lpRequest->dwLastError; 227 230 lpOverlapped->InternalHigh = dwResult; … … 229 232 *lpRequest->lpdwResult = dwResult; 230 233 } 234 if(lpRequest->dwAsyncType == ASYNCIO_READ) { 235 dprintf(("ASYNCIO_READ %x finished; result %x, last error %d", lpOverlapped, dwResult, lpRequest->dwLastError)); 236 } 237 else dprintf(("ASYNCIO_WRITE %x finished; result %x, last error %d", lpOverlapped, dwResult, lpRequest->dwLastError)); 231 238 //wake up user thread 232 239 ::SetEvent(lpOverlapped->hEvent); 233 delete lpRequest;234 240 break; 235 241 236 242 case ASYNCIO_WRITE: 237 lp WriteHandler(lpRequest, &dwResult, NULL);243 lpRequest->dwLastError = lpWriteHandler(lpRequest, &dwResult, NULL); 238 244 lpOverlapped->Internal = lpRequest->dwLastError; 239 245 lpOverlapped->InternalHigh = dwResult; … … 241 247 *lpRequest->lpdwResult = dwResult; 242 248 } 249 dprintf(("ASYNCIO_WRITE %x finished; result %x, last error %d", lpOverlapped, dwResult, lpRequest->dwLastError)); 243 250 //wake up user thread 244 251 ::SetEvent(lpOverlapped->hEvent); 245 delete lpRequest;246 252 break; 247 253 248 254 case ASYNCIO_POLL: 255 hEventsWait[0] = lpRequest->hEventCancel; 256 hEventsWait[1] = hEventExit; 257 ret = WAIT_TIMEOUT; 249 258 while(TRUE) 250 259 { 251 260 dwTimeOut = 0; 252 if(lpPollHandler(lpRequest, &dwResult, &dwTimeOut) == TRUE) { 261 lpRequest->dwLastError = lpPollHandler(lpRequest, &dwResult, &dwTimeOut); 262 if(lpRequest->dwLastError != ERROR_IO_PENDING) { 253 263 break; 254 264 } … … 258 268 break; 259 269 } 260 Sleep(dwTimeOut); 261 } 262 lpOverlapped->Internal = lpRequest->dwLastError; 263 lpOverlapped->InternalHigh = dwResult; 264 if(lpRequest->lpdwResult) { 265 *lpRequest->lpdwResult = dwResult; 266 } 267 //wake up user thread 268 ::SetEvent(lpOverlapped->hEvent); 269 delete lpRequest; 270 //sleep a while to avoid wasting too many cpu cycles; we are woken up when a timeout occurs, 271 //when the operation is cancelled or when the process exits 272 ret = WaitForMultipleObjects(2, hEventsWait, FALSE, dwTimeOut); 273 if(ret != WAIT_TIMEOUT) { 274 dprintf(("ASYNCIO_POLL: WaitForSingleObject didn't time out, abort (ret = %x)", ret)); 275 break; 276 } 277 } 278 //Don't access the overlapped & result memory when CancelIo was used to cancel the operation 279 if(ret == WAIT_TIMEOUT) 280 { 281 dprintf(("ASYNCIO_POLL %x: result %x, last error %d", lpOverlapped, dwResult, lpRequest->dwLastError)); 282 lpOverlapped->Internal = lpRequest->dwLastError; 283 lpOverlapped->InternalHigh = dwResult; 284 if(lpRequest->lpdwResult) { 285 *lpRequest->lpdwResult = dwResult; 286 } 287 //wake up user thread 288 ::SetEvent(lpOverlapped->hEvent); 289 } 270 290 break; 271 291 } 292 //remove from in-process list and delete async request object 293 findAndRemoveRequest(ASYNC_INDEX_BUSY, hHandle); 294 delete lpRequest; 272 295 } 273 296 return 0; … … 397 420 //****************************************************************************** 398 421 BOOL OverlappedIOHandler::WaitForEvent(HANDLE hHandle, 422 DWORD dwEventMask, 399 423 LPDWORD lpfdwEvtMask, 400 424 LPOVERLAPPED lpOverlapped, … … 424 448 lpRequest->dwUserData = dwUserData; 425 449 lpRequest->dwTimeOut = dwTimeOut; 450 lpRequest->dwEventMask = dwEventMask; 426 451 lpRequest->next = NULL; 427 452 … … 459 484 while(TRUE) { 460 485 lpRequest = findAndRemoveRequest(i, hHandle); 486 461 487 if(lpRequest) { 462 delete lpRequest; 488 ::SetEvent(lpRequest->hEventCancel); //cancel pending operation 489 if(i != ASYNC_INDEX_BUSY) {//thread that handles the request will delete it 490 delete lpRequest; 491 } 463 492 } 464 493 else break; … … 518 547 //****************************************************************************** 519 548 //****************************************************************************** 549
Note:
See TracChangeset
for help on using the changeset viewer.