Ignore:
Timestamp:
Dec 9, 2001, 10:55:17 PM (24 years ago)
Author:
sandervl
Message:

added half or full duplex support

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:28 sandervl Exp $ */
     1/* $Id: overlappedio.cpp,v 1.9 2001-12-09 21:55:17 sandervl Exp $ */
    22
    33/*
     
    2727OverlappedIOHandler::OverlappedIOHandler(LPOVERLAPPED_HANDLER lpReadHandler,
    2828                                         LPOVERLAPPED_HANDLER lpWriteHandler,
    29                                          LPOVERLAPPED_HANDLER lpPollHandler) :
     29                                         LPOVERLAPPED_HANDLER lpPollHandler,
     30                                         BOOL fFullDuplex) :
    3031                   hThreadRead(0), hThreadWrite(0), hThreadPoll(0)
    3132{
    3233    OverlappedIOError errcode = OutOfMemory;
     34
     35    this->fFullDuplex = fFullDuplex;
    3336
    3437    if(lpReadHandler == NULL || lpPollHandler == NULL) {
     
    4952    hEventRead   = ::CreateEventA(NULL, FALSE, FALSE, NULL);
    5053    hEventWrite  = ::CreateEventA(NULL, FALSE, FALSE, NULL);
     54
     55    dprintf(("OverlappedIOThread: hEventRead %x hEventWrite %x hEventPoll %x", hEventRead, hEventWrite, hEventPoll));
    5156
    5257    //the exit event semaphore is manual reset, because this event
     
    6368    LPOVERLAPPED_THREAD_PARAM threadparam;
    6469
    65     dwAsyncType = (lpWriteHandler) ? ASYNCIO_READ : ASYNCIO_READWRITE;
     70    dwAsyncType = (lpWriteHandler && fFullDuplex) ? ASYNCIO_READ : ASYNCIO_READWRITE;
    6671    threadparam = (LPOVERLAPPED_THREAD_PARAM)malloc(sizeof(OVERLAPPED_THREAD_PARAM));
    6772    if(!threadparam) goto outofmem;
     
    7075    hThreadRead  = ::CreateThread(NULL, 32*1024, OverlappedIOThread, (LPVOID)threadparam, 0, &dwThreadId);
    7176
    72     if(lpWriteHandler) {
     77    if(lpWriteHandler && fFullDuplex) {
    7378        dwAsyncType |= ASYNCIO_WRITE;
    7479
     
    9095    }
    9196
    92     if((lpPollHandler && !hThreadPoll) || !hThreadRead || (lpWriteHandler && !hThreadWrite))
     97    if((lpPollHandler && !hThreadPoll) || !hThreadRead || (lpWriteHandler && fFullDuplex && !hThreadWrite))
    9398    {
    9499        DebugInt3();
     
    226231        case ASYNCIO_READ:
    227232        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
    229238            lpOverlapped->Internal     = lpRequest->dwLastError;
    230239            lpOverlapped->InternalHigh = dwResult;
     
    331340    lpRequest->next                = NULL;
    332341
    333     if(dwAsyncType == ASYNCIO_READWRITE) {
     342    if(dwAsyncType & ASYNCIO_READWRITE) {
    334343         index = ASYNC_INDEX_READ;
    335344    }
     
    355364
    356365    //wake up async thread
    357     ::SetEvent((dwAsyncType == ASYNCIO_READWRITE) ? hEventRead : hEventWrite);
     366    ::SetEvent((dwAsyncType & ASYNCIO_READWRITE) ? hEventRead : hEventWrite);
    358367
    359368    ::SetLastError(ERROR_IO_PENDING);
Note: See TracChangeset for help on using the changeset viewer.