Scintilla / Bugs / #1777 Warning on OS X during destruction
- ️Mon Jan 18 2016
On OS X with GTK backend I get the following warning on destruction:
(geany:70109): GLib-GObject-CRITICAL **: g_object_ref: assertion 'object->ref_count > 0' failed
twice for every closed editor in Geany. I have bisected this issue to commit
6c3f6c0ec9e3a41bfc1f855523e2ccfbadf6ed84
When run in debugger with --g-fatal-warnings, I get the following backtrace:
- thread #1: tid = 0x3e51ba, 0x0000000100bd9d11 libglib-2.0.0.dylib`g_logv + 433, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
- frame #0: 0x0000000100bd9d11 libglib-2.0.0.dylib
g_logv + 433 frame #1: 0x0000000100bda8d6 libglib-2.0.0.dylib
g_log + 134
frame #2: 0x0000000100b4c73c libgobject-2.0.0.dylibg_object_ref + 204 frame #3: 0x0000000100b4b901 libgobject-2.0.0.dylib
g_value_object_collect_value + 49
frame #4: 0x0000000100b5e7c9 libgobject-2.0.0.dylibg_signal_emit_valist + 2057 frame #5: 0x0000000100b5eeb6 libgobject-2.0.0.dylib
g_signal_emit + 134
frame #6: 0x00000001004c6255 libgtk-quartz-2.0.0.dylibgtk_widget_unparent + 677 frame #7: 0x000000010008750f libgeany.0.dylib
ScintillaGTK::Destroy(_GObject*) + 31
frame #8: 0x0000000100b4c938 libgobject-2.0.0.dylibg_object_unref + 440 frame #9: 0x00000001002e6b96 libgtk-quartz-2.0.0.dylib
gtk_box_forall + 54
frame #10: 0x000000010031ab9c libgtk-quartz-2.0.0.dylibgtk_container_destroy + 76 frame #11: 0x0000000100b47432 libgobject-2.0.0.dylib
g_closure_invoke + 290
frame #12: 0x0000000100b5dee1 libgobject-2.0.0.dylibsignal_emit_unlocked_R + 2993 frame #13: 0x0000000100b5e834 libgobject-2.0.0.dylib
g_signal_emit_valist + 2164
frame #14: 0x0000000100b5eeb6 libgobject-2.0.0.dylibg_signal_emit + 134 frame #15: 0x00000001003c82d8 libgtk-quartz-2.0.0.dylib
gtk_object_dispose + 40
frame #16: 0x0000000100b4c852 libgobject-2.0.0.dylibg_object_unref + 210 frame #17: 0x0000000100b4abbf libgobject-2.0.0.dylib
g_cclosure_marshal_VOID__OBJECTv + 175
frame #18: 0x0000000100b4768a libgobject-2.0.0.dylib_g_closure_invoke_va + 282 frame #19: 0x0000000100b5e57b libgobject-2.0.0.dylib
g_signal_emit_valist + 1467
frame #20: 0x0000000100b5eeb6 libgobject-2.0.0.dylibg_signal_emit + 134 frame #21: 0x000000010001c815 libgeany.0.dylib
remove_page(page_num=0) + 229 at document.c:737
frame #22: 0x000000010001c669 libgeany.0.dylib`document_close [inlined] document_remove_page(page_num=<unavailable>) + 7 at document.c:795
What I believe is happening here is that in #8 ScintillaGTK gets unreffed so at the point the ::Destroy() function is called it has 0 references.
In my opinion the gtk_widget_unparent() should be called in what corresponds to _dispose() in GTK. I'm not really familiar with C++ bindings but the ::Destroy() method seems to correspond to GTK's finalize().
(The OSX Gtk backend is sometimes a bit strange so it may behave a bit differently than on Linux.)