void AsioSessionState::close()
{
    Lock lock(mSessionPtr->mDisableIoMutex);
    if (!mSessionPtr->mDisableIo)
    {
        implClose();
        mSessionPtr->mDisableIo = true;
    }
}
    void Win32NamedPipeClientTransport::implConnectAsync(
        ClientTransportCallback &clientStub,
        unsigned int timeoutMs)
    {
        RCF_UNUSED_VARIABLE(timeoutMs);

        implClose();

        mpClientStub = &clientStub;

        HANDLE hPipe = INVALID_HANDLE_VALUE;

        hPipe = CreateFile( 
            mPipeName.c_str(),      // pipe name 
            GENERIC_READ |          // read and write access 
            GENERIC_WRITE, 
            0,                      // no sharing 
            mpSec,                  // default security attributes
            OPEN_EXISTING,          // opens existing pipe 
            FILE_FLAG_OVERLAPPED,   // non-blocking
            NULL);                  // no template file 

        DWORD dwErr = GetLastError();

        RecursiveLock lock(mOverlappedPtr->mMutex);

        mOverlappedPtr->mOpType = OverlappedAmi::Connect;

        if (hPipe != INVALID_HANDLE_VALUE)
        {
            mhPipe = hPipe;

            if (mpIoService)
            {
                mSocketPtr.reset( new AsioPipeHandle(*mpIoService, mhPipe) );
                mAsioTimerPtr.reset( new AsioDeadlineTimer(getAmiThreadPool().getIoService()) );
            }

            AsioErrorCode ec;

            //AmiIoHandler(mOverlappedPtr, ec)();

            mpIoService->post( AmiIoHandler(mOverlappedPtr, ec) );
        }
        else
        {
            AsioErrorCode ec(
                dwErr,
                ASIO_NS::error::get_system_category());

            mpIoService->post( AmiIoHandler(mOverlappedPtr, ec) );
        }
    }
    void AsioSessionState::close()
    {
        RCF2_TRACE("")(this);

        Lock lock(mMutex);
        if (!mHasBeenClosed)
        {
            implClose();
            mDemuxerPtr.reset();
            mHasBeenClosed = true;
        }
    }