- Timestamp:
- Dec 7, 2001, 3:13:39 PM (24 years ago)
- Location:
- trunk/src/kernel32
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/HandleManager.cpp
r7549 r7567 1 /* $Id: HandleManager.cpp,v 1.8 3 2001-12-05 14:15:56 sandervl Exp $ */1 /* $Id: HandleManager.cpp,v 1.84 2001-12-07 14:13:36 sandervl Exp $ */ 2 2 3 3 /* … … 1073 1073 HMHandleTemp.dwFlags = dwFlagsAndAttributes; 1074 1074 HMHandleTemp.lpHandlerData = NULL; 1075 HMHandleTemp.hWin32Handle = iIndexNew; 1075 1076 HMHandleTemp.lpDeviceData = pDevData; 1076 1077 } -
trunk/src/kernel32/hmcomm.cpp
r7564 r7567 1 /* $Id: hmcomm.cpp,v 1.2 8 2001-12-07 11:28:09sandervl Exp $ */1 /* $Id: hmcomm.cpp,v 1.29 2001-12-07 14:13:36 sandervl Exp $ */ 2 2 3 3 /* … … 25 25 #include "dbglocal.h" 26 26 27 //#define TESTING_COMM27 #define TESTING_COMM 28 28 #ifdef TESTING_COMM 29 29 #undef dprintf … … 58 58 #define BaudTableSize (sizeof(BaudTable)/sizeof(BAUDTABLEENTRY)) 59 59 60 static BOOLCommReadIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut);61 static BOOLCommWriteIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut);62 static BOOLCommPollIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut);60 static DWORD CommReadIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut); 61 static DWORD CommWriteIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut); 62 static DWORD CommPollIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut); 63 63 64 64 //****************************************************************************** … … 287 287 dprintf(("HMComm: Serial communication port close request")); 288 288 289 if(pDevData && pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED)290 {291 DebugInt3();292 }293 289 delete pHMHandleData->lpHandlerData; 294 290 return OSLibDosClose(pHMHandleData->hHMHandle); … … 297 293 //Overlapped read handler 298 294 //****************************************************************************** 299 BOOL CommReadIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut) 300 { 301 return FALSE; 295 DWORD CommReadIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut) 296 { 297 PHMHANDLEDATA pHMHandleData; 298 BOOL ret; 299 ULONG ulBytesRead; 300 301 pHMHandleData = HMQueryHandleData(lpRequest->hHandle); 302 if(pHMHandleData == NULL) { 303 dprintf(("!ERROR!: CommReadIOHandler handle %x not valid", lpRequest->hHandle)); 304 DebugInt3(); 305 return ERROR_INVALID_HANDLE; 306 } 307 308 #ifdef DEBUG 309 RXQUEUE qInfo; 310 ULONG ulLen = sizeof(qInfo); 311 ULONG rc = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 312 IOCTL_ASYNC, 313 ASYNC_GETINQUECOUNT, 314 0,0,0, 315 &qInfo,ulLen,&ulLen); 316 dprintf(("ASYNC_GETINQUECOUNT -> qInfo.cch %d (queue size %d) rc %d", qInfo.cch, qInfo.cb, rc)); 317 #endif 318 319 ret = OSLibDosRead(pHMHandleData->hHMHandle, (LPVOID)lpRequest->lpBuffer, lpRequest->nNumberOfBytes, 320 &ulBytesRead); 321 322 *lpdwResult = (ret) ? ulBytesRead : 0; 323 dprintf2(("KERNEL32: CommReadIOHandler %d bytes read", *lpdwResult)); 324 325 if(ret == FALSE) { 326 dprintf(("!ERROR!: CommReadIOHandler failed with rc %d", GetLastError())); 327 } 328 else { 329 //testestestest 330 dprintf2(("%d Bytes read:", ulBytesRead)); 331 for(int i=0;i<ulBytesRead;i++) { 332 dprintf2(("%x %c", ((char *)lpRequest->lpBuffer)[i], ((char *)lpRequest->lpBuffer)[i])); 333 } 334 //testestestset 335 } 336 return GetLastError(); 302 337 } 303 338 //****************************************************************************** 304 339 //Overlapped write handler 305 340 //****************************************************************************** 306 BOOL CommWriteIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut) 307 { 308 return FALSE; 341 DWORD CommWriteIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut) 342 { 343 PHMHANDLEDATA pHMHandleData; 344 BOOL ret; 345 ULONG ulBytesWritten; 346 347 pHMHandleData = HMQueryHandleData(lpRequest->hHandle); 348 if(pHMHandleData == NULL) { 349 dprintf(("!ERROR!: CommWriteIOHandler handle %x not valid", lpRequest->hHandle)); 350 DebugInt3(); 351 return ERROR_INVALID_HANDLE; 352 } 353 354 //testestestest 355 dprintf2(("Bytes to write:")); 356 for(int i=0;i<lpRequest->nNumberOfBytes;i++) { 357 dprintf2(("%x %c", ((char *)lpRequest->lpBuffer)[i], ((char *)lpRequest->lpBuffer)[i])); 358 } 359 //testestestset 360 361 ret = OSLibDosWrite(pHMHandleData->hHMHandle, (LPVOID)lpRequest->lpBuffer, lpRequest->nNumberOfBytes, 362 &ulBytesWritten); 363 364 *lpdwResult = (ret) ? ulBytesWritten : 0; 365 dprintf2(("KERNEL32:CommWriteIOHandler %d byte(s) written", *lpdwResult)); 366 367 if(ret == FALSE) { 368 dprintf(("!ERROR!: CommWriteIOHandler failed with rc %d", GetLastError())); 369 } 370 return GetLastError(); 309 371 } 310 372 //****************************************************************************** 311 373 //Overlapped WaitCommEvent handler 312 374 //****************************************************************************** 313 BOOL CommPollIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut) 314 { 375 DWORD CommPollIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut) 376 { 377 APIRET rc; 378 ULONG ulLen; 379 USHORT COMEvt; 380 DWORD dwEvent,dwMask; 381 PHMHANDLEDATA pHMHandleData; 382 PHMDEVCOMDATA pDevData; 383 384 pHMHandleData = HMQueryHandleData(lpRequest->hHandle); 385 if(pHMHandleData == NULL || pHMHandleData->lpHandlerData == NULL) { 386 dprintf(("!ERROR!: CommWriteIOHandler handle %x not valid", lpRequest->hHandle)); 387 DebugInt3(); 388 return ERROR_INVALID_HANDLE; 389 } 390 391 pDevData = (PHMDEVCOMDATA)pHMHandleData->lpHandlerData; 392 393 dprintf(("CommPollIOHandler %x %x", pHMHandleData->hHMHandle, lpRequest->dwEventMask)); 394 315 395 *lpdwTimeOut = TIMEOUT_COMM; 316 return FALSE; 396 397 ulLen = sizeof(CHAR); 398 dwEvent = 0; 399 rc = 0; 400 ulLen = sizeof(COMEvt); 401 402 if(lpRequest->dwEventMask != pDevData->dwEventMask) { 403 dprintf(("!WARNING!: CommPollIOHandler: operation aborted (event mask changed)")); 404 return ERROR_OPERATION_ABORTED; // Exit if the Mask gets changed 405 } 406 rc = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 407 IOCTL_ASYNC, 408 ASYNC_GETCOMMEVENT, 409 0,0,0, 410 &COMEvt,ulLen,&ulLen); 411 if(!rc) 412 { 413 dwEvent |= (COMEvt&0x0001)? EV_RXCHAR:0; 414 //dwEvent |= (COMEvt&0x0002)? 0:0; 415 dwEvent |= (COMEvt&0x0004)? EV_TXEMPTY:0; 416 dwEvent |= (COMEvt&0x0008)? EV_CTS:0; 417 dwEvent |= (COMEvt&0x0010)? EV_DSR:0; 418 //dwEvent |= (COMEvt&0x0020)? 0:0; DCS = RLSD? 419 dwEvent |= (COMEvt&0x0040)? EV_BREAK:0; 420 dwEvent |= (COMEvt&0x0080)? EV_ERR:0; 421 dwEvent |= (COMEvt&0x0100)? EV_RING:0; 422 if((dwEvent & dwMask)) { 423 *lpdwResult = (dwEvent & dwMask); 424 return ERROR_SUCCESS; 425 } 426 } 427 else { 428 dprintf(("!ERROR!: CommPollIOHandler: OSLibDosDevIOCtl failed with rc %d", rc)); 429 *lpdwResult = 0; 430 return ERROR_OPERATION_ABORTED; 431 } 432 return ERROR_IO_PENDING; 317 433 } 318 434 /***************************************************************************** … … 370 486 } 371 487 372 //testestestest373 dprintf2(("Bytes to write:"));374 for(int i=0;i<nNumberOfBytesToWrite;i++) {375 dprintf2(("%x %c", ((char *)lpBuffer)[i], ((char *)lpBuffer)[i]));376 }377 //testestestset378 379 488 ret = OSLibDosWrite(pHMHandleData->hHMHandle, (LPVOID)lpBuffer, nNumberOfBytesToWrite, 380 489 &ulBytesWritten); … … 445 554 } 446 555 556 #ifdef DEBUG 447 557 RXQUEUE qInfo; 448 558 ULONG ulLen = sizeof(qInfo); … … 453 563 &qInfo,ulLen,&ulLen); 454 564 dprintf(("ASYNC_GETINQUECOUNT -> qInfo.cch %d (queue size %d) rc %d", qInfo.cch, qInfo.cb, rc)); 565 #endif 455 566 456 567 ret = OSLibDosRead(pHMHandleData->hHMHandle, (LPVOID)lpBuffer, nNumberOfBytesToRead, … … 555 666 if(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) 556 667 { 557 return pDevData->iohandler->WaitForEvent(pHMHandleData->hWin32Handle, lpfdwEvtMask,668 return pDevData->iohandler->WaitForEvent(pHMHandleData->hWin32Handle, pDevData->dwEventMask, lpfdwEvtMask, 558 669 lpo, NULL, (DWORD)pDevData); 559 670 } -
trunk/src/kernel32/initkernel32.cpp
r7564 r7567 1 /* $Id: initkernel32.cpp,v 1.1 0 2001-12-07 11:28:11sandervl Exp $1 /* $Id: initkernel32.cpp,v 1.11 2001-12-07 14:13:37 sandervl Exp $ 2 2 * 3 3 * KERNEL32 DLL entry point … … 217 217 dprintf(("kernel32 exit %d\n", ulReason)); 218 218 219 HMDeviceCommClass::CloseOverlappedIOHandlers();220 221 219 //Flush and delete all open memory mapped files 222 220 Win32MemMap::deleteAll(); -
trunk/src/kernel32/oslibdos.cpp
r7532 r7567 1 /* $Id: oslibdos.cpp,v 1. 89 2001-12-03 12:13:09sandervl Exp $ */1 /* $Id: oslibdos.cpp,v 1.90 2001-12-07 14:13:37 sandervl Exp $ */ 2 2 /* 3 3 * Wrappers for OS/2 Dos* API … … 2953 2953 //****************************************************************************** 2954 2954 //****************************************************************************** 2955 void OSLibDosExitThread(ULONG retcode) 2956 { 2957 DosExit(EXIT_THREAD, retcode); 2958 } 2959 //****************************************************************************** 2960 //****************************************************************************** 2955 2961 DWORD OSLibDosDevConfig(PVOID pdevinfo, 2956 2962 ULONG item) -
trunk/src/kernel32/oslibdos.h
r7532 r7567 1 /* $Id: oslibdos.h,v 1.4 1 2001-12-03 12:13:09sandervl Exp $ */1 /* $Id: oslibdos.h,v 1.42 2001-12-07 14:13:38 sandervl Exp $ */ 2 2 3 3 /* … … 360 360 DWORD OSLibDosDevConfig(PVOID pdevinfo, ULONG item); 361 361 void OSLibDosSleep(ULONG msecs); 362 void OSLibDosExitThread(ULONG retcode); 362 363 363 364 DWORD OSLibDosSetPriority(ULONG tid, int priority); -
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 -
trunk/src/kernel32/overlappedio.h
r7564 r7567 1 /* $Id: overlappedio.h,v 1. 5 2001-12-07 11:28:11sandervl Exp $ */1 /* $Id: overlappedio.h,v 1.6 2001-12-07 14:13:38 sandervl Exp $ */ 2 2 3 3 /* … … 13 13 #define __OVERLAPPEDIO_H__ 14 14 15 #define NR_ASYNC_OPERATIONS 315 #define NR_ASYNC_OPERATIONS 4 16 16 #define ASYNC_INDEX_READ 0 17 17 #define ASYNC_INDEX_WRITE 1 18 18 #define ASYNC_INDEX_POLL 2 19 #define ASYNC_INDEX_BUSY 3 19 20 20 21 #define ASYNCIO_READ 1 … … 31 32 } OVERLAPPED_THREAD_PARAM, *LPOVERLAPPED_THREAD_PARAM; 32 33 33 typedef struct tagOVERLAPPED_ODIN{34 DWORD dwAsyncType;35 HANDLE hHandle;36 LPCVOID lpBuffer;37 DWORD nNumberOfBytes;38 DWORD dwTimeOut;39 LPOVERLAPPED lpOverlapped;40 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine;41 DWORD *lpdwResult;42 DWORD dwLastError;43 DWORD dwUserData;44 tagOVERLAPPED_ODIN *next;45 } ASYNCIOREQUEST, *LPASYNCIOREQUEST;46 34 47 typedef BOOL (* LPOVERLAPPED_HANDLER)(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut); 35 class ASYNCIOREQUEST 36 { 37 public: 38 ASYNCIOREQUEST() 39 { 40 memset(this, 0, sizeof(ASYNCIOREQUEST)); 41 hEventCancel = ::CreateEventA(NULL, TRUE, FALSE, NULL); 42 if(hEventCancel == 0) DebugInt3(); 43 }; 44 45 ~ASYNCIOREQUEST() 46 { 47 ::CloseHandle(hEventCancel); 48 }; 49 50 DWORD dwAsyncType; 51 HANDLE hHandle; 52 LPCVOID lpBuffer; 53 DWORD nNumberOfBytes; 54 DWORD dwTimeOut; 55 LPOVERLAPPED lpOverlapped; 56 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine; 57 DWORD *lpdwResult; 58 DWORD dwLastError; 59 DWORD dwEventMask; 60 DWORD dwUserData; 61 HANDLE hEventCancel; 62 ASYNCIOREQUEST *next; 63 }; 64 65 typedef ASYNCIOREQUEST *LPASYNCIOREQUEST; 66 67 typedef DWORD (* LPOVERLAPPED_HANDLER)(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut); 48 68 49 69 enum OverlappedIOError { … … 78 98 79 99 BOOL WaitForEvent(HANDLE hHandle, 100 DWORD dwEventMask, 80 101 LPDWORD lpfdwEvtMask, 81 102 LPOVERLAPPED lpOverlapped, … … 116 137 //[ASYNC_INDEX_WRITE] list of pending write (full-duplex mode) operations 117 138 //[ASYNC_INDEX_POLL] list of pending poll operations 139 //[ASYNC_INDEX_BUSY] list of operations that are being handled 118 140 LPASYNCIOREQUEST pending[NR_ASYNC_OPERATIONS]; 119 141 -
trunk/src/kernel32/thread.cpp
r7532 r7567 1 /* $Id: thread.cpp,v 1.3 8 2001-12-03 12:13:10sandervl Exp $ */1 /* $Id: thread.cpp,v 1.39 2001-12-07 14:13:38 sandervl Exp $ */ 2 2 3 3 /* … … 325 325 rc = AsmCallThreadHandler(winthread, userdata); 326 326 327 HMSetThreadTerminated(GetCurrentThread()); 328 winteb->o.odin.exceptFrame = 0; 329 Win32DllBase::detachThreadFromAllDlls(); //send DLL_THREAD_DETACH message to all dlls 330 Win32DllBase::tlsDetachThreadFromAllDlls(); //destroy TLS structures of all dlls 331 WinExe->tlsDetachThread(); //destroy TLS structure of main exe 332 DestroyTIB(); 333 OS2UnsetExceptionHandler((void *)&exceptFrame); 327 if(fExitProcess) { 328 OSLibDosExitThread(rc); 329 } 330 else { 331 HMSetThreadTerminated(GetCurrentThread()); 332 winteb->o.odin.exceptFrame = 0; 333 Win32DllBase::detachThreadFromAllDlls(); //send DLL_THREAD_DETACH message to all dlls 334 Win32DllBase::tlsDetachThreadFromAllDlls(); //destroy TLS structures of all dlls 335 if(WinExe) WinExe->tlsDetachThread(); //destroy TLS structure of main exe 336 DestroyTIB(); 337 OS2UnsetExceptionHandler((void *)&exceptFrame); 338 } 334 339 335 340 return rc; -
trunk/src/kernel32/winexelx.cpp
r5567 r7567 1 /* $Id: winexelx.cpp,v 1. 9 2001-04-22 10:38:11sandervl Exp $ */1 /* $Id: winexelx.cpp,v 1.10 2001-12-07 14:13:39 sandervl Exp $ */ 2 2 3 3 /* … … 123 123 OS2UnsetExceptionHandler((void *)&exceptFrame); 124 124 125 ExitProcess(rc); 125 126 return rc; 126 127 } -
trunk/src/kernel32/wprocess.cpp
r7564 r7567 1 /* $Id: wprocess.cpp,v 1.14 0 2001-12-07 11:28:11sandervl Exp $ */1 /* $Id: wprocess.cpp,v 1.141 2001-12-07 14:13:39 sandervl Exp $ */ 2 2 3 3 /* … … 420 420 SetOS2ExceptionChain(-1); 421 421 422 HMDeviceCommClass::CloseOverlappedIOHandlers(); 423 422 424 if(WinExe) { 423 425 delete(WinExe); 424 426 WinExe = NULL; 425 427 } 426 427 HMDeviceCommClass::CloseOverlappedIOHandlers();428 428 429 429 //Note: Needs to be done after deleting WinExe (destruction of exe + dll objects)
Note:
See TracChangeset
for help on using the changeset viewer.