diff --git a/libcore/parser/SWFMovieDefinition.cpp b/libcore/parser/SWFMovieDefinition.cpp index c0d8976..b8dbbf2 100644 --- a/libcore/parser/SWFMovieDefinition.cpp +++ b/libcore/parser/SWFMovieDefinition.cpp @@ -72,7 +72,8 @@ namespace gnash { SWFMovieLoader::SWFMovieLoader(SWFMovieDefinition& md) - : _movie_def(md) + : _movie_def(md), + _canceled(false) { } @@ -123,6 +124,20 @@ SWFMovieLoader::start() return true; } +void +SWFMovieLoader::cancel() +{ + std::lock_guard lock(_mutex); + _canceled = true; +} + +bool +SWFMovieLoader::cancelled() const +{ + std::lock_guard lock(_mutex); + return _canceled; +} + // // SWFMovieDefinition @@ -150,7 +165,7 @@ SWFMovieDefinition::SWFMovieDefinition(const RunResources& runResources) SWFMovieDefinition::~SWFMovieDefinition() { // Request cancellation of the loading thread - _loadingCanceled = true; + _loader.cancel(); } void @@ -365,6 +380,8 @@ SWFMovieDefinition::ensure_frame_loaded(size_t framenum) const _waiting_for_frame = framenum; + assert(_loader.started()); + std::mutex m; std::unique_lock lock(m); @@ -373,7 +390,7 @@ SWFMovieDefinition::ensure_frame_loaded(size_t framenum) const // Make sure we don't wait here if the frame has been loaded, or the // loading thread has finished. _frame_reached_condition.wait(lock, [&] () { - return framenum <= _frames_loaded.load() || _loadingCanceled; + return framenum <= _frames_loaded.load() || _loader.cancelled(); }); return ( framenum <= _frames_loaded.load() ); @@ -454,7 +471,7 @@ SWFMovieDefinition::read_all_swf() try { while (left) { - if (_loadingCanceled.load()) { + if (_loader.cancelled()) { log_debug("Loading thread cancellation requested, " "returning from read_all_swf"); return; @@ -499,7 +516,7 @@ SWFMovieDefinition::read_all_swf() _frames_loaded = m_frame_count; // Notify any thread waiting on frame reached condition } - _loadingCanceled = true; + _loader.cancel(); _frame_reached_condition.notify_all(); } diff --git a/libcore/parser/SWFMovieDefinition.h b/libcore/parser/SWFMovieDefinition.h index fc9a3b2..e0d43cc 100644 --- a/libcore/parser/SWFMovieDefinition.h +++ b/libcore/parser/SWFMovieDefinition.h @@ -88,12 +88,17 @@ public: /// Return true if called from the loader thread. bool isSelfThread() const; + void cancel(); + + bool cancelled() const; + private: SWFMovieDefinition& _movie_def; mutable std::mutex _mutex; std::thread _thread; + bool _canceled; }; /// The Characters dictionary associated with each SWF file.