void RTCPInstance::addReport() { // Include a SR or a RR, depending on whether we // have an associated sink or source: if (fSink != NULL) { addSR(); } else if (fSource != NULL) { addRR(); } }
void ClassEditor::onAddTypeSelect() { if (_updatesDisabled || _addType.list == NULL) return; // Callback loop guard std::string name = getStimTypeIdFromSelector(_addType.list); if (!name.empty()) { addSR(); } }
Boolean RTCPInstance::addReport(Boolean alwaysAdd) { // Include a SR or a RR, depending on whether we have an associated sink or source: if (fSink != NULL) { if (!alwaysAdd) { if (!fSink->enableRTCPReports()) return False; // Hack: Don't send a SR during those (brief) times when the timestamp of the // next outgoing RTP packet has been preset, to ensure that that timestamp gets // used for that outgoing packet. (David Bertrand, 2006.07.18) if (fSink->nextTimestampHasBeenPreset()) return False; } addSR(); } else if (fSource != NULL) { addRR(); } return True; }
void ClassEditor::onAddSR() { // Add a S/R addSR(); }
/// ENTRY: Gathers PVT reports; calculates and broadcasts GVT to PVTs void GVT::computeGVT(UpdateMsg *m) { #ifndef CMK_OPTIMIZE if(pose_config.stats) localStats->TimerStart(GVT_TIMER); #endif CProxy_PVT p(ThePVT); CProxy_GVT g(TheGVT); GVTMsg *gmsg = new GVTMsg; POSE_TimeType lastGVT = 0, earliestMsg = POSE_UnsetTS, earlyAny = POSE_UnsetTS; SRentry *tmpSRs = SRs; if (CkMyPe() != 0) startOffset = 1; if (m->runGVTflag == 1) done++; else { // see if message provides new min optGVT or conGVT if ((optGVT < 0) || ((m->optPVT > POSE_UnsetTS) && (m->optPVT < optGVT))) optGVT = m->optPVT; if ((conGVT < 0) || ((m->conPVT > POSE_UnsetTS) && (m->conPVT < conGVT))) conGVT = m->conPVT; if (m->maxSR > earlyAny) earlyAny = m->maxSR; // add send/recv info to SRs /* if (m->numEntries > 0) CkPrintf("GVT recv'd %d SRs from a PE, earliest=%d\n", m->numEntries, m->SRs[0].timestamp);*/ addSR(&SRs, m->SRs, optGVT, m->numEntries); done++; } CkFreeMsg(m); if (done == reportsExpected+startOffset) { // all PVT reports are in #ifndef CMK_OPTIMIZE if(pose_config.stats) localStats->GvtInc(); #endif gvtIterationCount++; done = 0; startOffset = 1; lastGVT = estGVT; // store previous estimate if (lastGVT < 0) lastGVT = 0; estGVT = POSE_UnsetTS; // derive GVT estimate from min optimistic & conservative GVTs estGVT = optGVT; if ((conGVT > POSE_UnsetTS) && (estGVT > POSE_UnsetTS) && (conGVT < estGVT)) estGVT = conGVT; // Check if send/recv activity provides lower possible estimate /* if (SRs) SRs->dump(); else CkPrintf("No SRs reported to GVT!\n");*/ SRentry *tmp = SRs; POSE_TimeType lastSR = POSE_UnsetTS; while (tmp && ((tmp->timestamp <= estGVT) || (estGVT == POSE_UnsetTS))) { lastSR = tmp->timestamp; if (tmp->sends != tmp->recvs) { earliestMsg = tmp->timestamp; break; } tmp = tmp->next; } /* if ((earliestMsg > POSE_UnsetTS) || (earlyAny > POSE_UnsetTS)) CkPrintf("GVT: earlyDiff=%d earlyAny=%d estGVT was %d.\n", earliestMsg, earlyAny, estGVT);*/ if (((earliestMsg < estGVT) && (earliestMsg != POSE_UnsetTS)) || (estGVT == POSE_UnsetTS)) estGVT = earliestMsg; if ((lastSR != POSE_UnsetTS) && (estGVT == POSE_UnsetTS) && (lastSR > lastGVT)) estGVT = lastSR; // check for inactivity if ((optGVT == POSE_UnsetTS) && (earliestMsg == POSE_UnsetTS)) { inactive++; /* if (inactive == 1) { CkPrintf("[%d] Inactive... calling CkWaitQD...\n", CkMyPe()); CkWaitQD(); CkPrintf("[%d] Back from CkWaitQD...\n", CkMyPe()); } */ estGVT = lastGVT; if (inactive == 1) inactiveTime = lastGVT; } else if (estGVT < 0) { estGVT = lastGVT; inactive = 0; } else inactive = 0; // check the estimate //CkPrintf("opt=%d con=%d lastGVT=%d early=%d lastSR=%d et=%d\n", optGVT, conGVT, lastGVT, earliestMsg, lastSR, POSE_endtime); CmiAssert(estGVT >= lastGVT); //if (estGVT % 1000 == 0) //CkPrintf("[%d] New GVT = %d\n", CkMyPe(), estGVT); //CkPrintf("[%d] New GVT = %lld\n", CkMyPe(), estGVT); // check for termination conditions int term = 0; if ((estGVT >= POSE_endtime) && (POSE_endtime > POSE_UnsetTS)) { #if USE_LONG_TIMESTAMPS CkPrintf("At endtime: %lld\n", POSE_endtime); #else CkPrintf("At endtime: %d\n", POSE_endtime); #endif term = 1; } else if (inactive > 2) { #if USE_LONG_TIMESTAMPS CkPrintf("Simulation inactive at time: %lld\n", inactiveTime); #else CkPrintf("Simulation inactive at time: %d\n", inactiveTime); #endif term = 1; } // report the last new GVT estimate to all PVT branches gmsg->estGVT = estGVT; gmsg->done = term; if (term) { //if (POSE_endtime > POSE_UnsetTS) gmsg->estGVT = POSE_endtime + 1; // else gmsg->estGVT++; #if USE_LONG_TIMESTAMPS CkPrintf("Final GVT = %lld\n", gmsg->estGVT); #else CkPrintf("Final GVT = %d\n", gmsg->estGVT); #endif p.setGVT(gmsg); POSE_stop(); } else { p.setGVT(gmsg); if(pose_config.lb_on) { // perform load balancing #ifndef CMK_OPTIMIZE if(pose_config.stats) localStats->SwitchTimer(LB_TIMER); #endif if (CkNumPes() > 1) { nextLBstart++; if (pose_config.lb_skip == nextLBstart) { TheLBG.calculateLocalLoad(); nextLBstart = 0; } } #ifndef CMK_OPTIMIZE if(pose_config.stats) localStats->SwitchTimer(GVT_TIMER); #endif } // transmit data to start next GVT estimation on next GVT branch UpdateMsg *umsg = new UpdateMsg; umsg->maxSR=0; umsg->optPVT = estGVT; umsg->inactive = inactive; umsg->inactiveTime = inactiveTime; umsg->nextLB = nextLBstart; umsg->runGVTflag = 0; g[(CkMyPe()+1) % CkNumPes()].runGVT(umsg); } // reset static data optGVT = conGVT = POSE_UnsetTS; SRentry *cur = SRs; SRs = NULL; while (cur) { tmp = cur->next; delete cur; cur = tmp; } } #ifndef CMK_OPTIMIZE if(pose_config.stats) localStats->TimerStop(); #endif }
/// Reduction point for PVT reports void PVT::reportReduce(UpdateMsg *m) { #ifndef CMK_OPTIMIZE if(pose_config.stats) localStats->TimerStart(GVT_TIMER); #endif CProxy_PVT p(ThePVT); CProxy_GVT g(TheGVT); POSE_TimeType lastGVT = 0, maxSR=0; // see if message provides new min optGVT or conGVT if ((optGVT < 0) || ((m->optPVT > POSE_UnsetTS) && (m->optPVT < optGVT))) optGVT = m->optPVT; if (m->maxSR > 0) maxSR = m->maxSR; addSR(&SRs, m->SRs, optGVT, m->numEntries); rdone++; CkFreeMsg(m); if (rdone == reportsExpected) { // all PVT reports are in UpdateMsg *um; int entryCount = 0; // pack data into um SRentry *tmp = SRs; while (tmp) { if (((tmp->timestamp <= optGVT) || (optGVT == POSE_UnsetTS)) && (tmp->sends != tmp->recvs)) { entryCount++; } tmp = tmp->next; } um = new (entryCount * sizeof(SRentry), 0) UpdateMsg; tmp = SRs; int i=0; while (tmp) { if (((tmp->timestamp <= optGVT) || (optGVT == POSE_UnsetTS)) && (tmp->sends != tmp->recvs)) { um->SRs[i] = *tmp; i++; } tmp = tmp->next; } /* while (tmp && ((tmp->timestamp <= optGVT) || (optGVT == POSE_UnsetTS)) && (tmp->sends != tmp->recvs)) { entryCount++; tmp = tmp->next; } um = new (entryCount * sizeof(SRentry), 0) UpdateMsg; tmp = SRs; int i=0; while (tmp && ((tmp->timestamp <= optGVT) || (optGVT == POSE_UnsetTS)) && (tmp->sends != tmp->recvs)) { um->SRs[i] = *tmp; tmp = tmp->next; i++; } */ um->numEntries = entryCount; um->optPVT = optGVT; um->conPVT = conGVT; um->maxSR = maxSR; um->runGVTflag = 0; if (reportEnd) { //send to computeGVT if (simdone>0) // transmit final info to GVT on PE 0 g[0].computeGVT(um); else { g[gvtTurn].computeGVT(um); // transmit info to GVT gvtTurn = (gvtTurn + 1) % CkNumPes(); // calculate next GVT location } } else { //send to pvt reportReduceTo p[reportReduceTo].reportReduce(um); } // reset static data optGVT = conGVT = POSE_UnsetTS; SRentry *cur = SRs; SRs = NULL; while (cur) { tmp = cur->next; delete cur; cur = tmp; } rdone = 0; } #ifndef CMK_OPTIMIZE if(pose_config.stats) localStats->TimerStop(); #endif }