VirtualBox

Changeset 1652 in vbox


Ignore:
Timestamp:
Mar 23, 2007 9:59:03 AM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
19785
Message:

Try it with overlapped writes then.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Serial/DrvNamedPipe.cpp

    r1651 r1652  
    7979    /* File handle of the named pipe. */
    8080    RTFILE              NamedPipe;
     81    /* Dummy overlapped structure. */
     82    OVERLAPPED          Overlapped;
    8183#else /* !__WIN__ */
    8284    /** Socket handle of the local socket for server. */
     
    113115        if (VBOX_FAILURE(rc))
    114116        {
     117            Log(("drvNamedPipeRead: RTFileRead returned Vrc\n", rc));
    115118            if (rc == VERR_EOF)
    116119            {
    117120                RTFILE tmp = pData->NamedPipe;
    118                 pData->NamedPipe = NIL_RTFILE;
    119 #if 0
    120121                FlushFileBuffers((HANDLE)tmp);
    121 #endif
    122                 DisconnectNamedPipe((HANDLE)tmp);
    123                 RTFileClose(tmp);
     122                if (!pData->fIsServer)
     123                {
     124                    pData->NamedPipe = NIL_RTFILE;
     125                    DisconnectNamedPipe((HANDLE)tmp);
     126                    RTFileClose(tmp);
     127                }
    124128            }
    125129            cbReallyRead = 0;
     
    170174    {
    171175        unsigned cbWritten;
    172 #if 0
    173         rc = RTFileWrite(pData->NamedPipe, pvBuf, *cbWrite, &cbWritten);
    174 #else
    175         cbWritten = *cbWrite;
    176 #endif
     176        pData->Overlapped.Offset     = 0;
     177        pData->Overlapped.OffsetHigh = 0;
     178        if (!WriteFile((HANDLE)pData->NamedPipe, pvBuf, *cbWrite, NULL, &pData->Overlapped))
     179        {
     180            DWORD uError = GetLastError();
     181
     182            if (uError != ERROR_IO_PENDING)
     183                rc = RTErrConvertFromWin32(uError);
     184
     185            Log(("drvNamedPipeWrite: WriteFile returned %d (%Vrc)\n", uError, rc));
     186        }
     187
    177188        if (VBOX_FAILURE(rc))
    178189        {
     
    180191            {
    181192                RTFILE tmp = pData->NamedPipe;
    182                 pData->NamedPipe = NIL_RTFILE;
    183 #if 0
    184193                FlushFileBuffers((HANDLE)tmp);
    185 #endif
    186                 DisconnectNamedPipe((HANDLE)tmp);
    187                 RTFileClose(tmp);
     194                if (!pData->fIsServer)
     195                {
     196                    pData->NamedPipe = NIL_RTFILE;
     197                    DisconnectNamedPipe((HANDLE)tmp);
     198                    RTFileClose(tmp);
     199                }
    188200            }
    189201            cbWritten = 0;
     
    362374    if (fIsServer)
    363375    {
    364         HANDLE hPipe = CreateNamedPipe(pData->pszLocation, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, 32, 32, 10000, NULL);
     376        HANDLE hPipe = CreateNamedPipe(pData->pszLocation, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, 32, 32, 10000, NULL);
    365377        if (hPipe == INVALID_HANDLE_VALUE)
    366378        {
     
    382394            return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("NamedPipe#%d failed to connect to named pipe %s"), pDrvIns->iInstance, pszLocation);
    383395    }
     396
     397    memset(&pData->Overlapped, 0, sizeof(pData->Overlapped));
     398    pData->Overlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
     399
    384400#else /* !__WIN__ */
    385401    int s;
     
    444460    if (pData->NamedPipe != NIL_RTFILE)
    445461    {
    446 #if 0
    447462        FlushFileBuffers((HANDLE)pData->NamedPipe);
    448         DisconnectNamedPipe((HANDLE)pData->NamedPipe);
    449 #endif
     463        if (!pData->fIsServer)
     464            DisconnectNamedPipe((HANDLE)pData->NamedPipe);
     465
    450466        RTFileClose(pData->NamedPipe);
     467        CloseHandle(pData->Overlapped.hEvent);
    451468    }
    452469#else /* !__WIN__ */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette