egl: Revisit global data locking.
authorChia-I Wu <olv@lunarg.com>
Wed, 17 Feb 2010 11:03:30 +0000 (19:03 +0800)
committerChia-I Wu <olv@lunarg.com>
Wed, 17 Feb 2010 12:00:12 +0000 (20:00 +0800)
Lock the global mutex in _eglPreloadDrivers and _eglAllocScreenHandle.
Add comments to why certain pathes do not need locking.

src/egl/main/egldriver.c
src/egl/main/eglglobals.h
src/egl/main/eglscreen.c
src/egl/main/eglscreen.h

index a87c697b113f5c754d1a127f328569354202c8ae..8748fe5f46758029de9efc0e657b4cc67369c8d3 100644 (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;
index cd1dd5851b942205c522bf6ba859f9fb8f6a1bfa..436889802080d2886b2d7dfa7f7f110fb18be832 100644 (file)
@@ -18,6 +18,7 @@ struct _egl_global
 
    EGLScreenMESA FreeScreenHandle;
 
+   /* these never change after preloading */
    EGLint NumDrivers;
    _EGLDriver *Drivers[10];
 
index 97a405a4b4b3c8895a53825005db152250cdb079..c47afd6abdab78f6a66433f1161a84c6507d02a6 100644 (file)
 #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;
 }
 
index c400ac3d15e427b9fa99a8c2774a4ccc9209fdda..0fd71f71fc83cb89ec6c68e3c7ed606f362bc3fd 100644 (file)
@@ -29,10 +29,6 @@ struct _egl_screen
 };
 
 
-extern EGLScreenMESA
-_eglAllocScreenHandle(void);
-
-
 PUBLIC void
 _eglInitScreen(_EGLScreen *screen);