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