コード例 #1
0
ファイル: hashgrid.cpp プロジェクト: zeldaiscool/luxrays
void HashGrid::AddFlux(const Point &hitPoint, const Vector &wi,
		const Spectrum &photonFlux) {
	// Look for eye path hit points near the current hit point
	Vector hh = (hitPoint - hitPoints->GetBBox().pMin) * invCellSize;
	const int ix = abs(int(hh.x));
	const int iy = abs(int(hh.y));
	const int iz = abs(int(hh.z));

	std::list<HitPoint *> *hps = grid[Hash(ix, iy, iz)];
	if (hps) {
		std::list<HitPoint *>::iterator iter = hps->begin();
		while (iter != hps->end()) {
			HitPoint *hp = *iter++;

			const float dist2 = DistanceSquared(hp->position, hitPoint);
			if ((dist2 >  hp->accumPhotonRadius2))
				continue;

			const float dot = Dot(hp->normal, wi);
			if (dot <= 0.0001f)
				continue;

			AtomicInc(&hp->accumPhotonCount);
			Spectrum flux = photonFlux * hp->material->f(hp->wo, wi, hp->normal) * hp->throughput;
			AtomicAdd(&hp->accumReflectedFlux.r, flux.r);
			AtomicAdd(&hp->accumReflectedFlux.g, flux.g);
			AtomicAdd(&hp->accumReflectedFlux.b, flux.b);
		}
	}
}
コード例 #2
0
ファイル: Mt.cpp プロジェクト: guowei8412/upp-mirror
bool Thread::Run(Callback _cb)
{
	LLOG("Thread::Run");
	AtomicInc(sThreadCount);
	if(!threadr)
#ifndef CPU_BLACKFIN
		threadr = sMain = true;
#else
	{
		threadr = true;
		//the sMain replacement
#ifdef PLATFORM_POSIX
		pthread_t thid = pthread_self();
		vm.Enter();
		if(threadsv.Find(thid) < 0){
			//thread not yet present, mark present
			threadsv.Add(thid);
		}
		else
			RLOG("BUG: Multiple Add in Mt.cpp");
		vm.Leave();
#endif
	}
#endif
	Detach();
	Callback *cb = new Callback(_cb);
#ifdef PLATFORM_WIN32
	handle = (HANDLE)_beginthreadex(0, 0, sThreadRoutine, cb, 0, ((unsigned int *)(&thread_id)));
#endif
#ifdef PLATFORM_POSIX
	if(pthread_create(&handle, 0, sThreadRoutine, cb))
		handle = 0;
#endif
	return handle;
}
コード例 #3
0
ファイル: main.cpp プロジェクト: dreamsxin/ultimatepp
void ImageMT::Square()
{
	if(m_pLayers.GetCount()<=0)
		return;

	Layer* pLayer = m_pLayers[0];

	double f = m_fPower.GetData();

	AtomicInc(threads);
	Thread().Run(callback4(&Layer::MakeLayerAsThread,pLayer,f,this,0));
}
コード例 #4
0
ファイル: main.cpp プロジェクト: AbdelghaniDr/mirror
TimerTest::TimerTest()
	: demo(0)
{
	CtrlLayout(*this, "Window title");

	int a = AtomicInc(demo);
	ASSERT(a==1); //preload, 1 means running demo mode, 2 means a cb is executing

#ifdef REPEAT_TEST
	t.SetTimeCallback(-TIMEOUT, THISBACK(Test), (intptr_t)this);
#else
	t.SetTimeCallback(0, THISBACK(Test), (intptr_t)this);
#endif
}
コード例 #5
0
ファイル: String.cpp プロジェクト: dreamsxin/ultimatepp
void String::LSet(const String& s)
{
	ptr = s.ptr;
	w[2] = s.w[2];
	w[3] = s.w[3];
	if(s.IsRef()) {
		if(ptr != VoidPtr())
			AtomicInc(s.Ref()->refcount);
	}
	else {
		ptr = (char *)MAlloc_S();
		qptr[0] = s.qptr[0];
		qptr[1] = s.qptr[1];
		qptr[2] = s.qptr[2];
		qptr[3] = s.qptr[3];
	}
}
コード例 #6
0
ファイル: String.cpp プロジェクト: dreamsxin/ultimatepp
void String0::LSet(const String0& s)
{
	w[2] = s.w[2];
	w[3] = s.w[3];
	if(s.IsRef()) {
		ptr = s.ptr;
		if(ptr != (char *)(voidptr + 1))
			AtomicInc(s.Ref()->refcount);
	}
	else {
		ptr = (char *)MAlloc_S();
		qptr[0] = s.qptr[0];
		qptr[1] = s.qptr[1];
		qptr[2] = s.qptr[2];
		qptr[3] = s.qptr[3];
	}
}
コード例 #7
0
ファイル: main.cpp プロジェクト: AbdelghaniDr/mirror
void TimerTest::Test()
{
	int a = AtomicInc(demo);
	ASSERT(a==2);

	Info("O");
	RLOG("O");

	a = AtomicDec(demo);
	if(a<=0)
		return;
	ASSERT(a>=0);
	
#ifdef REPEAT_TEST
#else
	t.SetTimeCallback(TIMEOUT, THISBACK(Test), (int)this);
#endif
}
コード例 #8
0
ファイル: log.cpp プロジェクト: Bitadr/SSketch
void 
LogIt(char *Format, UINT_PTR Info0, UINT_PTR Info1)
{
    TIMESTAMP Now = CurrentTime();
    INT i;
    BOOL Wrapped = 0;

    for (;;) {
        /* Disabled ?
         */
        if (LogP == NOLOG)
            return;
        /* Get a number, make sure its good.
         */
    Retry:
        i = AtomicInc(&LogP) - 1;
        if (i >= LOGSIZE) {
            /* Roundabout, with care
             */
            Wrapped = TRUE;
            if (!AtomicCmpAndSwap(&LogP,
                                  i+1,
                                  0))
                goto Retry;
        } else
            /* Good one.
             */
            break;
    }
    LogBuf[i].Format  = Format;
    LogBuf[i].When = Now;
    LogBuf[i].Info[0] = Info0;
    LogBuf[i].Info[1] = Info1;
#if 0
    printf("LOG '%s' %08x %08x " TIMESTAMP_FORMAT_STRING "\n",
           LogBuf[i].Format,
           LogBuf[i].Info[0],
           LogBuf[i].Info[1],
           LogBuf[i].When);

#endif
    if (Wrapped)
        PrintZeLog();
}
コード例 #9
0
ファイル: Threads.cpp プロジェクト: dreamsxin/ultimatepp
void Threads::Process(const FractalJobHandeler & job)
{
	ProgressInfo statTotal(statusBar);

	rows = inp_row.GetData();
	cols = inp_col.GetData();
	densityR = picbox.GetSize().cy / rows;
	densityC = picbox.GetSize().cx / cols;
	maxIter = inp_iter.GetData();
	logmax= log10((double)maxIter);
	max_threads = inp_threads.GetData();
	
	statTotal.Set(0,rows*cols);
	
	TimeStop startTime;
	
	for (int r = 0; r < rows; r++){
		for (int c = 0; c < cols; c++)
		{
			while(threads >= max_threads)
				waitforfinish.Wait();
			
			AtomicInc(threads);
			Thread().Run(callback4(this, &Threads::ThreadRenderJob, r, c, job, 0));
			
			INTERLOCKED_(job_lock)
				active.Add((r * cols + c), 0);
			
			statTotal.Text(Format("Invoking calculations for sector R:%02d  C:%02d",r,c));
			time.Set(FormatTS(startTime.Elapsed()));
			picbox.Refresh();
			statTotal.Set(r * cols + c,rows*cols);
			ProcessEvents();
		}
	}
	
	while(threads > 0)
		waitforfinish.Wait();

	time.Set(FormatTS(startTime.Elapsed()));
	picbox.Refresh();
}
コード例 #10
0
ファイル: NGM.cpp プロジェクト: breichholf/NextGenMap
void _NGM::AddReadRead(int readid) {
	AtomicInc(&m_ReadReads);
}
コード例 #11
0
ファイル: NGM.cpp プロジェクト: breichholf/NextGenMap
void _NGM::AddWrittenRead(int readid) {
	AtomicInc(&m_WrittenReads);
}
コード例 #12
0
ファイル: NGM.cpp プロジェクト: breichholf/NextGenMap
void _NGM::AddMappedRead(int readid) {
	AtomicInc(&m_MappedReads);
}
コード例 #13
0
ファイル: Scheduler03.cpp プロジェクト: NotKyon/Tenshi
	void LWorker::Sleep()
	{
		AtomicInc( &m_Scheduler.m_cSleepingWorkers );
		m_Scheduler.m_WakeSemaphore.Wait();
		AtomicDec( &m_Scheduler.m_cSleepingWorkers );
	}
コード例 #14
0
    void ConnectorInterface::Close()
    {
        AtomicInc(m_terminating);
        AtomicDec(m_isConnectedFinished);

        AtomicInc(m_isDisconnected);

        if (s_tracerThread)
        {
            if (!thread::IsThreadTerminated(s_tracerThread))
            {
                while (IsConnected() && !thread::IsThreadTerminated(s_tracerThread))
                {
                    behaviac::Thread::Sleep(1);
                }
            }

            {
                ScopedLock lock(m_packetBuffersLock);

                for (int i = 0; i < this->m_maxTracedThreads; ++i)
                {
                    BEHAVIAC_DELETE(m_packetBuffers[i]);
                }

                BEHAVIAC_G_DELETE_ARRAY(m_packetBuffers);
                m_packetBuffers = 0;
            }

            if (!thread::IsThreadTerminated(s_tracerThread))
            {
                thread::StopThread(s_tracerThread);
            }

            s_tracerThread = 0;
        }

        if (m_packetCollection)
        {
            m_packetCollection->Close();
            BEHAVIAC_DELETE(m_packetCollection);
            m_packetCollection = 0;
        }

        BEHAVIAC_DELETE(m_packetPool);
        m_packetPool = 0;
#if BEHAVIAC_COMPILER_MSVC

        if (t_packetBufferIndex != TLS_OUT_OF_INDEXES)
        {
            TlsFree(t_packetBufferIndex);
            t_packetBufferIndex = TLS_OUT_OF_INDEXES;
        }

#else
        t_packetBufferIndex = 0;
#endif
        behaviac::Socket::ShutdownSockets();

        AtomicDec(m_isInited);
    }
コード例 #15
0
ファイル: Mt.cpp プロジェクト: guowei8412/upp-mirror
void Thread::BeginShutdownThreads()
{
	AtomicInc(sShutdown);
}
コード例 #16
0
ファイル: Client.cpp プロジェクト: koz4k/soccer
RpcGet RpcRequest::Execute()
{
	if(!shouldExecute)
		return RpcGet();
	shouldExecute = false;
	String request;
	if(json) {
		ContentType("application/json");
		static Atomic id;
		Json json;
		json("jsonrpc", "2.0")
		    ("method", method);
		if(data.out.GetCount()) {
			JsonArray a;
			for(int i = 0; i < data.out.GetCount(); i++) {
				const Value& v = data.out[i];
				if(v.Is<RawJsonText>())
					a.CatRaw(v.To<RawJsonText>().json);
				else
					a << JsonRpcData(v);
			}
			json("params", a);
		}
		else
		if(data.out_map.GetCount()) {
			Json m;
			for(int i = 0; i < data.out_map.GetCount(); i++) {
				const Value& v = data.out_map.GetValue(i);
				String key = (String)data.out_map.GetKey(i);
				if(v.Is<RawJsonText>())
					m.CatRaw(key, v.To<RawJsonText>().json);
				else
					m(key, JsonRpcData(v));
			}
			json("params", m);
		}
		json("id", id);
		AtomicInc(id);
		request = ~json;
	}
	else {
		ContentType("text/xml");
		request = XmlHeader();
		request << XmlTag("methodCall")(XmlTag("methodName")(method) + FormatXmlRpcParams(data.out));
	}
	if(sLogRpcCalls) {
		if(sLogRpcCallsCompress)
			RLOG("=== XmlRpc call request:\n" << CompressLog(request));
		else
			RLOG("=== XmlRpc call request:\n" << request);
	}
	String response;
	New();
	if(shorted)
		response = RpcExecuteShorted(request);
	else
		response = Post(request).Execute();
	if(sLogRpcCalls) {
		if(sLogRpcCallsCompress)
			RLOG("=== XmlRpc call response:\n" << CompressLog(response));
		else
			RLOG("=== XmlRpc call response:\n" << response);
	}
	RpcGet h;
	if(IsNull(response)) {
		faultCode = RPC_CLIENT_HTTP_ERROR;
		faultString = GetErrorDesc();
		error = "Http request failed: " + faultString;
		LLOG(error);
		h.v = ErrorValue(error);
		return h;
	}
	if(json) {
		try {
			Value r = ParseJSON(response);
			if(IsValueMap(r)) {
				ValueMap m = r;
				Value result = m["result"];
				if(!result.IsVoid()) {
					data.in.Clear();
					data.in.Add(result);
					data.ii = 0;
					h.v = result;
					return h;
				}
				Value e = m["error"];
				if(IsValueMap(e)) {
					Value c = e["code"];
					Value m = e["message"];
					if(IsNumber(c) && IsString(m)) {
						faultCode = e["code"];
						faultString = e["message"];
						error.Clear();
						error << "Failed '" << faultString << "' (" << faultCode << ')';
						LLOG(s);
						h.v = ErrorValue(error);
						return h;
					}
				}
			}
			String s;
			faultString = "Invalid response";
			faultCode = RPC_CLIENT_RESPONSE_ERROR;
			error = faultString;
			LLOG(error);
			h.v = ErrorValue(error);
			return h;
		}
		catch(CParser::Error e) {
			String s;
			faultString = e;
			faultCode = RPC_CLIENT_JSON_ERROR;
			error.Clear();
			error << "JSON Error: " << faultString;
			LLOG(error);
			h.v = ErrorValue(error);
			return h;
		}
	}
	else {
		XmlParser p(response);
		try {
			p.ReadPI();
			p.PassTag("methodResponse");
			if(p.Tag("fault")) {
				Value m = ParseXmlRpcValue(p);
				if(IsValueMap(m)) {
					ValueMap mm = m;
					faultString = mm["faultString"];
					faultCode = mm["faultCode"];
					error.Clear();
					error << "Failed '" << faultString << "' (" << faultCode << ')';
					LLOG(s);
					h.v = ErrorValue(error);
					return h;
				}
			}
			else {
				data.in = ParseXmlRpcParams(p);
				data.ii = 0;
				p.PassEnd();
			}
		}
		catch(XmlError e) {
			String s;
			faultString = e;
			faultCode = RPC_CLIENT_XML_ERROR;
			error.Clear();
			error << "XML Error: " << faultString;
			LLOG(error << ": " << p.GetPtr());
			h.v = ErrorValue(error);
			return h;
		}
		h.v = data.in.GetCount() ? data.in[0] : Null;
		return h;
	}
}
コード例 #17
0
ファイル: Scheduler03.cpp プロジェクト: NotKyon/Tenshi
	bool LWorker::ExecuteUntilNoWork()
	{
#if AX_PROFILING_ENABLED
		CProfileSampler Sampler;
#endif
		CAutoNotifyExecuteUntilNoWork Notification_ExecuteUntilNoWork_;

#if !AX_ASYNC_PER_CHAIN_INDEX_ENABLED
		const uint32 stride = m_Scheduler.m_cWorkers;
		const uint32 base = m_uWorkerId;

		//const uint32 originalChainIndex = m_uChainIndex;
		//const uint32 originalLocalIndex = m_uLocalIndex;
#endif
		
		const bool bDoWork = m_uChainIndex < m_Scheduler.m_cSubmittedChains;

#if AX_PROFILING_ENABLED
		if( bDoWork ) {
			Sampler.Enter( "ExecuteUntilNoWork - %s", g_pszWorkerNames[ m_uWorkerId ] );
		}
#endif

#if AX_ASYNC_PER_WORKER_IDLE_FLAG_ENABLED
		m_bIsWorking = true;
		AX_MEMORY_BARRIER();
#else
		m_Scheduler.DecIdleWorker();
#endif

		CNotifyFetchJob Notify_FetchJob_;
		CNotifyExecuteJob Notify_ExecJob_;
		CNotifyUpdateExecStats Notify_UpdateStats_;
		CNotifyDispatchDeferredWork Notify_LazyDispatch_;
		CNotifyUpdateJobChain Notify_UpdateChain_;

		while( m_uChainIndex < m_Scheduler.m_cSubmittedChains ) {
			SJobChain *const pChain = m_Scheduler.m_pSubmittedChains[ m_uChainIndex ];

			m_ExecutionState.LazyUpdate.uLastJobChain = m_uChainIndex;
			m_ExecutionState.LazyUpdate.LastJobChainMinJobCPUTime = uint64( -1 );
			m_ExecutionState.LazyUpdate.LastJobChainMaxJobCPUTime = 0;
			m_ExecutionState.LazyUpdate.LastJobChainTotalCPUTime = 0;

			AX_MEMORY_BARRIER();

			for(;;) {
				Notify_FetchJob_.Enter();
#if AX_ASYNC_PER_CHAIN_INDEX_ENABLED
				const uint32 index = AtomicInc( &pChain->uReadIndex );
#else
				const uint32 index = base + m_uLocalIndex*stride;
#endif
				Notify_FetchJob_.Leave();

				if( index >= pChain->cJobs ) {
					NotifyJobNotFetched();
					break;
				}

				NotifyJobFetched();

				Notify_ExecJob_.Enter();
				const uint64 jobCPUTime = pChain->pJobs[ index ].Execute( m_ExecutionState );
				Notify_ExecJob_.Leave();
#if !AX_ASYNC_PER_CHAIN_INDEX_ENABLED
				++m_uLocalIndex;
#endif

#if AX_PROFILING_ENABLED
				Notify_UpdateStats_.Enter();
				m_ExecutionState.LazyUpdate.AddJobCPUTime( jobCPUTime );
				Notify_UpdateStats_.Leave();
#else
				( void )jobCPUTime;
#endif
			}

			++m_uChainIndex;
#if !AX_ASYNC_PER_CHAIN_INDEX_ENABLED
			m_uLocalIndex = 0;
#endif

			Notify_LazyDispatch_.Enter();
			m_ExecutionState.LazyUpdate.CommitDispatch();
			Notify_LazyDispatch_.Leave();

			Notify_UpdateChain_.Enter();
			m_ExecutionState.LazyUpdate.CommitLastJobChain();
			Notify_UpdateChain_.Leave();
		}

#if AX_ASYNC_PER_WORKER_IDLE_FLAG_ENABLED
		m_bIsWorking = false;
		AX_MEMORY_BARRIER();
#else
		m_Scheduler.IncIdleWorker();
#endif

		//return originalChainIndex != m_uChainIndex || originalLocalIndex != m_uLocalIndex;
		return bDoWork;
	}
コード例 #18
0
    void ConnectorInterface::ThreadFunc()
    {
#if BEHAVIAC_COMPILER_MSVC
        //printf("ThreadFunc gs_threadFlag = %d\n", (int)gs_threadFlag.value());
        BEHAVIAC_ASSERT(gs_threadFlag.value() == 0);
#endif
        {
            ScopedInt_t scopedInt(&gs_threadFlag);
            Log("behaviac: Socket Thread Starting\n");
#if BEHAVIAC_COMPILER_MSVC
            BEHAVIAC_ASSERT(t_packetBufferIndex != TLS_OUT_OF_INDEXES);
#else
            //printf("ThreadFunc t_packetBufferIndex = %d\n", t_packetBufferIndex);
            //BEHAVIAC_ASSERT(t_packetBufferIndex != (unsigned int)-1);
#endif//
        }
        namespace Socket = behaviac::Socket;
        const bool blockingSocket = true;
        behaviac::Socket::Handle	serverSocket = 0;
        {
            ScopedInt_t scopedInt(&gs_threadFlag);
            serverSocket = Socket::Create(blockingSocket);

            if (!serverSocket)
            {
                Log("behaviac: Couldn't create server socket.\n");
                return;
            }

            char bufferTemp[64];
            string_sprintf(bufferTemp, "behaviac: Listening at port %d...\n", m_port);
            Log(bufferTemp);

            // max connections: 1, don't allow multiple clients?
            if (!Socket::Listen(serverSocket, m_port, 1))
            {
                Log("behaviac: Couldn't configure server socket.\n");
                Socket::Close(serverSocket);
                return;
            }
        }
#if BEHAVIAC_COMPILER_MSVC
        BEHAVIAC_ASSERT(gs_threadFlag.value() == 0);
#endif

        this->ReserveThreadPacketBuffer();

        while (!m_terminating)
        {
#if BEHAVIAC_COMPILER_MSVC

            //wait for connecting
            while (!m_terminating)
            {
                //Log("Socket::TestConnection.\n");
                if (Socket::TestConnection(serverSocket))
                {
                    break;
                }

                behaviac::Thread::Sleep(100);
            }

#endif

            if (!m_terminating)
            {
                BEHAVIAC_ASSERT(gs_threadFlag.value() == 0);
                Log("behaviac: accepting...\n");
                {
                    ScopedInt_t scopedInt(&gs_threadFlag);
                    m_writeSocket = Socket::Accept(serverSocket, kSocketBufferSize);

                    if (!m_writeSocket)
                    {
                        Log("behaviac: Couldn't create write socket.\n");
                        Socket::Close(serverSocket);
                        return;
                    }

                    Log("behaviac: connection accepted\n");
                }

                BEHAVIAC_ASSERT(gs_threadFlag.value() == 0);

                {
                    ScopedInt_t scopedInt(&gs_threadFlag);

                    AtomicInc(m_isConnected);
                    behaviac::Thread::Sleep(1);

                    OnConnection();

                    AtomicInc(m_isConnectedFinished);
                    behaviac::Thread::Sleep(1);

                    //this->OnConnectionFinished();

                    Log("behaviac: after Connected.\n");
                }

                BEHAVIAC_ASSERT(gs_threadFlag.value() == 0);

                while (!m_terminating && this->m_writeSocket)
                {
                    behaviac::Thread::Sleep(1);
                    SendAllPackets();

                    ReceivePackets();
                }

                BEHAVIAC_ASSERT(gs_threadFlag.value() == 0);

                // One last time, to send any outstanding packets out there.
                if (this->m_writeSocket)
                {
                    SendAllPackets();

					Socket::Close(m_writeSocket);
				}

                this->Clear();

                Log("behaviac: disconnected. \n");
            }
        }//while (!m_terminating)

        Socket::Close(serverSocket);

        this->Clear();

        BEHAVIAC_ASSERT(gs_threadFlag.value() == 0);

        Log("behaviac: ThreadFunc exited. \n");
    }
コード例 #19
0
ファイル: Scheduler03.cpp プロジェクト: NotKyon/Tenshi
	void MScheduler::IncIdleWorker()
	{
		AtomicInc( &m_cIdleWorkers );
	}
コード例 #20
0
ファイル: NGM.cpp プロジェクト: breichholf/NextGenMap
void _NGM::AddUnmappedRead(MappedRead const * const read, int reason) {
	AtomicInc(&m_UnmappedReads);
	Log.Debug(LOG_OUTPUT_DETAILS, "Read %s (%i) not mapped (%i)", read->name, read->ReadId, reason);
}