sourceforge.net

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.dylibg_logv + 433 frame #1: 0x0000000100bda8d6 libglib-2.0.0.dylibg_log + 134
    frame #2: 0x0000000100b4c73c libgobject-2.0.0.dylibg_object_ref + 204 frame #3: 0x0000000100b4b901 libgobject-2.0.0.dylibg_value_object_collect_value + 49
    frame #4: 0x0000000100b5e7c9 libgobject-2.0.0.dylibg_signal_emit_valist + 2057 frame #5: 0x0000000100b5eeb6 libgobject-2.0.0.dylibg_signal_emit + 134
    frame #6: 0x00000001004c6255 libgtk-quartz-2.0.0.dylibgtk_widget_unparent + 677 frame #7: 0x000000010008750f libgeany.0.dylibScintillaGTK::Destroy(_GObject*) + 31
    frame #8: 0x0000000100b4c938 libgobject-2.0.0.dylibg_object_unref + 440 frame #9: 0x00000001002e6b96 libgtk-quartz-2.0.0.dylibgtk_box_forall + 54
    frame #10: 0x000000010031ab9c libgtk-quartz-2.0.0.dylibgtk_container_destroy + 76 frame #11: 0x0000000100b47432 libgobject-2.0.0.dylibg_closure_invoke + 290
    frame #12: 0x0000000100b5dee1 libgobject-2.0.0.dylibsignal_emit_unlocked_R + 2993 frame #13: 0x0000000100b5e834 libgobject-2.0.0.dylibg_signal_emit_valist + 2164
    frame #14: 0x0000000100b5eeb6 libgobject-2.0.0.dylibg_signal_emit + 134 frame #15: 0x00000001003c82d8 libgtk-quartz-2.0.0.dylibgtk_object_dispose + 40
    frame #16: 0x0000000100b4c852 libgobject-2.0.0.dylibg_object_unref + 210 frame #17: 0x0000000100b4abbf libgobject-2.0.0.dylibg_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.dylibg_signal_emit_valist + 1467
    frame #20: 0x0000000100b5eeb6 libgobject-2.0.0.dylibg_signal_emit + 134 frame #21: 0x000000010001c815 libgeany.0.dylibremove_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.)