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

overlapped io, com, thread & process updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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        }
Note: See TracChangeset for help on using the changeset viewer.