diff options
author | Xuelian <xuelian.bai@samsung.com> | 2020-05-12 19:00:12 +0800 |
---|---|---|
committer | Xuelian Bai <xuelian.bai@samsung.com> | 2021-10-11 10:14:32 +0800 |
commit | 3776f775b71496867cac9b5110336d38acf9789b (patch) | |
tree | 9246899c74da0a2b068c4e1e583f35194398cf57 | |
parent | 4630ffd566d90ba8b0470be4a2eeffd0c2589a37 (diff) | |
download | mesa-3776f775b71496867cac9b5110336d38acf9789b.tar.gz mesa-3776f775b71496867cac9b5110336d38acf9789b.tar.bz2 mesa-3776f775b71496867cac9b5110336d38acf9789b.zip |
Add exception handle for multithread case.
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>
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.c | 7 | ||||
-rw-r--r-- | src/egl/main/egldevice.c | 8 |
2 files changed, 15 insertions, 0 deletions
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 7e272a92a64..c480abea5e6 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -804,6 +804,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; diff --git a/src/egl/main/egldevice.c b/src/egl/main/egldevice.c index 4e88897e2fa..c5fdd4197b6 100644 --- a/src/egl/main/egldevice.c +++ b/src/egl/main/egldevice.c @@ -162,6 +162,14 @@ _eglAddDevice(int fd, bool software) 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)); |