]> sigrok.org Git - pulseview.git/blobdiff - pv/views/tabular_decoder/model.cpp
TabularDecView: Try to handle a race condition in the model
[pulseview.git] / pv / views / tabular_decoder / model.cpp
index 3733e13828afdd8b06775744cc7a8215fe05b582..b87bf05869ef1f118ad69853ff3899ec4e1d097a 100644 (file)
@@ -213,6 +213,8 @@ int AnnotationCollectionModel::columnCount(const QModelIndex& parent_idx) const
 
 void AnnotationCollectionModel::set_signal_and_segment(data::DecodeSignal* signal, uint32_t current_segment)
 {
+       layoutAboutToBeChanged();
+
        if (!signal) {
                all_annotations_ = nullptr;
                dataset_ = nullptr;
@@ -262,6 +264,8 @@ void AnnotationCollectionModel::set_signal_and_segment(data::DecodeSignal* signa
 
 void AnnotationCollectionModel::set_hide_hidden(bool hide_hidden)
 {
+       layoutAboutToBeChanged();
+
        hide_hidden_ = hide_hidden;
 
        if (hide_hidden_) {
@@ -320,9 +324,9 @@ QModelIndex AnnotationCollectionModel::update_highlighted_rows(QModelIndex first
                // we would need to highlight - only then do we do so
                QModelIndex index = first;
                do {
-                       const Annotation* ann =
-                               static_cast<const Annotation*>(index.internalPointer());
-                       assert(ann);
+                       const Annotation* ann = static_cast<const Annotation*>(index.internalPointer());
+                       if (!ann)  // Can happen if the table is being modified at this exact time
+                               return result;
 
                        if (((int64_t)ann->start_sample() <= sample_num) &&
                                ((int64_t)ann->end_sample() >= sample_num)) {
@@ -335,10 +339,8 @@ QModelIndex AnnotationCollectionModel::update_highlighted_rows(QModelIndex first
                } while (index != last);
        }
 
-       if (has_highlight || had_highlight_before_) {
+       if (has_highlight || had_highlight_before_)
                dataChanged(first, last);
-               layoutChanged();
-       }
 
        had_highlight_before_ = has_highlight;
 
@@ -350,6 +352,8 @@ void AnnotationCollectionModel::on_annotation_visibility_changed()
        if (!hide_hidden_)
                return;
 
+       layoutAboutToBeChanged();
+
        update_annotations_without_hidden();
 
        if (dataset_)