lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 Chris Cannam. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #ifndef _FILE_READ_THREAD_H_ lbajardsilogic@0: #define _FILE_READ_THREAD_H_ lbajardsilogic@0: lbajardsilogic@0: #include "base/Thread.h" lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: //#include lbajardsilogic@0: lbajardsilogic@0: class FileReadThread : public Thread lbajardsilogic@0: { lbajardsilogic@0: Q_OBJECT lbajardsilogic@0: lbajardsilogic@0: public: lbajardsilogic@0: FileReadThread(); lbajardsilogic@0: lbajardsilogic@0: virtual void run(); lbajardsilogic@0: virtual void finish(); lbajardsilogic@0: lbajardsilogic@0: struct Request { lbajardsilogic@0: int fd; lbajardsilogic@0: QMutex *mutex; // used to synchronise access to fd; may be null lbajardsilogic@0: off_t start; lbajardsilogic@0: size_t size; lbajardsilogic@0: char *data; // caller is responsible for allocating and deallocating lbajardsilogic@0: bool successful; // set by FileReadThread after processing request lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: virtual int request(const Request &request); lbajardsilogic@0: virtual void cancel(int token); lbajardsilogic@0: lbajardsilogic@0: virtual bool isReady(int token); lbajardsilogic@0: virtual bool isCancelled(int token); // and safe to delete lbajardsilogic@0: virtual bool getRequest(int token, Request &request); lbajardsilogic@0: virtual void done(int token); lbajardsilogic@0: lbajardsilogic@0: protected: lbajardsilogic@0: int m_nextToken; lbajardsilogic@0: bool m_exiting; lbajardsilogic@0: lbajardsilogic@0: typedef std::map RequestQueue; lbajardsilogic@0: RequestQueue m_queue; lbajardsilogic@0: RequestQueue m_cancelledRequests; lbajardsilogic@0: RequestQueue m_readyRequests; lbajardsilogic@0: std::set m_newlyCancelled; lbajardsilogic@0: lbajardsilogic@0: QMutex m_mutex; lbajardsilogic@0: QWaitCondition m_condition; lbajardsilogic@0: lbajardsilogic@0: void process(); lbajardsilogic@0: void notifyCancelled(); lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: #endif