122 lines
2.5 KiB
C++
122 lines
2.5 KiB
C++
|
/*-------------------------------------------------------------------------
|
||
|
* drawElements Quality Program Execution Server
|
||
|
* ---------------------------------------------
|
||
|
*
|
||
|
* Copyright 2014 The Android Open Source Project
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*
|
||
|
*//*!
|
||
|
* \file
|
||
|
* \brief File Reader.
|
||
|
*//*--------------------------------------------------------------------*/
|
||
|
|
||
|
#include "xsPosixFileReader.hpp"
|
||
|
|
||
|
#include <vector>
|
||
|
|
||
|
namespace xs
|
||
|
{
|
||
|
namespace posix
|
||
|
{
|
||
|
|
||
|
FileReader::FileReader (int blockSize, int numBlocks)
|
||
|
: m_file (DE_NULL)
|
||
|
, m_buf (blockSize, numBlocks)
|
||
|
, m_isRunning (false)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
FileReader::~FileReader (void)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void FileReader::start (const char* filename)
|
||
|
{
|
||
|
DE_ASSERT(!m_isRunning);
|
||
|
|
||
|
m_file = deFile_create(filename, DE_FILEMODE_OPEN|DE_FILEMODE_READ);
|
||
|
XS_CHECK(m_file);
|
||
|
|
||
|
#if (DE_OS != DE_OS_IOS)
|
||
|
// Set to non-blocking mode.
|
||
|
if (!deFile_setFlags(m_file, DE_FILE_NONBLOCKING))
|
||
|
{
|
||
|
deFile_destroy(m_file);
|
||
|
m_file = DE_NULL;
|
||
|
XS_FAIL("Failed to set non-blocking mode");
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
m_isRunning = true;
|
||
|
|
||
|
de::Thread::start();
|
||
|
}
|
||
|
|
||
|
void FileReader::run (void)
|
||
|
{
|
||
|
std::vector<deUint8> tmpBuf (FILEREADER_TMP_BUFFER_SIZE);
|
||
|
deInt64 numRead = 0;
|
||
|
|
||
|
while (!m_buf.isCanceled())
|
||
|
{
|
||
|
deFileResult result = deFile_read(m_file, &tmpBuf[0], (deInt64)tmpBuf.size(), &numRead);
|
||
|
|
||
|
if (result == DE_FILERESULT_SUCCESS)
|
||
|
{
|
||
|
// Write to buffer.
|
||
|
try
|
||
|
{
|
||
|
m_buf.write((int)numRead, &tmpBuf[0]);
|
||
|
m_buf.flush();
|
||
|
}
|
||
|
catch (const ThreadedByteBuffer::CanceledException&)
|
||
|
{
|
||
|
// Canceled.
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else if (result == DE_FILERESULT_END_OF_FILE ||
|
||
|
result == DE_FILERESULT_WOULD_BLOCK)
|
||
|
{
|
||
|
// Wait for more data.
|
||
|
deSleep(FILEREADER_IDLE_SLEEP);
|
||
|
}
|
||
|
else
|
||
|
break; // Error.
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void FileReader::stop (void)
|
||
|
{
|
||
|
if (!m_isRunning)
|
||
|
return; // Nothing to do.
|
||
|
|
||
|
m_buf.cancel();
|
||
|
|
||
|
// Join thread.
|
||
|
join();
|
||
|
|
||
|
// Destroy file.
|
||
|
deFile_destroy(m_file);
|
||
|
m_file = DE_NULL;
|
||
|
|
||
|
// Reset buffer.
|
||
|
m_buf.clear();
|
||
|
|
||
|
m_isRunning = false;
|
||
|
}
|
||
|
|
||
|
} // posix
|
||
|
} // xs
|