Fix segfault when exiting app running under eglfs

In function QWindow::destroy() the platformWindow is destroyed
(QEglFSWindow in this case), but after that the QSurface destructor
is called (qsurface.cpp:127), where access to the opengl context is
performed (QOpenGLContext::currentContext()->doneCurrent()). Therefore
the surface pointer is deleted earlier (gbm_surface_destroy) than the
working with it (eglMakeCurrent) is finished. But the event
QPlatformSurfaceEvent, that is sent before deleting platformWindow,
isn't processed (qwindow.cpp:1665), though we can perform doneCurrent()
in the handler of QPlatformSurfaceEvent. The full description with
valgrind stacks on bugreports.

Task-number: QTBUG-52399
Change-Id: I69035dfd8ba5b5eeec243bc0edd3f571dc9525f9
Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
bb10
Elena Zaretskaya 2016-04-08 12:29:25 +04:00
parent b3e9144c3a
commit 8d45759432
1 changed files with 11 additions and 0 deletions

View File

@ -2109,6 +2109,17 @@ bool QWindow::event(QEvent *ev)
break;
}
case QEvent::PlatformSurface: {
if ((static_cast<QPlatformSurfaceEvent *>(ev))->surfaceEventType() == QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed) {
#ifndef QT_NO_OPENGL
QOpenGLContext *context = QOpenGLContext::currentContext();
if (context && context->surface() == static_cast<QSurface *>(this))
context->doneCurrent();
#endif
}
break;
}
default:
return QObject::event(ev);
}