1 /*------------------------------------------------------------------------- 2 * drawElements Quality Program Execution Server 3 * --------------------------------------------- 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief File Reader. 22 *//*--------------------------------------------------------------------*/ 23 24 #include "xsPosixFileReader.hpp" 25 26 #include <vector> 27 28 namespace xs 29 { 30 namespace posix 31 { 32 33 FileReader::FileReader (int blockSize, int numBlocks) 34 : m_file (DE_NULL) 35 , m_buf (blockSize, numBlocks) 36 , m_isRunning (false) 37 { 38 } 39 40 FileReader::~FileReader (void) 41 { 42 } 43 44 void FileReader::start (const char* filename) 45 { 46 DE_ASSERT(!m_isRunning); 47 48 m_file = deFile_create(filename, DE_FILEMODE_OPEN|DE_FILEMODE_READ); 49 XS_CHECK(m_file); 50 51 #if (DE_OS != DE_OS_IOS) 52 // Set to non-blocking mode. 53 if (!deFile_setFlags(m_file, DE_FILE_NONBLOCKING)) 54 { 55 deFile_destroy(m_file); 56 m_file = DE_NULL; 57 XS_FAIL("Failed to set non-blocking mode"); 58 } 59 #endif 60 61 m_isRunning = true; 62 63 de::Thread::start(); 64 } 65 66 void FileReader::run (void) 67 { 68 std::vector<deUint8> tmpBuf (FILEREADER_TMP_BUFFER_SIZE); 69 deInt64 numRead = 0; 70 71 while (!m_buf.isCanceled()) 72 { 73 deFileResult result = deFile_read(m_file, &tmpBuf[0], (deInt64)tmpBuf.size(), &numRead); 74 75 if (result == DE_FILERESULT_SUCCESS) 76 { 77 // Write to buffer. 78 try 79 { 80 m_buf.write((int)numRead, &tmpBuf[0]); 81 m_buf.flush(); 82 } 83 catch (const ThreadedByteBuffer::CanceledException&) 84 { 85 // Canceled. 86 break; 87 } 88 } 89 else if (result == DE_FILERESULT_END_OF_FILE || 90 result == DE_FILERESULT_WOULD_BLOCK) 91 { 92 // Wait for more data. 93 deSleep(FILEREADER_IDLE_SLEEP); 94 } 95 else 96 break; // Error. 97 } 98 } 99 100 void FileReader::stop (void) 101 { 102 if (!m_isRunning) 103 return; // Nothing to do. 104 105 m_buf.cancel(); 106 107 // Join thread. 108 join(); 109 110 // Destroy file. 111 deFile_destroy(m_file); 112 m_file = DE_NULL; 113 114 // Reset buffer. 115 m_buf.clear(); 116 117 m_isRunning = false; 118 } 119 120 } // posix 121 } // xs 122