protect current_request with request_queue_lock
authorRobin Gareus <robin@gareus.org>
Tue, 1 Mar 2016 13:43:28 +0000 (14:43 +0100)
committerRobin Gareus <robin@gareus.org>
Tue, 1 Mar 2016 13:43:28 +0000 (14:43 +0100)
libs/canvas/wave_view.cc

index 3effd9943fb623fb99ff94b3e0cc47155df30245..b8d369a2df467193099e0b26edfe220738c7b3eb 100644 (file)
@@ -944,7 +944,10 @@ WaveView::queue_get_image (boost::shared_ptr<const ARDOUR::Region> region, frame
                /* this will stop rendering in progress (which might otherwise
                   be long lived) for any current request.
                */
-               current_request->cancel ();
+               Glib::Threads::Mutex::Lock lm (request_queue_lock);
+               if (current_request) {
+                       current_request->cancel ();
+               }
        }
 
        start_drawing_thread ();
@@ -1001,6 +1004,11 @@ WaveView::generate_image (boost::shared_ptr<WaveViewThreadRequest> req, bool in_
                                                             req->channel,
                                                             req->samples_per_pixel);
 
+               if (req->should_stop()) {
+                       cerr << "Request stopped after reading peaks\n";
+                       return;
+               }
+
                req->image = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, n_peaks, req->height);
 
                // http://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-image-surface-create
@@ -1491,11 +1499,12 @@ WaveView::cancel_my_render_request () const
         * ever starting up.
         */
 
+       Glib::Threads::Mutex::Lock lm (request_queue_lock);
+
        if (current_request) {
                current_request->cancel ();
        }
 
-       Glib::Threads::Mutex::Lock lm (request_queue_lock);
 
        /* now remove it from the queue and reset our request pointer so that
           have no outstanding request (that we know about)