コード例 #1
0
ファイル: AsyncLoader.cpp プロジェクト: pmatyja/Helium
/// Execute the async loading work.
void AsyncLoader::LoadWorker::Run()
{
	BufferedStream* pBufferedStream = new BufferedStream;
	HELIUM_ASSERT( pBufferedStream );

	while( m_stopCounter == 0 )
	{
		AtomicExchangeAcquire( m_processingCounter, 1 );

		Request* pRequest;
		{
			Locker< DynamicArray< Request* >, SpinLock >::Handle handle ( m_requestQueue );
			pRequest = handle->IsEmpty() ? NULL : handle->Pop();
		}
		if( !pRequest )
		{
			// Queue is empty, so sleep until notified.
			AtomicExchangeRelease( m_processingCounter, 0 );
			m_wakeUpCondition.Wait();

			continue;
		}

		HELIUM_ASSERT( pRequest );

		FileStream* pFileStream = FileStream::OpenFileStream( pRequest->fileName, FileStream::MODE_READ );
		if( !pFileStream )
		{
			SetInvalid( pRequest->bytesRead );
		}
		else
		{
			pRequest->bytesRead = 0;

			pBufferedStream->Open( pFileStream );
			int64_t offset = pBufferedStream->Seek( pRequest->offset, SeekOrigins::Begin );
			if( static_cast< uint64_t >( offset ) == pRequest->offset )
			{
				pRequest->bytesRead = pBufferedStream->Read( pRequest->pBuffer, 1, pRequest->size );
			}

			pBufferedStream->Open( NULL );

			delete pFileStream;
		}

		AtomicExchangeRelease( pRequest->processedCounter, 1 );

		Thread::Yield();
	}

	AtomicExchangeRelease( m_processingCounter, 0 );

	delete pBufferedStream;
}
コード例 #2
0
/// Execute the async loading work.
void AsyncLoader::LoadWorker::Run()
{
    BufferedStream* pBufferedStream = new BufferedStream;
    HELIUM_ASSERT( pBufferedStream );

    while( m_stopCounter == 0 )
    {
        AtomicExchangeAcquire( m_processingCounter, 1 );

        Request* pRequest;
        if( !m_requestQueue.try_pop( pRequest ) )
        {
            // Queue is empty, so sleep until notified.
            AtomicExchangeRelease( m_processingCounter, 0 );
            m_wakeUpCondition.Wait();

            continue;
        }

        HELIUM_ASSERT( pRequest );

        FileStream* pFileStream = File::Open( pRequest->fileName, FileStream::MODE_READ );
        if( !pFileStream )
        {
            SetInvalid( pRequest->bytesRead );
        }
        else
        {
            pRequest->bytesRead = 0;

            pBufferedStream->Open( pFileStream );
            int64_t offset = pBufferedStream->Seek( pRequest->offset, SeekOrigins::SEEK_ORIGIN_BEGIN );
            if( static_cast< uint64_t >( offset ) == pRequest->offset )
            {
                pRequest->bytesRead = pBufferedStream->Read( pRequest->pBuffer, 1, pRequest->size );
            }

            pBufferedStream->Open( NULL );

            delete pFileStream;
        }

        AtomicExchangeRelease( pRequest->processedCounter, 1 );

        Thread::Yield();
    }

    AtomicExchangeRelease( m_processingCounter, 0 );

    delete pBufferedStream;
}