diff options
author | Chia-I Wu <olv@lunarg.com> | 2010-02-17 19:03:30 +0800 |
---|---|---|
committer | Chia-I Wu <olv@lunarg.com> | 2010-02-17 20:00:12 +0800 |
commit | 4afe24808ee253c44c65b855f65bd0749c1e1524 (patch) | |
tree | e7ec43369a44966988dac08c9356b4a2b4e9c76f | |
parent | 655f4654675e601a9482e40d8e50156c965b8934 (diff) |
egl: Revisit global data locking.
Lock the global mutex in _eglPreloadDrivers and _eglAllocScreenHandle.
Add comments to why certain pathes do not need locking.
-rw-r--r-- | src/egl/main/egldriver.c | 15 | ||||
-rw-r--r-- | src/egl/main/eglglobals.h | 1 | ||||
-rw-r--r-- | src/egl/main/eglscreen.c | 11 | ||||
-rw-r--r-- | src/egl/main/eglscreen.h | 4 |
4 files changed, 23 insertions, 8 deletions
diff --git a/src/egl/main/egldriver.c b/src/egl/main/egldriver.c index a87c697b11..8748fe5f46 100644 --- a/src/egl/main/egldriver.c +++ b/src/egl/main/egldriver.c @@ -237,6 +237,10 @@ _eglMatchDriver(_EGLDisplay *dpy) _EGLDriver *best_drv = NULL; EGLint best_score = -1, i; + /* + * this function is called after preloading and the drivers never change + * after preloading. + */ for (i = 0; i < _eglGlobal.NumDrivers; i++) { _EGLDriver *drv = _eglGlobal.Drivers[i]; EGLint score; @@ -529,14 +533,21 @@ _eglPreloadDrivers(void) { EGLBoolean loaded; + /* protect the preloading process */ + _eglLockMutex(_eglGlobal.Mutex); + /* already preloaded */ - if (_eglGlobal.NumDrivers) + if (_eglGlobal.NumDrivers) { + _eglUnlockMutex(_eglGlobal.Mutex); return EGL_TRUE; + } loaded = (_eglPreloadUserDriver() || _eglPreloadDisplayDrivers() || _eglPreloadDefaultDriver()); + _eglUnlockMutex(_eglGlobal.Mutex); + return loaded; } @@ -548,6 +559,8 @@ void _eglUnloadDrivers(void) { EGLint i; + + /* this is called at atexit time */ for (i = 0; i < _eglGlobal.NumDrivers; i++) { _EGLDriver *drv = _eglGlobal.Drivers[i]; lib_handle handle = drv->LibHandle; diff --git a/src/egl/main/eglglobals.h b/src/egl/main/eglglobals.h index cd1dd5851b..4368898020 100644 --- a/src/egl/main/eglglobals.h +++ b/src/egl/main/eglglobals.h @@ -18,6 +18,7 @@ struct _egl_global EGLScreenMESA FreeScreenHandle; + /* these never change after preloading */ EGLint NumDrivers; _EGLDriver *Drivers[10]; diff --git a/src/egl/main/eglscreen.c b/src/egl/main/eglscreen.c index 97a405a4b4..c47afd6abd 100644 --- a/src/egl/main/eglscreen.c +++ b/src/egl/main/eglscreen.c @@ -22,17 +22,22 @@ #include "eglconfig.h" #include "eglsurface.h" #include "eglscreen.h" +#include "eglmutex.h" /** * Return a new screen handle/ID. * NOTE: we never reuse these! */ -EGLScreenMESA +static EGLScreenMESA _eglAllocScreenHandle(void) { - EGLScreenMESA s = _eglGlobal.FreeScreenHandle; - _eglGlobal.FreeScreenHandle++; + EGLScreenMESA s; + + _eglLockMutex(_eglGlobal.Mutex); + s = _eglGlobal.FreeScreenHandle++; + _eglUnlockMutex(_eglGlobal.Mutex); + return s; } diff --git a/src/egl/main/eglscreen.h b/src/egl/main/eglscreen.h index c400ac3d15..0fd71f71fc 100644 --- a/src/egl/main/eglscreen.h +++ b/src/egl/main/eglscreen.h @@ -29,10 +29,6 @@ struct _egl_screen }; -extern EGLScreenMESA -_eglAllocScreenHandle(void); - - PUBLIC void _eglInitScreen(_EGLScreen *screen); |