Changeset 7567 for trunk/src


Ignore:
Timestamp:
Dec 7, 2001, 3:13:39 PM (24 years ago)
Author:
sandervl
Message:

overlapped io, com, thread & process updates

Location:
trunk/src/kernel32
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/HandleManager.cpp

    r7549 r7567  
    1 /* $Id: HandleManager.cpp,v 1.83 2001-12-05 14:15:56 sandervl Exp $ */
     1/* $Id: HandleManager.cpp,v 1.84 2001-12-07 14:13:36 sandervl Exp $ */
    22
    33/*
     
    10731073    HMHandleTemp.dwFlags    = dwFlagsAndAttributes;
    10741074    HMHandleTemp.lpHandlerData = NULL;
     1075    HMHandleTemp.hWin32Handle  = iIndexNew;
    10751076    HMHandleTemp.lpDeviceData  = pDevData;
    10761077  }
  • trunk/src/kernel32/hmcomm.cpp

    r7564 r7567  
    1 /* $Id: hmcomm.cpp,v 1.28 2001-12-07 11:28:09 sandervl Exp $ */
     1/* $Id: hmcomm.cpp,v 1.29 2001-12-07 14:13:36 sandervl Exp $ */
    22
    33/*
     
    2525#include "dbglocal.h"
    2626
    27 //#define TESTING_COMM
     27#define TESTING_COMM
    2828#ifdef TESTING_COMM
    2929#undef dprintf
     
    5858#define BaudTableSize (sizeof(BaudTable)/sizeof(BAUDTABLEENTRY))
    5959
    60 static BOOL CommReadIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut);
    61 static BOOL CommWriteIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut);
    62 static BOOL CommPollIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut);
     60static DWORD CommReadIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut);
     61static DWORD CommWriteIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut);
     62static DWORD CommPollIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut);
    6363
    6464//******************************************************************************
     
    287287    dprintf(("HMComm: Serial communication port close request"));
    288288
    289     if(pDevData && pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED)
    290     {
    291         DebugInt3();
    292     }
    293289    delete pHMHandleData->lpHandlerData;
    294290    return OSLibDosClose(pHMHandleData->hHMHandle);
     
    297293//Overlapped read handler
    298294//******************************************************************************
    299 BOOL CommReadIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut)
    300 {
    301     return FALSE;
     295DWORD 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();
    302337}
    303338//******************************************************************************
    304339//Overlapped write handler
    305340//******************************************************************************
    306 BOOL CommWriteIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut)
    307 {
    308     return FALSE;
     341DWORD 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();
    309371}
    310372//******************************************************************************
    311373//Overlapped WaitCommEvent handler
    312374//******************************************************************************
    313 BOOL CommPollIOHandler(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut)
    314 {
     375DWORD 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
    315395    *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;
    317433}
    318434/*****************************************************************************
     
    370486    }
    371487
    372     //testestestest
    373     dprintf2(("Bytes to write:"));
    374     for(int i=0;i<nNumberOfBytesToWrite;i++) {
    375         dprintf2(("%x %c", ((char *)lpBuffer)[i], ((char *)lpBuffer)[i]));
    376     }
    377     //testestestset
    378 
    379488    ret = OSLibDosWrite(pHMHandleData->hHMHandle, (LPVOID)lpBuffer, nNumberOfBytesToWrite,
    380489                        &ulBytesWritten);
     
    445554    }
    446555
     556#ifdef DEBUG
    447557    RXQUEUE qInfo;
    448558    ULONG ulLen = sizeof(qInfo);
     
    453563                                &qInfo,ulLen,&ulLen);
    454564    dprintf(("ASYNC_GETINQUECOUNT -> qInfo.cch %d (queue size %d) rc %d", qInfo.cch, qInfo.cb, rc));
     565#endif
    455566
    456567    ret = OSLibDosRead(pHMHandleData->hHMHandle, (LPVOID)lpBuffer, nNumberOfBytesToRead,
     
    555666        if(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED)
    556667        {
    557             return pDevData->iohandler->WaitForEvent(pHMHandleData->hWin32Handle, lpfdwEvtMask,
     668            return pDevData->iohandler->WaitForEvent(pHMHandleData->hWin32Handle, pDevData->dwEventMask, lpfdwEvtMask,
    558669                                                     lpo, NULL, (DWORD)pDevData);
    559670        }
  • trunk/src/kernel32/initkernel32.cpp

    r7564 r7567  
    1 /* $Id: initkernel32.cpp,v 1.10 2001-12-07 11:28:11 sandervl Exp $
     1/* $Id: initkernel32.cpp,v 1.11 2001-12-07 14:13:37 sandervl Exp $
    22 *
    33 * KERNEL32 DLL entry point
     
    217217    dprintf(("kernel32 exit %d\n", ulReason));
    218218
    219     HMDeviceCommClass::CloseOverlappedIOHandlers();
    220 
    221219    //Flush and delete all open memory mapped files
    222220    Win32MemMap::deleteAll();
  • trunk/src/kernel32/oslibdos.cpp

    r7532 r7567  
    1 /* $Id: oslibdos.cpp,v 1.89 2001-12-03 12:13:09 sandervl Exp $ */
     1/* $Id: oslibdos.cpp,v 1.90 2001-12-07 14:13:37 sandervl Exp $ */
    22/*
    33 * Wrappers for OS/2 Dos* API
     
    29532953//******************************************************************************
    29542954//******************************************************************************
     2955void OSLibDosExitThread(ULONG retcode)
     2956{
     2957  DosExit(EXIT_THREAD, retcode);
     2958}
     2959//******************************************************************************
     2960//******************************************************************************
    29552961DWORD OSLibDosDevConfig(PVOID pdevinfo,
    29562962                         ULONG item)
  • trunk/src/kernel32/oslibdos.h

    r7532 r7567  
    1 /* $Id: oslibdos.h,v 1.41 2001-12-03 12:13:09 sandervl Exp $ */
     1/* $Id: oslibdos.h,v 1.42 2001-12-07 14:13:38 sandervl Exp $ */
    22
    33/*
     
    360360DWORD OSLibDosDevConfig(PVOID pdevinfo, ULONG item);
    361361void  OSLibDosSleep(ULONG msecs);
     362void  OSLibDosExitThread(ULONG retcode);
    362363
    363364DWORD OSLibDosSetPriority(ULONG tid, int priority);
  • trunk/src/kernel32/overlappedio.cpp

    r7564 r7567  
    1 /* $Id: overlappedio.cpp,v 1.6 2001-12-07 11:28:11 sandervl Exp $ */
     1/* $Id: overlappedio.cpp,v 1.7 2001-12-07 14:13:38 sandervl Exp $ */
    22
    33/*
     
    3636    }
    3737
    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;
    3940
    4041    this->lpReadHandler       = lpReadHandler;
     
    165166    LPOVERLAPPED     lpOverlapped;
    166167    HANDLE hEvents[2];
     168    HANDLE hEventsWait[2];
     169    HANDLE hHandle;
    167170    DWORD  ret, dwTimeOut, dwResult;
    168171    int    index;
     
    196199            break;
    197200        }
    198         if(ret == WAIT_FAILED) {
    199             dprintf(("!WARNING!: WaitForMultipleObjects -> WAIT_FAILED!"));
    200             break;
    201         }
    202201        //if hEventExit has been signalled, then we are told to exit
    203202        if(ret == (WAIT_OBJECT_0+1)) {
     
    215214        lpRequest       = pending[index];
    216215        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;
    218220        ::LeaveCriticalSection(&critsect);
    219221
    220222        lpOverlapped = lpRequest->lpOverlapped;;
     223        hHandle      = lpRequest->hHandle;
    221224
    222225        switch(dwOperation) {
    223226        case ASYNCIO_READ:
    224227        case ASYNCIO_READWRITE:
    225             lpReadHandler(lpRequest, &dwResult, NULL);
     228            lpRequest->dwLastError = lpReadHandler(lpRequest, &dwResult, NULL);
    226229            lpOverlapped->Internal     = lpRequest->dwLastError;
    227230            lpOverlapped->InternalHigh = dwResult;
     
    229232                *lpRequest->lpdwResult = dwResult;
    230233            }
     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));
    231238            //wake up user thread
    232239            ::SetEvent(lpOverlapped->hEvent);
    233             delete lpRequest;
    234240            break;
    235241
    236242        case ASYNCIO_WRITE:
    237             lpWriteHandler(lpRequest, &dwResult, NULL);
     243            lpRequest->dwLastError = lpWriteHandler(lpRequest, &dwResult, NULL);
    238244            lpOverlapped->Internal     = lpRequest->dwLastError;
    239245            lpOverlapped->InternalHigh = dwResult;
     
    241247                *lpRequest->lpdwResult = dwResult;
    242248            }
     249            dprintf(("ASYNCIO_WRITE %x finished; result %x, last error %d", lpOverlapped, dwResult, lpRequest->dwLastError));
    243250            //wake up user thread
    244251            ::SetEvent(lpOverlapped->hEvent);
    245             delete lpRequest;
    246252            break;
    247253
    248254        case ASYNCIO_POLL:
     255            hEventsWait[0] = lpRequest->hEventCancel;
     256            hEventsWait[1] = hEventExit;
     257            ret = WAIT_TIMEOUT;
    249258            while(TRUE)
    250259            {
    251260                dwTimeOut = 0;
    252                 if(lpPollHandler(lpRequest, &dwResult, &dwTimeOut) == TRUE) {
     261                lpRequest->dwLastError = lpPollHandler(lpRequest, &dwResult, &dwTimeOut);
     262                if(lpRequest->dwLastError != ERROR_IO_PENDING) {
    253263                    break;
    254264                }
     
    258268                    break;
    259269                }
    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            }
    270290            break;
    271291        }
     292        //remove from in-process list and delete async request object
     293        findAndRemoveRequest(ASYNC_INDEX_BUSY, hHandle);
     294        delete lpRequest;
    272295    }
    273296    return 0;
     
    397420//******************************************************************************
    398421BOOL OverlappedIOHandler::WaitForEvent(HANDLE        hHandle,
     422                                       DWORD         dwEventMask,
    399423                                       LPDWORD       lpfdwEvtMask,
    400424                                       LPOVERLAPPED  lpOverlapped,
     
    424448    lpRequest->dwUserData          = dwUserData;
    425449    lpRequest->dwTimeOut           = dwTimeOut;
     450    lpRequest->dwEventMask         = dwEventMask;
    426451    lpRequest->next                = NULL;
    427452
     
    459484        while(TRUE) {
    460485            lpRequest = findAndRemoveRequest(i, hHandle);
     486
    461487            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                 }
    463492            }
    464493            else break;
     
    518547//******************************************************************************
    519548//******************************************************************************
     549
  • trunk/src/kernel32/overlappedio.h

    r7564 r7567  
    1 /* $Id: overlappedio.h,v 1.5 2001-12-07 11:28:11 sandervl Exp $ */
     1/* $Id: overlappedio.h,v 1.6 2001-12-07 14:13:38 sandervl Exp $ */
    22
    33/*
     
    1313#define __OVERLAPPEDIO_H__
    1414
    15 #define NR_ASYNC_OPERATIONS 3
     15#define NR_ASYNC_OPERATIONS     4
    1616#define ASYNC_INDEX_READ        0
    1717#define ASYNC_INDEX_WRITE       1
    1818#define ASYNC_INDEX_POLL        2
     19#define ASYNC_INDEX_BUSY        3
    1920
    2021#define ASYNCIO_READ        1
     
    3132} OVERLAPPED_THREAD_PARAM, *LPOVERLAPPED_THREAD_PARAM;
    3233
    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;
    4634
    47 typedef BOOL (* LPOVERLAPPED_HANDLER)(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut);
     35class ASYNCIOREQUEST
     36{
     37public:
     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
     65typedef ASYNCIOREQUEST *LPASYNCIOREQUEST;
     66
     67typedef DWORD (* LPOVERLAPPED_HANDLER)(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut);
    4868
    4969enum OverlappedIOError {
     
    7898
    7999     BOOL   WaitForEvent(HANDLE        hHandle,
     100                         DWORD         dwEventMask,
    80101                         LPDWORD       lpfdwEvtMask,
    81102                         LPOVERLAPPED  lpOverlapped,
     
    116137     //[ASYNC_INDEX_WRITE] list of pending write (full-duplex mode) operations
    117138     //[ASYNC_INDEX_POLL]  list of pending poll operations
     139     //[ASYNC_INDEX_BUSY]  list of operations that are being handled
    118140     LPASYNCIOREQUEST     pending[NR_ASYNC_OPERATIONS];
    119141
  • trunk/src/kernel32/thread.cpp

    r7532 r7567  
    1 /* $Id: thread.cpp,v 1.38 2001-12-03 12:13:10 sandervl Exp $ */
     1/* $Id: thread.cpp,v 1.39 2001-12-07 14:13:38 sandervl Exp $ */
    22
    33/*
     
    325325  rc = AsmCallThreadHandler(winthread, userdata);
    326326
    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  }
    334339
    335340  return rc;
  • trunk/src/kernel32/winexelx.cpp

    r5567 r7567  
    1 /* $Id: winexelx.cpp,v 1.9 2001-04-22 10:38:11 sandervl Exp $ */
     1/* $Id: winexelx.cpp,v 1.10 2001-12-07 14:13:39 sandervl Exp $ */
    22
    33/*
     
    123123  OS2UnsetExceptionHandler((void *)&exceptFrame);
    124124
     125  ExitProcess(rc);
    125126  return rc;
    126127}
  • trunk/src/kernel32/wprocess.cpp

    r7564 r7567  
    1 /* $Id: wprocess.cpp,v 1.140 2001-12-07 11:28:11 sandervl Exp $ */
     1/* $Id: wprocess.cpp,v 1.141 2001-12-07 14:13:39 sandervl Exp $ */
    22
    33/*
     
    420420    SetOS2ExceptionChain(-1);
    421421
     422    HMDeviceCommClass::CloseOverlappedIOHandlers();
     423
    422424    if(WinExe) {
    423425        delete(WinExe);
    424426        WinExe = NULL;
    425427    }
    426 
    427     HMDeviceCommClass::CloseOverlappedIOHandlers();
    428428
    429429    //Note: Needs to be done after deleting WinExe (destruction of exe + dll objects)
Note: See TracChangeset for help on using the changeset viewer.