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;
|
_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;
|
||||||
|
@@ -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];
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -29,10 +29,6 @@ struct _egl_screen
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
extern EGLScreenMESA
|
|
||||||
_eglAllocScreenHandle(void);
|
|
||||||
|
|
||||||
|
|
||||||
PUBLIC void
|
PUBLIC void
|
||||||
_eglInitScreen(_EGLScreen *screen);
|
_eglInitScreen(_EGLScreen *screen);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user