Exemple #1
0
/***************************************************************************
 *   setStaticFieldFunctionObject
 ***************************************************************************/
bool CCilVm::setStaticFieldFunctionObject( const RID rid,
        const RID ridMethod )
{
    assert( TypeFromToken( ridMethod ) == MDT_METHODDEF );

    //Create function object and store it to static field
    CVmObject newobject;
    RID ridObj = getFunctionObjectRID();

    newobject.setRID( ridObj );
    newobject.setObjectName( getMetaData().getObjectNameRID( ridObj ) );
    newobject.setPrototypeObject( &getPrototypeObject( ridObj ) );
    newobject.setConstructorProperty( ridMethod );
    newobject.setCallProperty( ridMethod );

    getObjectPool().push_back( newobject );

    CVariable var;
    var.setObjectRef( &getObjectPool().back() );

    METHOD_DEF& method = getMetaData().getMethod( ridMethod );
    int32_t iLength = method.iNumArgments;
    assert( iLength >= 0 );

    CVariable varInt( iLength, OPERAND_FLAG_DONTENUM );
    var.refObject->setProperty( STRING_INTERNAL_LENGTH,
                                varInt );

    //Store the ObjectRef to a static field
    setStaticField( rid, var );

    return true;
}
Exemple #2
0
    void HttpSessionFilter::write(const std::vector<ByteBuffer> &byteBuffers)
    {
        // If we write the response directly to network here, we ar at risk of a race
        // condition as the next request may be read in on another connection, before
        // the write completion on this connection has executed.

        // So instead we make a copy of the write buffers, and send a write completion
        // back up. The subsequent read operation will unhook the HTTP session and then 
        // write the response to the network.

        if ( mNetworkSession.mCloseAfterWrite )
        {
            // Special case, if this is the last message being written before the connection closes.
            mpPostFilter->write(byteBuffers);
        }
        else
        {
            std::size_t len = lengthByteBuffers(byteBuffers);
            ReallocBufferPtr bufferPtr = getObjectPool().getReallocBufferPtr();
            bufferPtr->resize(len);
            copyByteBuffers(byteBuffers, bufferPtr->getPtr());
            mWriteBuffers.resize(0);
            mWriteBuffers.push_back(ByteBuffer(bufferPtr));

            mpPreFilter->onWriteCompleted(len);
        }
    }
    void PerformanceData::collect()
    {
        getObjectPool().enumerateBuffers(mInBufferSizes);
        getObjectPool().enumerateOstrstreams(mOutBufferSizes);

        std::size_t inBufferSize = 
            std::accumulate(mInBufferSizes.begin(), mInBufferSizes.end(), std::size_t(0));

        std::size_t outBufferSize = 
            std::accumulate(mOutBufferSizes.begin(), mOutBufferSizes.end(), std::size_t(0));

        Lock lock(mMutex);
        
        mBufferCount = static_cast<boost::uint32_t>(
            mInBufferSizes.size() + mOutBufferSizes.size());

        mTotalBufferSize = static_cast<boost::uint32_t>(
            inBufferSize + outBufferSize);
    }
void AsioSessionState::onNetworkReadCompleted(
    AsioErrorCode error, size_t bytesTransferred)
{
    RCF_LOG_4()(this)(bytesTransferred) << "AsioSessionState - read from socket completed.";

    ThreadTouchGuard threadTouchGuard;

    mLastError = error;

    mBytesReceivedCounter += bytesTransferred;

#ifdef BOOST_WINDOWS

    if (error.value() == ERROR_OPERATION_ABORTED)
    {
        error = AsioErrorCode();
    }

#endif

    if (!error && !mTransport.mStopFlag)
    {
        if (bytesTransferred == 0 && mIssueZeroByteRead)
        {
            // TCP framing.
            if (!mAppReadBufferPtr || !mAppReadBufferPtr.unique())
            {
                mAppReadBufferPtr = getObjectPool().getReallocBufferPtr();
            }
            mAppReadBufferPtr->resize(4);

            mReadBufferRemaining = 4;
            mIssueZeroByteRead = false;
            beginRead();
        }
        else if (mReflecting)
        {
            AsioErrorCode ec;
            onReflectedReadWriteCompleted(ec, bytesTransferred);
        }
        else
        {
            CurrentRcfSessionSentry guard(*mSessionPtr);

            mNetworkReadByteBuffer = ByteBuffer(
                                         mNetworkReadByteBuffer,
                                         0,
                                         bytesTransferred);

            mTransportFilters.empty() ?
            onAppReadWriteCompleted(bytesTransferred) :
            mTransportFilters.back()->onReadCompleted(mNetworkReadByteBuffer);
        }
    }
}
void AsioSessionState::doRegularFraming(size_t bytesTransferred)
{
    RCF_ASSERT_LTEQ(bytesTransferred , mReadBufferRemaining);
    mReadBufferRemaining -= bytesTransferred;
    if (mReadBufferRemaining > 0)
    {
        beginRead();
    }
    else if (mReadBufferRemaining == 0 && mIssueZeroByteRead)
    {
        if (!mAppReadBufferPtr || !mAppReadBufferPtr.unique())
        {
            mAppReadBufferPtr = getObjectPool().getReallocBufferPtr();
        }
        mAppReadBufferPtr->resize(4);

        mReadBufferRemaining = 4;
        mIssueZeroByteRead = false;
        beginRead();
    }
    else
    {
        RCF_ASSERT_EQ(mReadBufferRemaining , 0);
        if (mState == ReadingDataCount)
        {
            ReallocBuffer & readBuffer = *mAppReadBufferPtr;
            RCF_ASSERT_EQ(readBuffer.size() , 4);

            unsigned int packetLength = 0;
            memcpy(&packetLength, &readBuffer[0], 4);
            networkToMachineOrder(&packetLength, 4, 1);

            if (    mTransport.getMaxMessageLength()
                    &&  packetLength > mTransport.getMaxMessageLength())
            {
                sendServerError(RcfError_ServerMessageLength);
            }
            else
            {
                readBuffer.resize(packetLength);
                mReadBufferRemaining = packetLength;
                mState = ReadingData;
                beginRead();
            }
        }
        else if (mState == ReadingData)
        {
            mState = Ready;

            mTransport.getSessionManager().onReadCompleted(
                getSessionPtr());
        }
    }
}
void AsioSessionState::doCustomFraming(size_t bytesTransferred)
{
    RCF_ASSERT_LTEQ(bytesTransferred , mReadBufferRemaining);
    mReadBufferRemaining -= bytesTransferred;
    if (mReadBufferRemaining > 0)
    {
        beginRead();
    }
    else if (mReadBufferRemaining == 0 && mIssueZeroByteRead)
    {
        if (!mAppReadBufferPtr || !mAppReadBufferPtr.unique())
        {
            mAppReadBufferPtr = getObjectPool().getReallocBufferPtr();
        }
        mAppReadBufferPtr->resize(4);

        mReadBufferRemaining = 4;
        mIssueZeroByteRead = false;
        beginRead();
    }
    else
    {
        RCF_ASSERT_EQ(mReadBufferRemaining , 0);
        if (mState == ReadingDataCount)
        {
            ReallocBuffer & readBuffer = *mAppReadBufferPtr;
            RCF_ASSERT_EQ(readBuffer.size() , 4);

            std::size_t messageLength = mTransportFilters[0]->getFrameSize();

            if (    mTransport.getMaxMessageLength()
                    &&  messageLength > mTransport.getMaxMessageLength())
            {
                sendServerError(RcfError_ServerMessageLength);
            }
            else
            {
                RCF_ASSERT( messageLength > 4 );
                readBuffer.resize(messageLength);
                mReadBufferRemaining = messageLength - 4;
                mState = ReadingData;
                beginRead();
            }
        }
        else if (mState == ReadingData)
        {
            mState = Ready;

            mTransport.getSessionManager().onReadCompleted(
                getSessionPtr());
        }
    }
}
void AsioSessionState::read(
    const ByteBuffer &byteBuffer,
    std::size_t bytesRequested)
{
    if (byteBuffer.getLength() == 0 && bytesRequested > 0)
    {
        if (!mNetworkReadBufferPtr || mNetworkReadBufferPtr.unique())
        {
            mNetworkReadBufferPtr = getObjectPool().getReallocBufferPtr();
        }
        mNetworkReadBufferPtr->resize(bytesRequested);
        mNetworkReadByteBuffer = ByteBuffer(mNetworkReadBufferPtr);
    }
    else
    {
        mNetworkReadByteBuffer = ByteBuffer(byteBuffer, 0, bytesRequested);
    }

    RCF_ASSERT_LTEQ(bytesRequested, mNetworkReadByteBuffer.getLength());

    char *buffer = mNetworkReadByteBuffer.getPtr();
    std::size_t bufferLen = mNetworkReadByteBuffer.getLength();

    Lock lock(mSessionPtr->mDisableIoMutex);
    if (!mSessionPtr->mDisableIo)
    {
        if (mSocketOpsMutexPtr)
        {
            Lock lock(*mSocketOpsMutexPtr);
            implRead(buffer, bufferLen);
        }
        else
        {
            implRead(buffer, bufferLen);
        }
    }
}