13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program Execution Server
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ---------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief File Reader.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "xsPosixFileReader.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <vector>
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace xs
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace posix
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
333c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFileReader::FileReader (int blockSize, int numBlocks)
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: m_file		(DE_NULL)
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_buf			(blockSize, numBlocks)
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_isRunning	(false)
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
403c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFileReader::~FileReader (void)
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid FileReader::start (const char* filename)
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(!m_isRunning);
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_file = deFile_create(filename, DE_FILEMODE_OPEN|DE_FILEMODE_READ);
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	XS_CHECK(m_file);
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if (DE_OS != DE_OS_IOS)
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Set to non-blocking mode.
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!deFile_setFlags(m_file, DE_FILE_NONBLOCKING))
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deFile_destroy(m_file);
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_file = DE_NULL;
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		XS_FAIL("Failed to set non-blocking mode");
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_isRunning	= true;
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	de::Thread::start();
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid FileReader::run (void)
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<deUint8>	tmpBuf		(FILEREADER_TMP_BUFFER_SIZE);
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deInt64					numRead		= 0;
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	while (!m_buf.isCanceled())
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deFileResult result = deFile_read(m_file, &tmpBuf[0], (deInt64)tmpBuf.size(), &numRead);
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (result == DE_FILERESULT_SUCCESS)
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// Write to buffer.
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			try
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_buf.write((int)numRead, &tmpBuf[0]);
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_buf.flush();
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			catch (const ThreadedByteBuffer::CanceledException&)
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				// Canceled.
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (result == DE_FILERESULT_END_OF_FILE ||
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				 result == DE_FILERESULT_WOULD_BLOCK)
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// Wait for more data.
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deSleep(FILEREADER_IDLE_SLEEP);
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break; // Error.
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid FileReader::stop (void)
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_isRunning)
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return; // Nothing to do.
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_buf.cancel();
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Join thread.
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	join();
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Destroy file.
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deFile_destroy(m_file);
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_file = DE_NULL;
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Reset buffer.
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_buf.clear();
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_isRunning = false;
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // posix
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // xs
122