blob: 59746579d07218f411515fcd8df50c2f396040c6 [file] [log] [blame]
/*-------------------------------------------------------------------------
* 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