Add exception handle for multithread case.
authorXuelian <xuelian.bai@samsung.com>
Tue, 12 May 2020 11:00:12 +0000 (19:00 +0800)
committerXuelian Bai <xuelian.bai@samsung.com>
Tue, 21 Feb 2023 06:32:48 +0000 (14:32 +0800)
In some cases, main thread got some problem and exit with calling
_eglAtExit, while another thread may still be running, that will
cause assert in mesa.

Change-Id: I6ee87abcb8c818e8a6808cd6098f4061bf7779b2
Signed-Off-by: Xuelian Bai <xuelian.bai@samsung.com>
src/egl/drivers/dri2/egl_dri2.c
src/egl/main/egldevice.c

index df2a13f..d04ed54 100644 (file)
@@ -826,6 +826,13 @@ dri2_load_driver_common(_EGLDisplay *disp,
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
    const __DRIextension **extensions;
 
+   /*This exception only happen in multithread case, when _eglAtExit is *
+    *called and disp is freed in main thread.                           */
+   if (dri2_dpy == NULL) {
+      _eglLog(_EGL_FATAL, "DRI2: disp is freed");
+      return EGL_FALSE;
+   }
+
    extensions = dri2_open_driver(disp);
    if (!extensions)
       return EGL_FALSE;
index c1c421b..22346ca 100644 (file)
@@ -171,6 +171,14 @@ _eglAddDevice(int fd, bool software)
    simple_mtx_lock(_eglGlobal.Mutex);
    dev = _eglGlobal.DeviceList;
 
+   /*This exception only happen in multithread case, when _eglAtExit is   *
+    *called and _eglFiniDevice(where _eglGlobal.DeviceList is set to null)* 
+    *is called in main thread.                                            */
+   if (dev == NULL) {
+       _eglLog(_EGL_FATAL, "_eglGlobal.DeviceList is freed");
+       goto out;
+   }
+
    /* The first device is always software */
    assert(dev);
    assert(_eglDeviceSupports(dev, _EGL_DEVICE_SOFTWARE));