diff options
author | Xuelian <xuelian.bai@samsung.com> | 2020-05-12 19:00:12 +0800 |
---|---|---|
committer | Xuelian Bai <xuelian.bai@samsung.com> | 2024-01-18 09:29:10 +0800 |
commit | 46e08c9850740fad5bc147ed87d939d6500dec60 (patch) | |
tree | 2e2aa6673d6555bd15477d1c0754829c5c94887b | |
parent | 4778ca8d76b61195c4b1d8a861864cc3b563cd39 (diff) | |
download | mesa-46e08c9850740fad5bc147ed87d939d6500dec60.tar.gz mesa-46e08c9850740fad5bc147ed87d939d6500dec60.tar.bz2 mesa-46e08c9850740fad5bc147ed87d939d6500dec60.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 17e32b87465..717fb843529 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -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; diff --git a/src/egl/main/egldevice.c b/src/egl/main/egldevice.c index daa2aa0a27e..bec9423edbb 100644 --- a/src/egl/main/egldevice.c +++ b/src/egl/main/egldevice.c @@ -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)); |