56 #ifdef DEBUG_FILE_READ_THREAD 57 SVDEBUG <<
"FileReadThread::run() exiting" << endl;
64 #ifdef DEBUG_FILE_READ_THREAD 65 SVDEBUG <<
"FileReadThread::finish()" << endl;
82 #ifdef DEBUG_FILE_READ_THREAD 83 SVDEBUG <<
"FileReadThread::finish() exiting" << endl;
118 cerr <<
"WARNING: FileReadThread::cancel: token " << token <<
" not found" << endl;
122 #ifdef DEBUG_FILE_READ_THREAD 123 SVDEBUG <<
"FileReadThread::cancel(" << token <<
") waking condition" << endl;
205 cerr <<
"WARNING: FileReadThread::done(" << token <<
"): request is still in queue (wait or cancel it)" << endl;
209 cerr <<
"WARNING: FileReadThread::done(" << token <<
"): request not found" << endl;
218 Profiler profiler(
"FileReadThread::process",
true);
220 int token =
m_queue.begin()->first;
225 #ifdef DEBUG_FILE_READ_THREAD 226 SVDEBUG <<
"FileReadThread::process: reading " << request.
start <<
", " << request.
size <<
" on " << request.
fd << endl;
229 bool successful =
false;
230 bool seekFailed =
false;
234 MutexLocker rlocker(request.
mutex,
"FileReadThread::process::request.mutex");
236 if (::lseek(request.
fd, request.
start, SEEK_SET) == (off_t)-1) {
243 static const size_t blockSize = 256 * 1024;
245 size_t size = request.
size;
246 char *destination = request.
data;
249 size_t readSize = size;
250 if (readSize > blockSize) readSize = blockSize;
251 ssize_t br = ::read(request.
fd, destination, readSize);
257 if (br < ssize_t(readSize))
break;
259 destination += readSize;
266 ::perror(
"Seek failed");
267 cerr <<
"ERROR: FileReadThread::process: seek to " 268 << request.
start <<
" failed" << endl;
272 ::perror(
"ERROR: FileReadThread::process: Read failed");
273 cerr <<
"ERROR: FileReadThread::process: read of " 274 << request.
size <<
" at " 275 << request.
start <<
" failed" << endl;
277 }
else if (r < ssize_t(request.
size)) {
278 cerr <<
"WARNING: FileReadThread::process: read " 279 << request.
size <<
" returned only " << r <<
" bytes" 298 #ifdef DEBUG_FILE_READ_THREAD 299 SVDEBUG <<
"FileReadThread::process: done, marking as ready (success = " <<
m_readyRequests[token].successful <<
")" << endl;
302 #ifdef DEBUG_FILE_READ_THREAD 304 SVDEBUG <<
"FileReadThread::process: exiting" << endl;
306 SVDEBUG <<
"FileReadThread::process: request disappeared" << endl;
321 #ifdef DEBUG_FILE_READ_THREAD 322 SVDEBUG <<
"FileReadThread::notifyCancelled: token " << token << endl;
QWaitCondition m_condition
virtual bool haveRequest(int token)
virtual void cancel(int token)
RequestQueue m_cancelledRequests
RequestQueue m_readyRequests
std::set< int > m_newlyCancelled
virtual int request(const Request &request)
virtual bool isCancelled(int token)
virtual void done(int token)
virtual bool getRequest(int token, Request &request)
virtual bool isReady(int token)
Profile point instance class.