a couple of debug output statements to help diagnose a crash
[ardour.git] / libs / canvas / wave_view.cc
index a0b9e48fda3066acfff08ea874713d5a1fa4abb2..e3377ab1d952115a15b77ee51fb58e72d4a35803 100644 (file)
@@ -65,6 +65,7 @@ double WaveView::_clip_level = 0.98853;
 WaveViewCache* WaveView::images = 0;
 gint WaveView::drawing_thread_should_quit = 0;
 Glib::Threads::Mutex WaveView::request_queue_lock;
+Glib::Threads::Mutex WaveView::current_image_lock;
 Glib::Threads::Cond WaveView::request_cond;
 Glib::Threads::Thread* WaveView::_drawing_thread = 0;
 WaveView::DrawingRequestQueue WaveView::request_queue;
@@ -141,6 +142,9 @@ WaveView::WaveView (Item* parent, boost::shared_ptr<ARDOUR::AudioRegion> region)
 WaveView::~WaveView ()
 {
        invalidate_image_cache ();
+       if (images ) {
+               images->clear_cache ();
+       }
 }
 
 string
@@ -260,6 +264,7 @@ WaveView::invalidate_image_cache ()
 {
         DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 invalidates image cache and cancels current request\n", this));
        cancel_my_render_request ();
+       Glib::Threads::Mutex::Lock lci (current_image_lock);
        _current_image.reset ();
 }
 
@@ -1001,12 +1006,16 @@ WaveView::generate_image (boost::shared_ptr<WaveViewThreadRequest> req, bool in_
                } else {
                        draw_absent_image (req->image, peaks.get(), n_peaks);
                }
+       } else {
+               cerr << "Request stopped before image generation\n";
        }
        
        if (in_render_thread && !req->should_stop()) {
                 DEBUG_TRACE (DEBUG::WaveView, string_compose ("done with request for %1 at %2 CR %3 req %4 range %5 .. %6\n", this, g_get_monotonic_time(), current_request, req, req->start, req->end));
                const_cast<WaveView*>(this)->ImageReady (); /* emit signal */
        }
+
+       cerr << "Generate image done, image = " << req->image << endl;
        
        return;
 }
@@ -1116,6 +1125,7 @@ WaveView::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) cons
        double image_origin_in_self_coordinates;
        boost::shared_ptr<WaveViewCache::Entry> image_to_draw;
        
+       Glib::Threads::Mutex::Lock lci (current_image_lock);
        if (_current_image) {
 
                /* check it covers the right sample range */
@@ -1178,6 +1188,7 @@ WaveView::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) cons
        double draw_width;
        
        if (image_to_draw != _current_image) {
+               lci.release ();
 
                /* the image is guaranteed to start at or before
                 * draw_start. But if it starts before draw_start, that reduces
@@ -1523,6 +1534,11 @@ WaveView::drawing_thread ()
                        request_cond.wait (request_queue_lock);
                }
 
+               if (request_queue.empty()) {
+                       assert (g_atomic_int_get (&drawing_thread_should_quit));
+                       continue; // or break;
+               }
+
                /* remove the request from the queue (remember: the "request"
                 * is just a pointer to a WaveView object)
                 */