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; }