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>
Thu, 18 Jan 2024 01:29:10 +0000 (09:29 +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 17e32b8..717fb84 100644 (file)
@@ -770,6 +770,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 daa2aa0..bec9423 100644 (file)
@@ -166,6 +166,14 @@ _eglFindDevice(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));