Merge lp:~loic.molinari/overlay-scrollbar/fix-crashes-in-hide-thumb into lp:overlay-scrollbar

Proposed by Loïc Molinari
Status: Merged
Merged at revision: 140
Proposed branch: lp:~loic.molinari/overlay-scrollbar/fix-crashes-in-hide-thumb
Merge into: lp:overlay-scrollbar
Diff against target: 65 lines (+17/-7)
1 file modified
os/os-scrollbar.c (+17/-7)
To merge this branch: bzr merge lp:~loic.molinari/overlay-scrollbar/fix-crashes-in-hide-thumb
Reviewer Review Type Date Requested Status
Andrea Cimitan Approve
Review via email: mp+52095@code.launchpad.net

Description of the change

GSources queued for execution in the main loop with valid pointers to objects at time t1 can be dispatched at time t2 with pointers to bjects that have been destroyed. That leads most of the time to crashes. The common practice is to ref objects each time it's queued in the main loop and unref them in the callbacks.

That's what this branch is doing for the scrollbar.

To post a comment you must log in.
Revision history for this message
Andrea Cimitan (cimi) wrote :

patch looks simple and clear, ok!

Revision history for this message
Andrea Cimitan (cimi) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'os/os-scrollbar.c'
2--- os/os-scrollbar.c 2011-03-03 16:20:20 +0000
3+++ os/os-scrollbar.c 2011-03-03 16:40:56 +0000
4@@ -83,7 +83,8 @@
5 static void os_scrollbar_calc_layout_pager (OsScrollbar *scrollbar, gdouble adjustment_value);
6 static void os_scrollbar_calc_layout_slider (OsScrollbar *scrollbar, gdouble adjustment_value);
7 static gdouble os_scrollbar_coord_to_value (OsScrollbar *scrollbar, gint coord);
8-static gboolean os_scrollbar_hide_thumb (gpointer user_data);
9+static void os_scrollbar_hide_thumb (OsScrollbar *scrollbar);
10+static gboolean os_scrollbar_hide_thumb_cb (gpointer user_data);
11 static void os_scrollbar_move (OsScrollbar *scrollbar, gint mouse_x, gint mouse_y);
12 static void os_scrollbar_notify_adjustment_cb (GObject *object, gpointer user_data);
13 static void os_scrollbar_notify_orientation_cb (GObject *object, gpointer user_data);
14@@ -347,13 +348,11 @@
15 }
16
17 /* Hide if it's ok to hide. */
18-static gboolean
19-os_scrollbar_hide_thumb (gpointer user_data)
20+static void
21+os_scrollbar_hide_thumb (OsScrollbar *scrollbar)
22 {
23- OsScrollbar *scrollbar;
24 OsScrollbarPrivate *priv;
25
26- scrollbar = OS_SCROLLBAR (user_data);
27 priv = OS_SCROLLBAR_GET_PRIVATE (scrollbar);
28
29 if (priv->can_hide)
30@@ -361,6 +360,15 @@
31 priv->value_changed_event = FALSE;
32 gtk_widget_hide (GTK_WIDGET (priv->thumb));
33 }
34+}
35+
36+static gboolean
37+os_scrollbar_hide_thumb_cb (gpointer user_data)
38+{
39+ OsScrollbar *scrollbar = OS_SCROLLBAR (user_data);
40+
41+ os_scrollbar_hide_thumb (scrollbar);
42+ g_object_unref (scrollbar);
43
44 return FALSE;
45 }
46@@ -694,7 +702,8 @@
47 if (!priv->button_press_event)
48 priv->can_hide = TRUE;
49
50- g_timeout_add (TIMEOUT_HIDE, os_scrollbar_hide_thumb, scrollbar);
51+ g_timeout_add (TIMEOUT_HIDE, os_scrollbar_hide_thumb_cb,
52+ g_object_ref (scrollbar));
53
54 return TRUE;
55 }
56@@ -1131,7 +1140,8 @@
57 scrollbar = OS_SCROLLBAR (user_data);
58 priv = OS_SCROLLBAR_GET_PRIVATE (scrollbar);
59
60- g_timeout_add (TIMEOUT_HIDE, os_scrollbar_hide_thumb, scrollbar);
61+ g_timeout_add (TIMEOUT_HIDE, os_scrollbar_hide_thumb_cb,
62+ g_object_ref (scrollbar));
63
64 return FALSE;
65 }

Subscribers

People subscribed via source and target branches