egl: Revisit global data locking.

Lock the global mutex in _eglPreloadDrivers and _eglAllocScreenHandle.
Add comments to why certain pathes do not need locking.
This commit is contained in:
Chia-I Wu
2010-02-17 19:03:30 +08:00
parent 655f465467
commit 4afe24808e
4 changed files with 23 additions and 8 deletions

View File

@@ -237,6 +237,10 @@ _eglMatchDriver(_EGLDisplay *dpy)
_EGLDriver *best_drv = NULL; _EGLDriver *best_drv = NULL;
EGLint best_score = -1, i; 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++) { for (i = 0; i < _eglGlobal.NumDrivers; i++) {
_EGLDriver *drv = _eglGlobal.Drivers[i]; _EGLDriver *drv = _eglGlobal.Drivers[i];
EGLint score; EGLint score;
@@ -529,14 +533,21 @@ _eglPreloadDrivers(void)
{ {
EGLBoolean loaded; EGLBoolean loaded;
/* protect the preloading process */
_eglLockMutex(_eglGlobal.Mutex);
/* already preloaded */ /* already preloaded */
if (_eglGlobal.NumDrivers) if (_eglGlobal.NumDrivers) {
_eglUnlockMutex(_eglGlobal.Mutex);
return EGL_TRUE; return EGL_TRUE;
}
loaded = (_eglPreloadUserDriver() || loaded = (_eglPreloadUserDriver() ||
_eglPreloadDisplayDrivers() || _eglPreloadDisplayDrivers() ||
_eglPreloadDefaultDriver()); _eglPreloadDefaultDriver());
_eglUnlockMutex(_eglGlobal.Mutex);
return loaded; return loaded;
} }
@@ -548,6 +559,8 @@ void
_eglUnloadDrivers(void) _eglUnloadDrivers(void)
{ {
EGLint i; EGLint i;
/* this is called at atexit time */
for (i = 0; i < _eglGlobal.NumDrivers; i++) { for (i = 0; i < _eglGlobal.NumDrivers; i++) {
_EGLDriver *drv = _eglGlobal.Drivers[i]; _EGLDriver *drv = _eglGlobal.Drivers[i];
lib_handle handle = drv->LibHandle; lib_handle handle = drv->LibHandle;

View File

@@ -18,6 +18,7 @@ struct _egl_global
EGLScreenMESA FreeScreenHandle; EGLScreenMESA FreeScreenHandle;
/* these never change after preloading */
EGLint NumDrivers; EGLint NumDrivers;
_EGLDriver *Drivers[10]; _EGLDriver *Drivers[10];

View File

@@ -22,17 +22,22 @@
#include "eglconfig.h" #include "eglconfig.h"
#include "eglsurface.h" #include "eglsurface.h"
#include "eglscreen.h" #include "eglscreen.h"
#include "eglmutex.h"
/** /**
* Return a new screen handle/ID. * Return a new screen handle/ID.
* NOTE: we never reuse these! * NOTE: we never reuse these!
*/ */
EGLScreenMESA static EGLScreenMESA
_eglAllocScreenHandle(void) _eglAllocScreenHandle(void)
{ {
EGLScreenMESA s = _eglGlobal.FreeScreenHandle; EGLScreenMESA s;
_eglGlobal.FreeScreenHandle++;
_eglLockMutex(_eglGlobal.Mutex);
s = _eglGlobal.FreeScreenHandle++;
_eglUnlockMutex(_eglGlobal.Mutex);
return s; return s;
} }

View File

@@ -29,10 +29,6 @@ struct _egl_screen
}; };
extern EGLScreenMESA
_eglAllocScreenHandle(void);
PUBLIC void PUBLIC void
_eglInitScreen(_EGLScreen *screen); _eglInitScreen(_EGLScreen *screen);