示例#1
0
void Renderer::GatherRadianceFromLightWithShadowMap(const Avpl& avpl, CRenderTarget* pRenderTarget)
{
	FillShadowMap(avpl);
	
	glDisable(GL_DEPTH_TEST);
	glEnable(GL_BLEND);	
	glBlendFunc(GL_ONE, GL_ONE);
	glViewport(0, 0, m_camera->GetWidth(), m_camera->GetHeight());
		
	COGLBindLock lockProgram(m_gatherRadianceWithSMProgram->GetGLProgram(), COGL_PROGRAM_SLOT);

	AVPL_STRUCT light_info;
	m_ubLight->UpdateData(&light_info);

	CRenderTargetLock lock(pRenderTarget);

	COGLBindLock lock0(m_shadowMap->GetShadowMapTexture(), COGL_TEXTURE0_SLOT);
	COGLBindLock lock1(m_gbuffer->GetPositionTextureWS(), COGL_TEXTURE1_SLOT);
	COGLBindLock lock2(m_gbuffer->GetNormalTexture(), COGL_TEXTURE2_SLOT);
	COGLBindLock lock3(m_scene->GetMaterialBuffer()->GetOGLMaterialBuffer(), COGL_TEXTURE3_SLOT);

	m_fullScreenQuad->draw();
	
	glEnable(GL_DEPTH_TEST);
	glDisable(GL_BLEND);
}
示例#2
0
	void CachePaths()
	{
		std::lock_guard<std::mutex> lock1(CachedResourcesPathMutex);
		std::lock_guard<std::mutex> lock2(CachedDocumentsPathMutex);
		std::lock_guard<std::mutex> lock3(CachedWritablePathMutex);

		CachedResourcesPath = GetPureResourcesPath();
		CachedDocumentsPath = GetPureDocumentsPath();
		CachedWritablePath = GetPureWritablePath();
	}
示例#3
0
void TCPConnection::ClearBuffers() {
	LockMutex lock1(&MSendQueue);
	LockMutex lock3(&MRunLoop);
	LockMutex lock4(&MState);
	safe_delete_array(recvbuf);
	safe_delete_array(sendbuf);

	char* line = 0;
	while ((line = LineOutQueue.pop()))
		safe_delete_array(line);
}
示例#4
0
int main()
{
    boost::detail::lightweight_mutex::scoped_lock lock1( m1 );

    boost::detail::lightweight_mutex m2;
    boost::detail::lightweight_mutex m3;

    boost::detail::lightweight_mutex::scoped_lock lock2( m2 );
    boost::detail::lightweight_mutex::scoped_lock lock3( m3 );

    return 0;
}
示例#5
0
void ServiceRegistration::SetProperties(const ServiceProperties& props)
{
  if (!d) throw std::logic_error("ServiceRegistration object invalid");

  MutexLocker lock(d->eventLock);

  ServiceListeners::ServiceListenerEntries before;
  // TBD, optimize the locking of services
  {
    //MutexLocker lock2(d->module->coreCtx->globalFwLock);

    if (d->available)
    {
      // NYI! Optimize the MODIFIED_ENDMATCH code
      int old_rank = 0;
      int new_rank = 0;

      std::list<std::string> classes;
      {
        MutexLocker lock3(d->propsLock);

        Any any = d->properties[ServiceConstants::SERVICE_RANKING()];
        if (any.Type() == typeid(int)) old_rank = any_cast<int>(any);

        d->module->coreCtx->listeners.GetMatchingServiceListeners(d->reference, before, false);
        classes = ref_any_cast<std::list<std::string> >(d->properties[ServiceConstants::OBJECTCLASS()]);
        long int sid = any_cast<long int>(d->properties[ServiceConstants::SERVICE_ID()]);
        d->properties = ServiceRegistry::CreateServiceProperties(props, classes, sid);

        any = d->properties[ServiceConstants::SERVICE_RANKING()];
        if (any.Type() == typeid(int)) new_rank = any_cast<int>(any);
      }

      if (old_rank != new_rank)
      {
        d->module->coreCtx->services.UpdateServiceRegistrationOrder(*this, classes);
      }
    }
    else
    {
      throw std::logic_error("Service is unregistered");
    }
  }
  ServiceListeners::ServiceListenerEntries matchingListeners;
  d->module->coreCtx->listeners.GetMatchingServiceListeners(d->reference, matchingListeners);
  d->module->coreCtx->listeners.ServiceChanged(matchingListeners,
                                               ServiceEvent(ServiceEvent::MODIFIED, d->reference),
                                               before);

  d->module->coreCtx->listeners.ServiceChanged(before,
                                               ServiceEvent(ServiceEvent::MODIFIED_ENDMATCH, d->reference));
}
示例#6
0
double LanguageModel::getKLD(
		LanguageModel *p, AbstractLanguageModel *q, AbstractLanguageModel *backgroundModel) {
	LocalLock lock1(p);
	LocalLock lock2(q);
	LocalLock lock3(backgroundModel);
	double result = 0.0;
	double coverage = 0.0;
	for (int i = 0; i < p->termSlotsUsed; i++) {
		char *term = p->terms[i].term;
		double bX = backgroundModel->getTermProbability(term);
		if (bX < 1E-10)
			continue;
		double pX = 0.8 * p->terms[i].termFrequency / p->corpusSize + 0.2 * bX;
		double qX = 0.8 * q->getTermProbability(term) + 0.2 * bX;
		coverage += pX;
		result += pX * log(pX / qX);
	}
	return result / coverage;
} // end of getKLD(LanguageModel*, AbstractLanguageModel*^2)
示例#7
0
 void MapPoint::UpdateNormalAndDepth()
 {
     map<KeyFrame*,size_t> observations;
     KeyFrame* pRefKF;
     cv::Mat Pos;
     {
         boost::mutex::scoped_lock lock1(mMutexFeatures);
         boost::mutex::scoped_lock lock2(mMutexPos);
         if(mbBad)
             return;
         observations=mObservations;
         pRefKF=mpRefKF;
         Pos = mWorldPos.clone();
     }
     
     cv::Mat normal = cv::Mat::zeros(3,1,CV_32F);
     int n=0;
     for(map<KeyFrame*,size_t>::iterator mit=observations.begin(), mend=observations.end(); mit!=mend; mit++)
     {
         KeyFrame* pKF = mit->first;
         cv::Mat Owi = pKF->GetCameraCenter();
         cv::Mat normali = mWorldPos - Owi;
         normal = normal + normali/cv::norm(normali);
         n++;
     } 
     
     cv::Mat PC = Pos - pRefKF->GetCameraCenter();
     const float dist = cv::norm(PC);
     const int level = pRefKF->GetKeyPointScaleLevel(observations[pRefKF]);
     const float scaleFactor = pRefKF->GetScaleFactor();
     const float levelScaleFactor =  pRefKF->GetScaleFactor(level);
     const int nLevels = pRefKF->GetScaleLevels();
     
     {
         boost::mutex::scoped_lock lock3(mMutexPos);
         mfMinDistance = (1.0f/scaleFactor)*dist / levelScaleFactor;
         mfMaxDistance = scaleFactor*dist * pRefKF->GetScaleFactor(nLevels-1-level);
         mNormalVector = normal/n;
     }
 }
示例#8
0
void CResManage::ClearAllResource()
{
	map<HWND, list<VideoRender*> > mapRander;
	CSingleZenoLock lock1(m_mtxRander);
	mapRander.swap(m_mapRander);
	lock1.release();
	for (map<HWND, list<VideoRender*> >::iterator iter = mapRander.begin();iter != mapRander.end();++iter)
	{
		list<VideoRender*>& listRander = iter->second;
		for (list<VideoRender*>::iterator iter1 = listRander.begin();iter1 != listRander.end();++iter1)
		{
			delete *iter1;
		}
	}

	list<int> listPort[StreamSourceType_Num];
	CSingleZenoLock lock2(m_mtxPort);
	for (int i = 0;i < StreamSourceType_Num;i++)
	{
		listPort[i].swap(m_listPort[i]);
	}
	lock2.release();
	for (int i = 0;i < StreamSourceType_Num;i++)
	{
		for (list<int>::iterator iter = listPort[i].begin();iter != listPort[i].end();++iter)
		{
			PlaySDK_CloseStream(i, *iter);
			CNBPlayer::UnusePort(i, *iter);
		}
	}

	list<char*> listBuf;
	CSingleZenoLock lock3(m_mtxFrameBuffer);
	listBuf.swap(m_listFrameBuffer);
	lock3.release();
	for (list<char*>::iterator iter = listBuf.begin();iter != listBuf.end();++iter)
	{
		delete *iter;
	}
}
void ctkServiceRegistration::setProperties(const ServiceProperties& props)
{
  Q_D(ctkServiceRegistration);
  if (!d) throw std::logic_error("ctkServiceRegistration object invalid");

  QMutexLocker lock(&d->eventLock);

  QSet<ctkServiceSlotEntry> before;
  // TBD, optimize the locking of services
  {
    QMutexLocker lock2(&d->plugin->fwCtx->globalFwLock);
    QMutexLocker lock3(&d->propsLock);

    if (d->available)
    {
      // NYI! Optimize the MODIFIED_ENDMATCH code
      int old_rank = d->properties.value(ctkPluginConstants::SERVICE_RANKING).toInt();
      before = d->plugin->fwCtx->listeners.getMatchingServiceSlots(d->reference);
      QStringList classes = d->properties.value(ctkPluginConstants::OBJECTCLASS).toStringList();
      qlonglong sid = d->properties.value(ctkPluginConstants::SERVICE_ID).toLongLong();
      d->properties = ctkServices::createServiceProperties(props, classes, sid);
      int new_rank = d->properties.value(ctkPluginConstants::SERVICE_RANKING).toInt();
      if (old_rank != new_rank)
      {
        d->plugin->fwCtx->services->updateServiceRegistrationOrder(*this, classes);
      }
    }
    else
    {
      throw std::logic_error("Service is unregistered");
    }
  }
  d->plugin->fwCtx->listeners.serviceChanged(
      d->plugin->fwCtx->listeners.getMatchingServiceSlots(d->reference),
      ctkServiceEvent(ctkServiceEvent::MODIFIED, d->reference), before);

  d->plugin->fwCtx->listeners.serviceChanged(
      before,
      ctkServiceEvent(ctkServiceEvent::MODIFIED_ENDMATCH, d->reference));
}
示例#10
0
文件: Master.cpp 项目: yvt/Merlion
	boost::optional<std::pair<std::shared_ptr<MasterNode>, std::string>>
	Master::bindClientToDomain(const std::shared_ptr<MasterClient>& client)
	{
		using RetType = std::pair<std::shared_ptr<MasterNode>, std::string>;
		
		auto room = client->room();
		
		std::vector<Balancer<RetType>::Item> items;
		{
			std::lock_guard<std::recursive_mutex> lock(nodeConnectionsMutex);
			std::lock_guard<std::recursive_mutex> lock2(nodeThrottlesMutex);
			std::lock_guard<std::recursive_mutex> lock3(versionsMutex);
			for (const auto& c: nodes) {
				auto node = c.second;
				if (!node->isConnected())
					continue;
				
				// Has room?
				auto verOrNone = node->findDomainForRoom(room);
				if (verOrNone) {
					auto ver = *verOrNone;
					if (client->doesAcceptVersion(ver))
						return RetType(node, ver);
				}
				
				// Get node throttle value
				auto it = nodeThrottles.find(node->nodeInfo().nodeName);
				if (it == nodeThrottles.end())
					continue;
				
				double nodeThrottle = it->second;
				if (nodeThrottle <= 0.0)
					continue;
				
				// For every domains of the node...
				for (const auto& domain: node->domainStatuses()) {
					auto it2 = versions.find(domain.versionName);
					if (it2 == versions.end())
						continue;
					
					// Get version throttle value
					double versionThrottle = it2->second.throttle;
					if (versionThrottle <= 0.0)
						continue;
					
					// Client accepts the version?
					if (!client->doesAcceptVersion(it2->first))
						continue;
					
					// Add as balancer item
					Balancer<RetType>::Item item;
					
					item.key = RetType(node, domain.versionName);
					item.current = static_cast<double>(domain.numClients);
					item.desired = nodeThrottle * versionThrottle;
					
					items.emplace_back(std::move(item));
				}
			}
		}
		
		// Invoke balancer
		return Balancer<RetType>().performBalancing(items);
	}
示例#11
0
TEST(RwLock, Kind)
{
    RwLock lock1(RwLock::kKindPreferReader);
    RwLock lock2(RwLock::kKindPreferWriter);
    RwLock lock3(RwLock::kKindDefault);
}
示例#12
0
bool TCPConnection::ConnectIP(uint32 in_ip, uint16 in_port, char* errbuf)
{
	if (errbuf)
	{
		errbuf[0] = 0;
	}
	if (ConnectionType != Outgoing)
	{
		// If this code runs, we got serious problems
		// Crash and burn.
		return false;
	}
	MState.lock();
	if (ConnectReady())
	{
		pState = TCPS_Connecting;
	}
	else
	{
		MState.unlock();
		SetAsyncConnect(false);
		return false;
	}
	MState.unlock();
	if (!pRunLoop)
	{
		pRunLoop = true;
#ifdef _WINDOWS
		_beginthread(TCPConnectionLoop, 0, this);
#else
		pthread_t thread;
		pthread_create(&thread, nullptr, TCPConnectionLoop, this);
#endif
	}

	connection_socket = INVALID_SOCKET;
	struct sockaddr_in	server_sin;

	if ((connection_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET || connection_socket == 0)
	{
#ifdef _WINDOWS
		if (errbuf)
		{
			snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::Connect(): Allocating socket failed. Error: %i", WSAGetLastError());
#else
		if (errbuf)
		{
			snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::Connect(): Allocating socket failed. Error: %s", strerror(errno));
#endif
		}
		SetState(TCPS_Ready);
		SetAsyncConnect(false);
		return false;
	}
	server_sin.sin_family = AF_INET;
	server_sin.sin_addr.s_addr = in_ip;
	server_sin.sin_port = htons(in_port);

	// Establish a connection to the server socket.
#ifdef _WINDOWS
	if (connect(connection_socket, (PSOCKADDR) &server_sin, sizeof (server_sin)) == SOCKET_ERROR)
	{
		if (errbuf)
		{
			snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::Connect(): connect() failed. Error: %i", WSAGetLastError());
		}
		closesocket(connection_socket);
		connection_socket = 0;
		SetState(TCPS_Ready);
		SetAsyncConnect(false);
		return false;
	}
#else
	if (connect(connection_socket, (struct sockaddr *) &server_sin, sizeof (server_sin)) == SOCKET_ERROR)
	{
		if (errbuf)
		{
			snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::Connect(): connect() failed. Error: %s", strerror(errno));
		}
		close(connection_socket);
		connection_socket = 0;
		SetState(TCPS_Ready);
		SetAsyncConnect(false);
		return false;
	}
#endif
	int bufsize = 64 * 1024; // 64kbyte receive buffer, up from default of 8k
	setsockopt(connection_socket, SOL_SOCKET, SO_RCVBUF, (char*) &bufsize, sizeof(bufsize));
#ifdef _WINDOWS
	unsigned long nonblocking = 1;
	ioctlsocket(connection_socket, FIONBIO, &nonblocking);
#else
	fcntl(connection_socket, F_SETFL, O_NONBLOCK);
#endif

	SetEcho(false);
	ClearBuffers();
	rIP = in_ip;
	rPort = in_port;
	SetState(TCPS_Connected);
	SetAsyncConnect(false);
	return true;
}
void TCPConnection::ClearBuffers()
{
	LockMutex lock1(&MSendQueue);
	LockMutex lock3(&MRunLoop);
	LockMutex lock4(&MState);
	safe_delete_array(recvbuf);
	safe_delete_array(sendbuf);

	char* line = 0;
	while ((line = LineOutQueue.pop()))
	{
		safe_delete_array(line);
	}
}
static void Test_SingleProcess()
{
    LOG_POST("=== Single-process test ===");
    const CTimeout zero_timeout = CTimeout(0,0);

    LOG_POST("\n--- Test 1");
    // Name test
    {{
        try {
            CInterProcessLock lock("");
        } catch (CInterProcessLockException&) {}
        try {
            CInterProcessLock lock("relative/path");
        } catch (CInterProcessLockException&) {}
        {{
            CInterProcessLock lock("name");
            assert(lock.GetName() == "name");
#if defined(NCBI_OS_UNIX)
            assert(lock.GetSystemName() == "/var/tmp/name");
#elif defined(NCBI_OS_MSWIN)
            assert(lock.GetSystemName() == "name");
#endif
        }}
    }}

    // Fixed names are usually more appropriate, but here we don't
    // want independent tests to step on each other...
    string lockname = CFile::GetTmpName();

    CInterProcessLock lock1(lockname);
    CInterProcessLock lock2(lockname);
    CInterProcessLock lock3(lockname);

    LOG_POST("lock name = " << lock1.GetName());
    LOG_POST("lock system name = " << lock1.GetSystemName());

    LOG_POST("\n--- Test 2");
    // Direct CInterProcessLock usage
    {{
        lock1.Lock(/*infinite*/);
        try {
            lock2.Lock(zero_timeout);
            assert(0);
        }
        catch (CInterProcessLockException&) {}
        
        assert( !lock2.TryLock() );
        lock1.Unlock();
        lock2.Lock(/*infinite*/);
        assert( !lock3.TryLock() );
        lock2.Unlock();
        lock1.Lock(zero_timeout);
        lock1.Remove();
        // everything unlocked
    }}

    LOG_POST("\n--- Test 3");
    // CGuard usage
    {{
        {{
            CGuard<CInterProcessLock> GUARD(lock1);
            try {
                lock2.Lock(zero_timeout);
                assert(0);
            }
            catch (CInterProcessLockException&) {}
        }}
        lock2.Lock(zero_timeout);
        lock2.Remove();
        // everything unlocked
    }}

    LOG_POST("\n--- Test 4");
    // Reference count test
    {{
        assert( lock1.TryLock() );
        assert( lock1.TryLock() );
        assert( !lock2.TryLock() );
        assert( lock1.TryLock() );
        lock1.Unlock();
        lock1.Unlock();
        lock1.Unlock();
        try {
            lock1.Unlock();
            assert(0);
        }
        catch (CInterProcessLockException&) {}
        // everything unlocked
    }}
    // We don't need lock object anymore, remove it from the system
    lock1.Remove();
}