Ignore:
Timestamp:
Dec 5, 2001, 7:06:02 PM (24 years ago)
Author:
sandervl
Message:

overlapped io updates

File:
1 edited

Legend:

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

    r7549 r7550  
    1 /* $Id: overlappedio.cpp,v 1.1 2001-12-05 14:16:38 sandervl Exp $ */
     1/* $Id: overlappedio.cpp,v 1.2 2001-12-05 18:06:02 sandervl Exp $ */
    22
    33/*
     4 * Win32 overlapped IO class
     5 *
     6 * Copyright 2001 Sander van Leeuwen <sandervl@xs4all.nl>
     7 *
    48 * Project Odin Software License can be found in LICENSE.TXT
    5  *
    6  * Win32 COM device access class
    7  *
    8  * 1999 Achim Hasenmueller <achimha@innotek.de>
    9  * 2001 Sander van Leeuwen <sandervl@xs4all.nl>
    10  *
    11  * TODO: Overlapped IO only supports one request at a time
    12  * TODO: Overlapped IO not thread safe
    139 *
    1410 */
     
    1915#include <string.h>
    2016#include <handlemanager.h>
    21 #include "handlenames.h"
    2217#include <heapstring.h>
    23 #include "hmdevice.h"
    24 #include "hmcomm.h"
     18#include "overlappedio.h"
    2519#include "oslibdos.h"
    2620
     
    2923
    3024
    31 DWORD CALLBACK OverlappedIOEventThread(LPVOID lpThreadParam);
    32 DWORD CALLBACK OverlappedIOReadWriteThread(LPVOID lpThreadParam);
    33 
    34 //******************************************************************************
    35 //******************************************************************************
    36 
    37 
    38 //******************************************************************************
    39 //******************************************************************************
     25//******************************************************************************
     26//******************************************************************************
     27OverlappedIOHandler::OverlappedIOHandler(LPOVERLAPPED_HANDLER lpReadHandler,
     28                                         LPOVERLAPPED_HANDLER lpWriteHandler,
     29                                         LPOVERLAPPED_HANDLER lpPollHandler) :
     30                   hThreadRead(0), hThreadWrite(0), hThreadPoll(0)
     31{
     32    OverlappedIOError errcode = OutOfMemory;
     33
     34    pending                  = NULL;
     35    this->lpReadHandler      = lpReadHandler;
     36    this->lpWriteHandler     = lpWriteHandler;
     37    this->lpPollHandler      = lpPollHandler;
     38
     39    ::InitializeCriticalSection(&critsect);
     40    hEventPoll   = ::CreateEventA(NULL, TRUE, FALSE, NULL);
     41    hEventRead   = ::CreateEventA(NULL, TRUE, FALSE, NULL);
     42    hEventWrite  = ::CreateEventA(NULL, TRUE, FALSE, NULL);
     43    hEventExit   = ::CreateEventA(NULL, TRUE, FALSE, NULL);
     44    if(!hEventPoll || !hEventRead || !hEventWrite || !hEventExit)
     45    {
     46        DebugInt3();
     47        errcode = EventCreationFailed;
     48        goto failed;
     49    }
     50   
     51    DWORD dwThreadId;
     52    LPOVERLAPPED_THREAD_PARAM threadparam;
     53
     54    threadparam = (LPOVERLAPPED_THREAD_PARAM)malloc(sizeof(OVERLAPPED_THREAD_PARAM));
     55    if(!threadparam) goto outofmem;
     56
     57    threadparam->fEvent          = (lpWriteHandler) ? EVENT_READ : EVENT_READWRITE;
     58    threadparam->lpOverlappedObj = this;
     59    hThreadRead  = ::CreateThread(NULL, 32*1024, OverlappedIOThread, (LPVOID)threadparam, 0, &dwThreadId);
     60    if(lpWriteHandler) {
     61        threadparam = (LPOVERLAPPED_THREAD_PARAM)malloc(sizeof(OVERLAPPED_THREAD_PARAM));
     62        if(!threadparam) goto outofmem;
     63        threadparam->fEvent          = EVENT_WRITE;
     64        threadparam->lpOverlappedObj = this;
     65        hThreadWrite = ::CreateThread(NULL, 32*1024, OverlappedIOThread, (LPVOID)threadparam, 0, &dwThreadId);
     66    }
     67
     68    if(lpPollHandler) {
     69        threadparam = (LPOVERLAPPED_THREAD_PARAM)malloc(sizeof(OVERLAPPED_THREAD_PARAM));
     70        if(!threadparam) goto outofmem;
     71        threadparam->fEvent          = EVENT_POLL;
     72        threadparam->lpOverlappedObj = this;
     73        hThreadPoll  = ::CreateThread(NULL, 32*1024, OverlappedIOThread, (LPVOID)threadparam, 0, &dwThreadId);
     74    }
     75
     76    if((lpPollHandler && !hThreadPoll) || !hThreadRead || (lpWriteHandler && !hThreadWrite))
     77    {
     78        DebugInt3();
     79        errcode = ThreadCreationFailed;
     80        goto failed;
     81    }
     82    return;
     83
     84outofmem:
     85    errcode = OutOfMemory;
     86    //fall through
     87failed:
     88    //SvL: NOTE: We might not failed gracefully when threads have already been
     89    //           created. (thread accessing memory that has been freed)
     90    //           Don't feel like wasting time to fix this as this should never
     91    //           happen anyway.
     92    if(hEventExit) {
     93        ::SetEvent(hEventExit);
     94        ::CloseHandle(hEventExit);
     95    }
     96
     97    if(hEventRead)   ::CloseHandle(hEventRead);
     98    if(hEventWrite)  ::CloseHandle(hEventWrite);
     99    if(hEventPoll)   ::CloseHandle(hEventPoll);
     100
     101    if(hThreadRead)  ::CloseHandle(hThreadRead);
     102    if(hThreadPoll)  ::CloseHandle(hThreadPoll);
     103    if(hThreadWrite) ::CloseHandle(hThreadWrite);
     104    ::DeleteCriticalSection(&critsect);
     105
     106    throw(errcode);
     107}
     108//******************************************************************************
     109//******************************************************************************
     110OverlappedIOHandler::~OverlappedIOHandler()
     111{
     112    dprintf(("~OverlappedIOHandler: signalling overlapped serial threads"));
     113    ::SetEvent(hEventExit);
     114
     115    ::CloseHandle(hEventExit);
     116    ::CloseHandle(hEventRead);
     117    ::CloseHandle(hEventWrite);
     118    ::CloseHandle(hEventPoll);
     119
     120    ::CloseHandle(hThreadRead);
     121    if(hThreadPoll)  ::CloseHandle(hThreadPoll);
     122    if(hThreadWrite) ::CloseHandle(hThreadWrite);
     123
     124    DeleteCriticalSection(&critsect);
     125}
     126//******************************************************************************
     127//******************************************************************************
     128DWORD CALLBACK OverlappedIOThread(LPVOID lpThreadParam)
     129{
     130    LPOVERLAPPED_THREAD_PARAM threadparam = (LPOVERLAPPED_THREAD_PARAM)lpThreadParam;
     131    DWORD fEvent;
     132    OverlappedIOHandler *lpOverlappedObj;
     133
     134    if(threadparam == NULL) {
     135        DebugInt3();
     136        return 0;
     137    }
     138    lpOverlappedObj = threadparam->lpOverlappedObj;
     139    fEvent          = threadparam->fEvent;
     140    //free thread parameter first
     141    free(threadparam);
     142
     143    return lpOverlappedObj->threadHandler(fEvent);
     144}
     145//******************************************************************************
     146//******************************************************************************
     147DWORD OverlappedIOHandler::threadHandler(DWORD fEvent)
     148{
     149    HANDLE hEvents[2];
     150    DWORD  ret;
     151
     152    dprintf(("OverlappedIOThread: started for event %d", fEvent));
     153    switch(fEvent) {
     154    case EVENT_READ:
     155    case EVENT_READWRITE:
     156        hEvents[0] = hEventRead;
     157        break;
     158
     159    case EVENT_WRITE:
     160        hEvents[0] = hEventWrite;
     161        break;
     162
     163    case EVENT_POLL:
     164        hEvents[0] = hEventPoll;
     165        break;
     166    default:
     167        DebugInt3();
     168    }
     169    hEvents[1] = hEventExit;
     170
     171    while(TRUE) {
     172        ret = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);
     173        if(ret == WAIT_FAILED) {
     174            dprintf(("!WARNING!: WaitForMultipleObjects -> WAIT_FAILED!"));
     175            break;
     176        }
     177        if(ret == WAIT_FAILED) {
     178            dprintf(("!WARNING!: WaitForMultipleObjects -> WAIT_FAILED!"));
     179            break;
     180        }
     181        //if hEventExit has been signalled, then we are told to exit
     182        if(ret == (WAIT_OBJECT_0+1)) {
     183            dprintf(("end of threadHandler signalled"));
     184            break;
     185        }
     186    }
     187    return 0;
     188}
     189//******************************************************************************
     190//******************************************************************************
     191BOOL OverlappedIOHandler::WriteFile(HANDLE        hOS2Handle,
     192                                    LPCVOID       lpBuffer,
     193                                    DWORD         nNumberOfBytesToWrite,
     194                                    LPDWORD       lpNumberOfBytesWritten,
     195                                    LPOVERLAPPED  lpOverlapped,
     196                                    LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
     197{
     198    return FALSE;
     199}
     200//******************************************************************************
     201//******************************************************************************
     202BOOL OverlappedIOHandler::ReadFile(HANDLE        hOS2Handle,
     203                                   LPCVOID       lpBuffer,
     204                                   DWORD         nNumberOfBytesToRead,
     205                                   LPDWORD       lpNumberOfBytesRead,
     206                                   LPOVERLAPPED  lpOverlapped,
     207                                   LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
     208{
     209    return FALSE;
     210}
     211//******************************************************************************
     212//******************************************************************************
     213BOOL OverlappedIOHandler::CancelIo(HANDLE hOS2Handle)
     214{
     215    return FALSE;
     216}
     217//******************************************************************************
     218//******************************************************************************
     219BOOL OverlappedIOHandler::GetOverlappedResult(HANDLE        hOS2Handle,
     220                                              LPOVERLAPPED  lpoOverlapped,
     221                                              LPDWORD       lpcbTransfer,
     222                                              DWORD         dwTimeout)
     223{
     224    return FALSE;
     225}
     226//******************************************************************************
     227//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.