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;
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;

View File

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

View File

@@ -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;
}

View File

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