diff options
| author | Julian Greilich <j.greilich@gmx.de> | 2023-01-04 16:32:28 +0100 |
|---|---|---|
| committer | Julian Greilich <j.greilich@gmx.de> | 2023-01-05 15:09:50 +0100 |
| commit | b832a5ac72c6015b6509d60b75b2ce5d5e570800 (patch) | |
| tree | d116117a11d2a9cc85ed5513758cbd6ff115055b /src/sql/doc/snippets/sqldatabase | |
| parent | 0ba063f4361e543d0d359d403acf978c92a990a8 (diff) | |
Android A11Y: Only access the main thread when it is not blocked
When the qtMainLoopThread calls QSGThreadedRenderLoop::polishAndSync(),
it waits for the QSGRenderThread.
In the QSGRenderThread, QAndroidPlatformOpenGLWindow::eglSurface()
calls QtAndroid::createSurface() and waits for the "android main
thread" to return a valid surface.
When the "android main thread" now calls "runInObjectContext" (e.g. by
calling QtAndroidAccessibility::childIdListForAccessibleObject()) it
waits for the qtMainLoopThread and the program is stuck in a deadlock.
To prevent this, we protect all BlockedQueuedConnection from the
"android main thread" to the qtMainLoopThread by acquiring the
AndroidDeadlockProtector.
When QAndroidPlatformOpenGLWindow::eglSurface() already acquired the
AndroidDeadlockProtector we abort the current A11y call with an emtpy
or default value.
Note: b8a95275440b8a143ee648466fd8b5401ee1e839 already tried to fix
this by checking "getSurfaceCount() != 0", but there are situations,
where a new surface is being created while an old surface is still
present.
Task-number: QTBUG-105958
Pick-to: 6.5 6.4 6.3 6.2 5.15
Change-Id: Ie40e8654c99aace9e69b0b8412952fa22c89f071
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'src/sql/doc/snippets/sqldatabase')
0 files changed, 0 insertions, 0 deletions
