Logview crashes due to a rice condition of g_timeout_add.

% svn diff --diff-cmd gdiff -r7610:7753     
Index: loglist.c
===================================================================
--- loglist.c   (revision 7610)
+++ loglist.c   (revision 7753)
@@ -137,8 +137,6 @@
        GtkTreeIter iter;
        LV_MARK;
 
-       g_return_val_if_fail (self != NULL, FALSE);
-
        model = GTK_TREE_MODEL (self->prv->model);
 
        loglist_get_log_iter (self, logview_get_active_log (logview),
@@ -147,6 +145,7 @@
                            LOG_WEIGHT_SET, FALSE, -1);
 
        self->prv->unbold_event = 0;
+       g_object_unref (self);
        return FALSE;
 }
 
@@ -170,7 +169,9 @@
 
     /* if the log is currently shown, put up a timer to unbold it */
     if (logview_get_active_log (logview) == log)
-           g_timeout_add (BOLD_LOG_TIME, (GSourceFunc) loglist_unbold, 
log);
+           g_timeout_add (BOLD_LOG_TIME,
+                          (GSourceFunc) loglist_unbold,
+                          g_object_ref (list));
 }
 
 void
@@ -291,7 +292,8 @@
        if (bold) {
                self->prv->unbold_event =
                        g_timeout_add (BOLD_LOG_TIME,
-                                      (GSourceFunc) loglist_unbold, self);
+                                      (GSourceFunc) loglist_unbold,
+                                      g_object_ref (self));
        }
 }
 
Index: ChangeLog.plugin
===================================================================
--- ChangeLog.plugin    (revision 7610)
+++ ChangeLog.plugin    (revision 7753)
@@ -1,3 +1,12 @@
+2007-11-16  Lin Ma  <Lin.Ma at Sun.COM>
+
+       * loglist.c: (loglist_unbold), (loglist_bold_log),
+       (loglist_selection_changed):
+       * logrtns.c: (log_thread_fill_content), (log_unbold_rows):
+       * monitor.c: (monitor_log_was_modified):
+       Fix a bug crashing log viewer when unbolding the new added lines 
of a
+       log.
+
 2007-08-30  Lin Ma  <Lin.Ma at Sun.COM>
 
        * Makefile.am:
Index: monitor.c
===================================================================
--- monitor.c   (revision 7610)
+++ monitor.c   (revision 7753)
@@ -90,6 +90,7 @@
        if (log_has_been_modified (log)) {
                monitor_callback(NULL, NULL, NULL, 0, log);
        }
+       g_object_unref (log);
        return TRUE;
 }
 
Index: logrtns.c
===================================================================
--- logrtns.c   (revision 7610)
+++ logrtns.c   (revision 7753)
@@ -1027,11 +1027,11 @@
                                                self->prv->line_iter);
        }
 
+       DATA_LOCK (self);
        if (self->prv->update_status) {
                /* update */
                /* Remember the last bold lines in the model to
                   unset them later */
-               DATA_LOCK (self);
                if (self->prv->last_bold_row)
                        gtk_tree_path_free (self->prv->last_bold_row);
                self->prv->last_bold_row =
@@ -1039,21 +1039,19 @@
                                                 self->prv->line_iter);
                g_timeout_add (BOLD_ROWS_TIME,
                               (GSourceFunc) log_unbold_rows,
-                              self);
-               DATA_UNLOCK (self);
+                              g_object_ref (self));
        }
        else {
                /* initial, remember the first visible line
                   and selected lines */
-               DATA_LOCK (self);
                self->prv->selected_paths =
                        g_list_append (self->prv->selected_paths,
                                       gtk_tree_path_copy (path));
                if (self->prv->visible_first)
                        gtk_tree_path_free (self->prv->visible_first);
                self->prv->visible_first = gtk_tree_path_copy (path);
-               DATA_UNLOCK (self);
        }
+       DATA_UNLOCK (self);
        gtk_tree_path_free (path);
 }
    
@@ -1249,26 +1247,31 @@
 
        g_assert (self->prv->view);
        if (self->prv->model !=
-           gtk_tree_view_get_model (GTK_TREE_VIEW(self->prv->view)))
+           gtk_tree_view_get_model (GTK_TREE_VIEW(self->prv->view))) {
+               g_object_unref (self);
                return TRUE;
-
-       g_assert (self->prv->first_bold_row && self->prv->last_bold_row);
-
-       for (path = self->prv->first_bold_row;
-            gtk_tree_path_compare (path, self->prv->last_bold_row)<=0;
-            gtk_tree_path_next (path)) {
-               gtk_tree_model_get_iter (self->prv->model, &iter, path);
-               gtk_tree_store_set (GTK_TREE_STORE (self->prv->model), 
&iter,
-                                   LOG_LINE_WEIGHT, PANGO_WEIGHT_NORMAL,
-                                   LOG_LINE_WEIGHT_SET, TRUE,
-                                   -1);
-               log_thread_idle (self);
        }
+
+       DATA_LOCK (self);
+       if (self->prv->first_bold_row != NULL &&
+           self->prv->last_bold_row != NULL) {
+               for (path = self->prv->first_bold_row;
+                    gtk_tree_path_compare (path, 
self->prv->last_bold_row)<=0;
+                    gtk_tree_path_next (path)) {
+                       gtk_tree_model_get_iter (self->prv->model, 
&iter, path);
+                       gtk_tree_store_set (GTK_TREE_STORE 
(self->prv->model), &iter,
+                                           LOG_LINE_WEIGHT, 
PANGO_WEIGHT_NORMAL,
+                                           LOG_LINE_WEIGHT_SET, TRUE,
+                                           -1);
+               }
  
-       gtk_tree_path_free (self->prv->first_bold_row);
-       gtk_tree_path_free (self->prv->last_bold_row);
-       self->prv->first_bold_row = NULL;
-       self->prv->last_bold_row = NULL;
+               gtk_tree_path_free (self->prv->first_bold_row);
+               gtk_tree_path_free (self->prv->last_bold_row);
+               self->prv->first_bold_row = NULL;
+               self->prv->last_bold_row = NULL;
+       }
+       DATA_UNLOCK (self);
+       g_object_unref (self);
        return FALSE;
 }


-- 
x82120 / +86 10 82618200


Reply via email to