void LoadPattern::applyLoad(double pseudoTime) { // first determine the load factor if (theSeries != 0 && isConstant != 0) { loadFactor = theSeries->getFactor(pseudoTime); loadFactor *= scaleFactor; } NodalLoad *nodLoad; NodalLoadIter &theNodalIter = this->getNodalLoads(); while ((nodLoad = theNodalIter()) != 0) nodLoad->applyLoad(loadFactor); ElementalLoad *eleLoad; ElementalLoadIter &theElementalIter = this->getElementalLoads(); while ((eleLoad = theElementalIter()) != 0) eleLoad->applyLoad(loadFactor); SP_Constraint *sp; SP_ConstraintIter &theIter = this->getSPs(); while ((sp = theIter()) != 0) sp->applyConstraint(loadFactor); }
SInt64 ReflectorSessionCheckTask::Run() { OSRefTable* reflectorSessionMap = QTSServerInterface::GetServer()->GetReflectorSessionMap(); OSMutexLocker locker(reflectorSessionMap->GetMutex()); SInt64 sNowTime = OS::Milliseconds(); for (OSRefHashTableIter theIter(reflectorSessionMap->GetHashTable()); !theIter.IsDone(); theIter.Next()) { OSRef* theRef = theIter.GetCurrent(); ReflectorSession* theSession = (ReflectorSession*)theRef->GetObject(); SInt64 sCreateTime = theSession->GetInitTimeMS(); if( (theSession->GetNumOutputs() == 0) && (sNowTime-sCreateTime >= 20*1000) ) { QTSS_RoleParams theParams; theParams.easyFreeStreamParams.inStreamName = theSession->GetStreamName(); UInt32 numModules = QTSServerInterface::GetNumModulesInRole(QTSSModule::kEasyCMSFreeStreamRole); for ( UInt32 currentModule=0;currentModule < numModules; currentModule++) { qtss_printf("没有客户端观看当前转发媒体\n"); QTSSModule* theModule = QTSServerInterface::GetModule(QTSSModule::kEasyCMSFreeStreamRole, currentModule); (void)theModule->CallDispatch(Easy_CMSFreeStream_Role, &theParams); } } } return 30*1000;//30s }
//只是将DeviceSession移出DeviceSessionMap,不会删除对象 void QTSServerInterface::RemoveAllDeviceSession() { OSMutexLocker locker(fDeviceSessionMap->GetMutex()); for (OSRefHashTableIter theIter(fDeviceSessionMap->GetHashTable()); !theIter.IsDone(); theIter.Next()) { fDeviceSessionMap->TryUnRegister(theIter.GetCurrent()); } }
void MultiSupportPattern::applyLoad(double time) { SP_Constraint *sp; SP_ConstraintIter &theIter = this->getSPs(); while ((sp = theIter()) != 0) sp->applyConstraint(time); }
void MultiSupportPattern::Print(OPS_Stream &s, int flag) { s << "MultiSupportPattern tag: " << this->getTag() << endln; SP_Constraint *sp; SP_ConstraintIter &theIter = this->getSPs(); while ((sp = theIter()) != 0) sp->Print(s, flag); }
void QTSServerInterface::KillAllRTPSessions() { OSMutexLocker locker(fRTPMap->GetMutex()); for (OSRefHashTableIter theIter(fRTPMap->GetHashTable()); !theIter.IsDone(); theIter.Next()) { OSRef* theRef = theIter.GetCurrent(); RTPSessionInterface* theSession = (RTPSessionInterface*)theRef->GetObject(); theSession->Signal(Task::kKillEvent); } }
RTPSessionInterface* RTPStatsUpdaterTask::GetNewestSession(OSRefTable* inRTPSessionMap) { //Caller must lock down the RTP session map SInt64 theNewestPlayTime = 0; RTPSessionInterface* theNewestSession = NULL; //use the session map to iterate through all the sessions, finding the most //recently connected client for (OSRefHashTableIter theIter(inRTPSessionMap->GetHashTable()); !theIter.IsDone(); theIter.Next()) { OSRef* theRef = theIter.GetCurrent(); RTPSessionInterface* theSession = (RTPSessionInterface*)theRef->GetObject(); Assert(theSession->GetSessionCreateTime() > 0); if (theSession->GetSessionCreateTime() > theNewestPlayTime) { theNewestPlayTime = theSession->GetSessionCreateTime(); theNewestSession = theSession; } } return theNewestSession; }
void QTSServer::BuildModuleRoleArrays() { OSQueueIter theIter(&sModuleQueue); QTSSModule* theModule = NULL; // Make sure these variables are cleaned out in case they've already been inited. DestroyModuleRoleArrays(); // Loop through all the roles of all the modules, recording the number of // modules in each role, and also recording which modules are doing what. for (UInt32 x = 0; x < QTSSModule::kNumRoles; x++) { sNumModulesInRole[x] = 0; for (theIter.Reset(); !theIter.IsDone(); theIter.Next()) { theModule = (QTSSModule*)theIter.GetCurrent()->GetEnclosingObject(); if (theModule->RunsInRole(x)) sNumModulesInRole[x] += 1; } if (sNumModulesInRole[x] > 0) { UInt32 moduleIndex = 0; sModuleArray[x] = new QTSSModule*[sNumModulesInRole[x] + 1]; for (theIter.Reset(); !theIter.IsDone(); theIter.Next()) { theModule = (QTSSModule*)theIter.GetCurrent()->GetEnclosingObject(); if (theModule->RunsInRole(x)) { sModuleArray[x][moduleIndex] = theModule; moduleIndex++; } } } } }
QTSS_Error RedisInit()//only called by RedisConnect after connect redis sucess { //每一次与redis连接后,都应该清除上一次的数据存储,使用覆盖或者直接清除的方式,串行命令使用管线更加高效 char chTemp[128] = { 0 }; do { //1,redis密码认证 sprintf(chTemp, "auth %s", sRedisPassword); sRedisClient->AppendCommand(chTemp); //2,EasyDarwin唯一信息存储(覆盖上一次的存储) sprintf(chTemp, "sadd EasyDarwinName %s:%d", sRTSPWanIP, sRTSPWanPort); sRedisClient->AppendCommand(chTemp); //3,EasyDarwin属性存储,设置多个filed使用hmset,单个使用hset(覆盖上一次的存储) sprintf(chTemp, "hmset %s:%d_Info IP %s PORT %d RTP %d", sRTSPWanIP, sRTSPWanPort, sRTSPWanIP, sRTSPWanPort, QTSServerInterface::GetServer()->GetNumRTPSessions()); sRedisClient->AppendCommand(chTemp); //4,清除推流名称存储 sprintf(chTemp, "del %s:%d_PushName", sRTSPWanIP, sRTSPWanPort); sRedisClient->AppendCommand(chTemp); char* strAllPushName; OSRefTable * reflectorTable = QTSServerInterface::GetServer()->GetReflectorSessionMap(); OSMutex *mutexMap = reflectorTable->GetMutex(); int iPos = 0, iLen = 0; mutexMap->Lock(); strAllPushName = new char[reflectorTable->GetNumRefsInTable() * 128 + 1];//为每一个推流名称分配128字节的内存 memset(strAllPushName, 0, reflectorTable->GetNumRefsInTable() * 128 + 1);//内存初始化为0 for (OSRefHashTableIter theIter(reflectorTable->GetHashTable()); !theIter.IsDone(); theIter.Next()) { OSRef* theRef = theIter.GetCurrent(); ReflectorSession * theSession = (ReflectorSession *)theRef->GetObject(); char * chPushName = theSession->GetSessionName(); if (chPushName) { strAllPushName[iPos++] = ' '; memcpy(strAllPushName + iPos, chPushName, strlen(chPushName)); iPos = iPos + strlen(chPushName); } } mutexMap->Unlock(); char *chNewTemp = new char[strlen(strAllPushName) + 128];//注意,这里不能再使用chTemp,因为长度不确定,可能导致缓冲区溢出 //5,推流名称存储 sprintf(chNewTemp, "sadd %s:%d_PushName%s", sRTSPWanIP, sRTSPWanPort, strAllPushName); sRedisClient->AppendCommand(chTemp); delete[] chNewTemp; delete[] strAllPushName; //6,保活,设置15秒,这之后当前EasyDarwin已经开始提供服务了 sprintf(chTemp, "setex %s:%d_Live 15 1", sRTSPWanIP, sRTSPWanPort); sRedisClient->AppendCommand(chTemp); bool bBreak = false; easyRedisReply* reply = NULL; for (int i = 0; i < 6; i++) { if (EASY_REDIS_OK != sRedisClient->GetReply((void**)&reply)) { bBreak = true; if (reply) EasyFreeReplyObject(reply); break; } EasyFreeReplyObject(reply); } if (bBreak)//说明redisGetReply出现了错误 break; return QTSS_NoErr; } while (0); //走到这说明出现了错误,需要进行重连,重连操作再下一次执行命令时进行,在这仅仅是置标志位 sRedisClient->Free(); sIfConSucess = false; return (QTSS_Error)false; }