After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 670662 - Gtk-CRITICAL **: gtk_widget_unrealize: assertion `GTK_IS_WIDGET (widget)' failed
Gtk-CRITICAL **: gtk_widget_unrealize: assertion `GTK_IS_WIDGET (widget)' failed
Status: RESOLVED FIXED
Product: clutter-gtk
Classification: Platform
Component: GtkClutterActor
unspecified
Other Linux
: Normal normal
: ---
Assigned To: clutter-gtk maintainer(s)
clutter-gtk maintainer(s)
Depends on:
Blocks:
 
 
Reported: 2012-02-23 08:35 UTC by Guillaume Desmottes
Modified: 2012-02-23 11:23 UTC
See Also:
GNOME target: ---
GNOME version: ---


Attachments
gtk_clutter_actor_unrealize: early return if priv->widget is NULL (892 bytes, patch)
2012-02-23 11:20 UTC, Guillaume Desmottes
committed Details | Review

Description Guillaume Desmottes 2012-02-23 08:35:53 UTC
- Start a video call and wait it's connected
- Hang up the call

Gtk-CRITICAL **: gtk_widget_unrealize: assertion `GTK_IS_WIDGET (widget)' failed


  • #0 g_logv
    at gmessages.c line 758
  • #1 g_log
    at gmessages.c line 792
  • #2 g_return_if_fail_warning
  • #3 gtk_widget_unrealize
    at gtkwidget.c line 4447
  • #4 gtk_clutter_actor_unrealize
    at ./gtk-clutter-actor.c line 163
  • #5 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #6 g_type_class_meta_marshal
    at gclosure.c line 885
  • #7 g_closure_invoke
    at gclosure.c line 774
  • #8 signal_emit_unlocked_R
    at gsignal.c line 3340
  • #9 g_signal_emit_valist
    at gsignal.c line 3033
  • #10 g_signal_emit
    at gsignal.c line 3090
  • #11 unrealize_actor_before_children_cb
    at ./clutter-actor.c line 1609
  • #12 _clutter_actor_traverse_depth
    at ./clutter-actor.c line 14840
  • #13 _clutter_actor_traverse
    at ./clutter-actor.c line 14901
  • #14 clutter_actor_unrealize_not_hiding
    at ./clutter-actor.c line 1654
  • #15 clutter_actor_update_map_state
    at ./clutter-actor.c line 1072
  • #16 clutter_actor_remove_child_internal
    at ./clutter-actor.c line 3514
  • #17 clutter_actor_remove_child
    at ./clutter-actor.c line 10484
  • #18 container_real_remove
    at ./clutter-container.c line 120
  • #19 container_remove_actor
    at ./clutter-container.c line 330
  • #20 clutter_container_remove_actor
    at ./clutter-container.c line 514
  • #21 clutter_actor_dispose
    at ./clutter-actor.c line 4587
  • #22 gtk_clutter_actor_dispose
    at ./gtk-clutter-actor.c line 122
  • #23 g_object_run_dispose
    at gobject.c line 1061
  • #24 clutter_actor_destroy
    at ./clutter-actor.c line 6463
  • #25 clutter_box_real_destroy
    at ./deprecated/clutter-box.c line 228
  • #26 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #27 g_type_class_meta_marshal
    at gclosure.c line 885
  • #28 g_closure_invoke
    at gclosure.c line 774
  • #29 signal_emit_unlocked_R
    at gsignal.c line 3418
  • #30 g_signal_emit_valist
    at gsignal.c line 3033
  • #31 g_signal_emit
    at gsignal.c line 3090
  • #32 clutter_actor_dispose
    at ./clutter-actor.c line 4573
  • #33 g_object_run_dispose
    at gobject.c line 1061
  • #34 clutter_actor_destroy
    at ./clutter-actor.c line 6463
  • #35 clutter_box_real_destroy
    at ./deprecated/clutter-box.c line 228
  • #36 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #37 g_type_class_meta_marshal
    at gclosure.c line 885
  • #38 g_closure_invoke
    at gclosure.c line 774
  • #39 signal_emit_unlocked_R
    at gsignal.c line 3418
  • #40 g_signal_emit_valist
    at gsignal.c line 3033
  • #41 g_signal_emit
    at gsignal.c line 3090
  • #42 clutter_actor_dispose
    at ./clutter-actor.c line 4573
  • #43 g_object_run_dispose
    at gobject.c line 1061
  • #44 clutter_actor_destroy
    at ./clutter-actor.c line 6463
  • #45 empathy_call_window_reset_pipeline
    at empathy-call-window.c line 2516
  • #46 empathy_call_window_disconnected
    at empathy-call-window.c line 2571
  • #47 empathy_call_window_hangup_cb
    at empathy-call-window.c line 3999
  • #48 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #49 g_closure_invoke
    at gclosure.c line 774
  • #50 signal_emit_unlocked_R
    at gsignal.c line 3302
  • #51 g_signal_emit_valist
    at gsignal.c line 3033
  • #52 g_signal_emit_by_name
    at gsignal.c line 3127
  • #53 button_clicked
    at gtktoolbutton.c line 881
  • #54 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #55 g_closure_invoke
    at gclosure.c line 774
  • #56 signal_emit_unlocked_R
    at gsignal.c line 3302
  • #57 g_signal_emit_valist
    at gsignal.c line 3033
  • #58 g_signal_emit
    at gsignal.c line 3090
  • #59 gtk_button_clicked
    at gtkbutton.c line 1332
  • #60 gtk_real_button_released
    at gtkbutton.c line 1948
  • #61 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #62 g_type_class_meta_marshal
    at gclosure.c line 885
  • #63 g_closure_invoke
    at gclosure.c line 774
  • #64 signal_emit_unlocked_R
    at gsignal.c line 3232
  • #65 g_signal_emit_valist
    at gsignal.c line 3033
  • #66 g_signal_emit
    at gsignal.c line 3090
  • #67 gtk_button_button_release
    at gtkbutton.c line 1840
  • #68 _gtk_marshal_BOOLEAN__BOXED
    at gtkmarshalers.c line 85
  • #69 g_type_class_meta_marshal
    at gclosure.c line 885
  • #70 g_closure_invoke
    at gclosure.c line 774
  • #71 signal_emit_unlocked_R
    at gsignal.c line 3340
  • #72 g_signal_emit_valist
    at gsignal.c line 3043
  • #73 g_signal_emit
    at gsignal.c line 3090
  • #74 gtk_widget_event_internal
    at gtkwidget.c line 6154
  • #75 gtk_widget_event
    at gtkwidget.c line 5870
  • #76 gtk_propagate_event
    at gtkmain.c line 2420
  • #77 gtk_main_do_event
    at gtkmain.c line 1687
  • #78 _gdk_event_emit
    at gdkevents.c line 71
  • #79 gdk_event_source_dispatch
    at gdkeventsource.c line 360
  • #80 g_main_dispatch
    at gmain.c line 2510
  • #81 g_main_context_dispatch
    at gmain.c line 3047
  • #82 g_main_context_iterate
    at gmain.c line 3118
  • #83 g_main_context_iteration
    at gmain.c line 3179
  • #84 g_application_run
    at gapplication.c line 1496
  • #85 main
    at empathy-call.c line 258

Comment 1 Guillaume Desmottes 2012-02-23 11:15:06 UTC
I'm starting to think this may be a clutter-gtk bug:

a) Empathy calls clutter_actor_destroy() on a container (ClusterBox)
b) gtk_clutter_actor_dispose is called on an actor which is insided the container
c) It calls gtk_widget_destroy (priv->widget) and set priv->widget to NULL.
d) clutter_actor_dispose calls clutter_container_remove_actor() to remove the actor from its container
e) This result in clutter_actor_update_map_state() being called on the actor which then calls clutter_actor_unrealize_not_hiding() which will call unrealize_actor_before_children_cb()
f)  This function fires the "unrealize" signal calling gtk_clutter_actor_unrealize()

gtk_clutter_actor_unrealize() tries to call gtk_widget_unrealize on priv->widget but this widget has already been destroyed and set to NULL in c) leading to the crash.

Adding an early return in gtk_clutter_actor_unrealize() if priv->widget solves this but I'm not sure that's the proper fix.
Comment 2 Guillaume Desmottes 2012-02-23 11:20:18 UTC
Created attachment 208245 [details] [review]
gtk_clutter_actor_unrealize: early return if priv->widget is NULL
Comment 3 Emmanuele Bassi (:ebassi) 2012-02-23 11:22:13 UTC
Review of attachment 208245 [details] [review]:

looks good to me
Comment 4 Guillaume Desmottes 2012-02-23 11:23:49 UTC
Attachment 208245 [details] pushed as 092ee70 - gtk_clutter_actor_unrealize: early return if priv->widget is NULL