Ejemplo n.º 1
0
STDMETHODIMP
BasicPacketFlow::OnPacket(UINT16 uStreamNumber, BasePacket** ppPacket)
{
    if (m_bIsDone)
	return HXR_UNEXPECTED;

    PacketStream* pStream = &m_pStreams[uStreamNumber];
    HX_ASSERT(pStream->m_bStreamRegistered);

    BasePacket* pPacket;

    for (; (pPacket = *ppPacket); ppPacket++)
    {
        
        // Do not check for IsStreamDone() because this is part of the
	// resend mechanism
	if (pPacket->IsResendRequested() && pPacket->m_uPriority != 10)
            continue;

        if (!pPacket->IsResendRequested())
            pPacket->SetResendRequested();

        UINT32 ulPos = m_ulResendIDPosition + 1;
        if (ulPos == MAX_RESENDS_PER_SECOND)
            ulPos = 0;

        while (m_pResendIDs[ulPos] && ulPos != m_ulResendIDPosition)
        {
            ulPos++;
            if (ulPos == MAX_RESENDS_PER_SECOND)
                ulPos = 0;
        }

        if (m_pResendIDs[m_ulResendIDPosition = ulPos])
            continue;

        PacketFlowResendCallback* pResendCB =
            new (m_pProc->pc->mem_cache) PacketFlowResendCallback();
        pResendCB->AddRef();
        pResendCB->m_pTransport   = pStream->m_pTransport;
        pResendCB->m_pPacket      = pPacket;
        pResendCB->m_pPacket->AddRef();
        pResendCB->m_pZeroMe	  = m_pResendIDs + m_ulResendIDPosition;

        UINT32 ulMinWaitTime;
        if ((m_pRateManager) && (m_pRateManager->GetActualDeliveryRate() > 60000))
            ulMinWaitTime = 500;
        else
            ulMinWaitTime = 10;

        UINT32 ulTime = rand() % 300 + ulMinWaitTime;

//        printf("%p %p %p %p %p\n", this, m_pProc, m_pProc->pc, m_pProc->pc->engine,
//               m_pProc->pc->engine->schedule);
//        fflush(stdout);

        m_pResendIDs[m_ulResendIDPosition] =
            m_pProc->pc->engine->schedule.enter(
                m_pProc->pc->engine->now + Timeval(0, ulTime * 1000),
                pResendCB);
        pResendCB->Release();
    }

    return HXR_OK;
}