egl: Initialize current thread management on demand.
authorChia-I Wu <olvaffe@gmail.com>
Mon, 10 Aug 2009 04:46:08 +0000 (12:46 +0800)
committerBrian Paul <brianp@vmware.com>
Wed, 12 Aug 2009 04:14:35 +0000 (22:14 -0600)
Current thread management was initialized in _eglInitGlobals, which is
called only in eglGetDisplay.  Since EGL does not require eglGetDisplay
to be called first, the initialization is better to be done on demand.

_eglFiniCurrent is removed, as it is not called at all.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
src/egl/main/eglcurrent.c
src/egl/main/eglcurrent.h
src/egl/main/eglglobals.c

index e1b3548517651553247c36ad128735d73ece1958..f92719cfbc6478f5874c67e74221960f96f6653d 100644 (file)
@@ -6,8 +6,12 @@
 #include "eglmutex.h"
 
 
+/* This should be kept in sync with _eglInitThreadInfo() */
+#define _EGL_THREAD_INFO_INITIALIZER \
+   { EGL_SUCCESS, { NULL }, 1 }
+
 /* a fallback thread info to guarantee that every thread always has one */
-static _EGLThreadInfo dummy_thread;
+static _EGLThreadInfo dummy_thread = _EGL_THREAD_INFO_INITIALIZER;
 
 
 #ifdef GLX_USE_TLS
@@ -32,6 +36,7 @@ static INLINE EGLBoolean _eglInitTSD(void (*dtor)(_EGLThreadInfo *))
 {
    /* TODO destroy TSD */
    (void) dtor;
+   (void) _eglFiniTSD;
    return EGL_TRUE;
 }
 
@@ -79,6 +84,7 @@ static INLINE EGLBoolean _eglInitTSD(void (*dtor)(_EGLThreadInfo *))
             return EGL_FALSE;
          }
          _egl_FreeTSD = dtor;
+         (void) _eglFiniTSD;
          _egl_TSDInitialized = EGL_TRUE;
       }
 
@@ -112,6 +118,7 @@ static INLINE EGLBoolean _eglInitTSD(void (*dtor)(_EGLThreadInfo *))
 {
    if (!_egl_FreeTSD && dtor) {
       _egl_FreeTSD = dtor;
+      (void) _eglFiniTSD;
    }
    return EGL_TRUE;
 }
@@ -156,23 +163,17 @@ _eglDestroyThreadInfo(_EGLThreadInfo *t)
 
 
 /**
- * Initialize "current thread" management.
+ * Make sure TSD is initialized and return current value.
  */
-EGLBoolean
-_eglInitCurrent(void)
+static INLINE _EGLThreadInfo *
+_eglCheckedGetTSD(void)
 {
-   _eglInitThreadInfo(&dummy_thread);
-   return _eglInitTSD((void (*)(void *)) _eglDestroyThreadInfo);
-}
-
+   if (_eglInitTSD(&_eglDestroyThreadInfo) != EGL_TRUE) {
+      _eglLog(_EGL_FATAL, "failed to initialize \"current\" system");
+      return NULL;
+   }
 
-/**
- * Finish "current thread" management.
- */
-void
-_eglFiniCurrent(void)
-{
-   _eglFiniTSD();
+   return _eglGetTSD();
 }
 
 
@@ -186,7 +187,7 @@ _eglFiniCurrent(void)
 _EGLThreadInfo *
 _eglGetCurrentThread(void)
 {
-   _EGLThreadInfo *t = _eglGetTSD();
+   _EGLThreadInfo *t = _eglCheckedGetTSD();
    if (!t) {
       t = _eglCreateThreadInfo();
       _eglSetTSD(t);
@@ -202,7 +203,7 @@ _eglGetCurrentThread(void)
 void
 _eglDestroyCurrentThread(void)
 {
-   _EGLThreadInfo *t = _eglGetTSD();
+   _EGLThreadInfo *t = _eglCheckedGetTSD();
    if (t) {
       _eglDestroyThreadInfo(t);
       _eglSetTSD(NULL);
@@ -219,7 +220,7 @@ _eglDestroyCurrentThread(void)
 EGLBoolean
 _eglIsCurrentThreadDummy(void)
 {
-   _EGLThreadInfo *t = _eglGetTSD();
+   _EGLThreadInfo *t = _eglCheckedGetTSD();
    return (!t || t == &dummy_thread);
 }
 
index f9fdf7bd0f074e35cace4287362bbf2f109550d6..8eb241029eca096644bfa9d680fb749b7101ca04 100644 (file)
@@ -20,14 +20,6 @@ struct _egl_thread_info
 };
 
 
-extern EGLBoolean
-_eglInitCurrent(void);
-
-
-extern void
-_eglFiniCurrent(void);
-
-
 /**
  * Return true if a client API enum can be converted to an index.
  */
index 55de394ef5fb616765f303ee1bff624fd0deb89d..23a3ef5ca82fde4f5a5d4ce5786345fbcb6e2d90 100644 (file)
@@ -21,9 +21,6 @@ _eglInitGlobals(void)
       _eglGlobal.Initialized = EGL_TRUE;
 
       _eglGlobal.ClientAPIsMask = 0x0;
-
-      if (!_eglInitCurrent())
-         _eglLog(_EGL_FATAL, "failed to initialize \"current\" system");
    }
 }
 
@@ -34,7 +31,6 @@ _eglInitGlobals(void)
 void
 _eglDestroyGlobals(void)
 {
-   _eglFiniCurrent();
    /* XXX TODO walk over table entries, deleting each */
    _eglDeleteHashTable(_eglGlobal.Displays);
    _eglDeleteHashTable(_eglGlobal.Surfaces);