Comment 10 for bug 598371

Revision history for this message
Paweł Smoliński (linuxuser-czlowieksukcesu) wrote :

It looks that is the bug in the GTK or Eclipse SWT library.
During window close process method org.eclipse.widgets.Display.removeWidget() calls native method org.eclipse.swt.internal.gtk.OS._g_object_get_qdata() which causes segmentation fault (it not cause Java exception due we are in native code).
Display.removeWidget() source code:
Widget removeWidget (long /*int*/ handle) {
 if (handle == 0) return null;
 lastWidget = null;
 Widget widget = null;
 int index = (int)/*64*/ OS.g_object_get_qdata (handle, SWT_OBJECT_INDEX) - 1;
 if (0 <= index && index < widgetTable.length) {
  widget = widgetTable [index];
  widgetTable [index] = null;
  indexTable [index] = freeSlot;
  freeSlot = index;
  OS.g_object_set_qdata (handle, SWT_OBJECT_INDEX, 0);
 }
 return widget;
}

native method implementation:
JNIEXPORT jintLong JNICALL OS_NATIVE(_1g_1object_1get_1qdata)
 (JNIEnv *env, jclass that, jintLong arg0, jint arg1)
{
 jintLong rc = 0;
 OS_NATIVE_ENTER(env, that, _1g_1object_1get_1qdata_FUNC);
 rc = (jintLong)g_object_get_qdata((GObject *)arg0, (GQuark)arg1);
 OS_NATIVE_EXIT(env, that, _1g_1object_1get_1qdata_FUNC);
 return rc;
}