int LocalWorkerConfig::config(const XmlNode *pNode) { ServerProcessConfig &procConfig = ServerProcessConfig::getInstance(); int selfManaged; int instances; int backlog = ConfigCtx::getCurConfigCtx()->getLongValue(pNode, "backlog", 1, 100, 10); int priority = ConfigCtx::getCurConfigCtx()->getLongValue(pNode, "priority", -20, 20, procConfig.getPriority() + 1); if (priority > 20) priority = 20; if (priority < procConfig.getPriority()) priority = procConfig.getPriority(); long l = ConfigCtx::getCurConfigCtx()->getLongValue(pNode, "extMaxIdleTime", -1, INT_MAX, INT_MAX); if (l == -1) l = INT_MAX; setPriority(priority); setBackLog(backlog); setMaxIdleTime(l); int umakeVal = ConfigCtx::getCurConfigCtx()->getLongValue(pNode, "umask", 000, 0777, procConfig.getUMask(), 8); setUmask(umakeVal); setRunOnStartUp(ConfigCtx::getCurConfigCtx()->getLongValue(pNode, "runOnStartUp", 0, 2, 0)); RLimits limits; if (ExtAppRegistry::getRLimits() != NULL) limits = *(ExtAppRegistry::getRLimits()); limits.setCPULimit(RLIM_INFINITY, RLIM_INFINITY); LocalWorker::configRlimit(&limits, pNode); setRLimits(&limits); Env *pEnv = getEnv(); if (pEnv->find("PATH") == NULL) pEnv->add("PATH=/bin:/usr/bin"); instances = ConfigCtx::getCurConfigCtx()->getLongValue(pNode, "instances", 1, INT_MAX, 1); if (instances > 2000) instances = 2000; if (instances > HttpServerConfig::getInstance().getMaxFcgiInstances()) { instances = HttpServerConfig::getInstance().getMaxFcgiInstances(); LS_WARN(ConfigCtx::getCurConfigCtx(), "<instances> is too large, use default max:%d", instances); } setInstances(instances); selfManaged = checkExtAppSelfManagedAndFixEnv(); setSelfManaged(selfManaged); if ((instances != 1) && (getMaxConns() > instances)) { LS_NOTICE(ConfigCtx::getCurConfigCtx(), "Possible mis-configuration: 'Instances'=%d, " "'Max connections'=%d, unless one Fast CGI process is " "capable of handling multiple connections, " "you should set 'Instances' greater or equal to " "'Max connections'.", instances, getMaxConns()); setMaxConns(instances); } RLimits *pLimits = getRLimits(); #if defined(RLIMIT_NPROC) int mini_nproc = (3 * getMaxConns() + 50) * HttpServerConfig::getInstance().getChildren(); struct rlimit *pNProc = pLimits->getProcLimit(); if (((pNProc->rlim_cur > 0) && ((int) pNProc->rlim_cur < mini_nproc)) || ((pNProc->rlim_max > 0) && ((int) pNProc->rlim_max < mini_nproc))) { LS_NOTICE(ConfigCtx::getCurConfigCtx(), "'Process Limit' probably is too low, " "adjust the limit to: %d.", mini_nproc); pLimits->setProcLimit(mini_nproc, mini_nproc); } #endif return 0; }
// Channel/instance number accessors. void qtractorLadspaPlugin::setChannels ( unsigned short iChannels ) { // Check our type... qtractorPluginType *pType = type(); if (pType == NULL) return; // Estimate the (new) number of instances... unsigned short iOldInstances = instances(); unsigned short iInstances = pType->instances(iChannels, list()->isMidi()); // Now see if instance count changed anyhow... if (iInstances == iOldInstances) return; const LADSPA_Descriptor *pLadspaDescriptor = ladspa_descriptor(); if (pLadspaDescriptor == NULL) return; // Gotta go for a while... bool bActivated = isActivated(); setActivated(false); // Set new instance number... setInstances(iInstances); if (m_phInstances) { if (pLadspaDescriptor->cleanup) { for (unsigned short i = 0; i < iOldInstances; ++i) (*pLadspaDescriptor->cleanup)(m_phInstances[i]); } delete [] m_phInstances; m_phInstances = NULL; } // Bail out, if none are about to be created... if (iInstances < 1) { setActivated(bActivated); return; } #ifdef CONFIG_DEBUG qDebug("qtractorLadspaPlugin[%p]::setChannels(%u) instances=%u", this, iChannels, iInstances); #endif // We'll need output control (not dummy anymore) port indexes... unsigned short iControlOuts = pType->controlOuts(); // Allocate new instances... m_phInstances = new LADSPA_Handle [iInstances]; for (unsigned short i = 0; i < iInstances; ++i) { // Instantiate them properly first... LADSPA_Handle handle = (*pLadspaDescriptor->instantiate)(pLadspaDescriptor, sampleRate()); // Connect all existing input control ports... const qtractorPlugin::Params& params = qtractorPlugin::params(); qtractorPlugin::Params::ConstIterator param = params.constBegin(); const qtractorPlugin::Params::ConstIterator& param_end = params.constEnd(); for ( ; param != param_end; ++param) { qtractorPluginParam *pParam = param.value(); // Just in case the plugin decides // to set the port value at this time... float *pfValue = pParam->subject()->data(); float fValue = *pfValue; (*pLadspaDescriptor->connect_port)(handle, pParam->index(), pfValue); // Make new one the default and restore port value... pParam->setDefaultValue(*pfValue); *pfValue = fValue; } // Connect all existing output control ports... for (unsigned short j = 0; j < iControlOuts; ++j) { (*pLadspaDescriptor->connect_port)(handle, m_piControlOuts[j], &m_pfControlOuts[j]); } // This is it... m_phInstances[i] = handle; } // (Re)issue all configuration as needed... realizeConfigs(); realizeValues(); // But won't need it anymore. releaseConfigs(); releaseValues(); // (Re)activate instance if necessary... setActivated(bActivated); }