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:
@@ -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;
|
||||
|
@@ -18,6 +18,7 @@ struct _egl_global
|
||||
|
||||
EGLScreenMESA FreeScreenHandle;
|
||||
|
||||
/* these never change after preloading */
|
||||
EGLint NumDrivers;
|
||||
_EGLDriver *Drivers[10];
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -29,10 +29,6 @@ struct _egl_screen
|
||||
};
|
||||
|
||||
|
||||
extern EGLScreenMESA
|
||||
_eglAllocScreenHandle(void);
|
||||
|
||||
|
||||
PUBLIC void
|
||||
_eglInitScreen(_EGLScreen *screen);
|
||||
|
||||
|
Reference in New Issue
Block a user