/// 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; }
/// 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; }