summaryrefslogtreecommitdiffstats
path: root/src/egl/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/egl/main')
-rw-r--r--src/egl/main/egldisplay.c124
-rw-r--r--src/egl/main/egldisplay.h8
-rw-r--r--src/egl/main/eglglobals.c4
-rw-r--r--src/egl/main/eglglobals.h6
4 files changed, 64 insertions, 78 deletions
diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c
index 7f2d035c66a..000db6c69af 100644
--- a/src/egl/main/egldisplay.c
+++ b/src/egl/main/egldisplay.c
@@ -16,56 +16,27 @@
#include "egllog.h"
-static _EGL_DECLARE_MUTEX(_eglDisplayInitMutex);
-static _EGLHashtable *_eglDisplayHash;
-
-
/**
* Finish display management.
*/
-static void
+void
_eglFiniDisplay(void)
{
- _eglLockMutex(&_eglDisplayInitMutex);
- if (_eglDisplayHash) {
- EGLuint key = _eglHashFirstEntry(_eglDisplayHash);
-
- while (key) {
- _EGLDisplay *dpy = (_EGLDisplay *)
- _eglHashLookup(_eglDisplayHash, key);
- assert(dpy);
-
- if (dpy->ContextList || dpy->SurfaceList)
- _eglLog(_EGL_DEBUG, "Display %u is destroyed with resources", key);
-
- free(dpy);
-
- key = _eglHashNextEntry(_eglDisplayHash, key);
- }
-
- _eglDeleteHashTable(_eglDisplayHash);
- _eglDisplayHash = NULL;
- }
- _eglUnlockMutex(&_eglDisplayInitMutex);
-}
-
-
-/* This can be avoided if hash table can be statically initialized */
-static INLINE void
-_eglInitDisplay(void)
-{
- if (!_eglDisplayHash) {
- _eglLockMutex(&_eglDisplayInitMutex);
+ _EGLDisplay *dpyList, *dpy;
- /* check again after acquiring lock */
- if (!_eglDisplayHash) {
- _eglDisplayHash = _eglNewHashTable();
+ /* atexit function is called with global mutex locked */
+ dpyList = _eglGlobal.DisplayList;
+ while (dpyList) {
+ /* pop list head */
+ dpy = dpyList;
+ dpyList = dpyList->Next;
- _eglAddAtExitCall(_eglFiniDisplay);
- }
+ if (dpy->ContextList || dpy->SurfaceList)
+ _eglLog(_EGL_DEBUG, "Display %p is destroyed with resources", dpy);
- _eglUnlockMutex(&_eglDisplayInitMutex);
+ free(dpy);
}
+ _eglGlobal.DisplayList = NULL;
}
@@ -102,17 +73,14 @@ _eglNewDisplay(NativeDisplayType nativeDisplay)
EGLDisplay
_eglLinkDisplay(_EGLDisplay *dpy)
{
- EGLuint key;
+ _eglLockMutex(_eglGlobal.Mutex);
- _eglInitDisplay();
+ dpy->Next = _eglGlobal.DisplayList;
+ _eglGlobal.DisplayList = dpy;
- key = _eglHashGenKey(_eglDisplayHash);
- assert(key);
- /* "link" the display to the hash table */
- _eglHashInsert(_eglDisplayHash, key, dpy);
- dpy->Handle = (EGLDisplay) _eglUIntToPointer(key);
+ _eglUnlockMutex(_eglGlobal.Mutex);
- return dpy->Handle;
+ return (EGLDisplay) dpy;
}
@@ -123,12 +91,25 @@ _eglLinkDisplay(_EGLDisplay *dpy)
void
_eglUnlinkDisplay(_EGLDisplay *dpy)
{
- EGLuint key = _eglPointerToUInt((void *) dpy->Handle);
+ _EGLDisplay *prev;
- _eglInitDisplay();
+ _eglLockMutex(_eglGlobal.Mutex);
- _eglHashRemove(_eglDisplayHash, key);
- dpy->Handle = EGL_NO_DISPLAY;
+ prev = _eglGlobal.DisplayList;
+ if (prev != dpy) {
+ while (prev) {
+ if (prev->Next == dpy)
+ break;
+ prev = prev->Next;
+ }
+ assert(prev);
+ prev->Next = dpy->Next;
+ }
+ else {
+ _eglGlobal.DisplayList = dpy->Next;
+ }
+
+ _eglUnlockMutex(_eglGlobal.Mutex);
}
@@ -136,12 +117,9 @@ _eglUnlinkDisplay(_EGLDisplay *dpy)
* Return the handle of a linked display, or EGL_NO_DISPLAY.
*/
EGLDisplay
-_eglGetDisplayHandle(_EGLDisplay *display)
+_eglGetDisplayHandle(_EGLDisplay *dpy)
{
- if (display)
- return display->Handle;
- else
- return EGL_NO_DISPLAY;
+ return (EGLDisplay) ((dpy) ? dpy : EGL_NO_DISPLAY);
}
@@ -150,13 +128,10 @@ _eglGetDisplayHandle(_EGLDisplay *display)
* Return NULL if the handle has no corresponding linked display.
*/
_EGLDisplay *
-_eglLookupDisplay(EGLDisplay dpy)
+_eglLookupDisplay(EGLDisplay display)
{
- EGLuint key = _eglPointerToUInt((void *) dpy);
-
- _eglInitDisplay();
-
- return (_EGLDisplay *) _eglHashLookup(_eglDisplayHash, key);
+ _EGLDisplay *dpy = (_EGLDisplay *) display;
+ return dpy;
}
@@ -167,22 +142,21 @@ _eglLookupDisplay(EGLDisplay dpy)
_EGLDisplay *
_eglFindDisplay(NativeDisplayType nativeDisplay)
{
- EGLuint key;
+ _EGLDisplay *dpy;
- _eglInitDisplay();
+ _eglLockMutex(_eglGlobal.Mutex);
- /* Walk the hash table. Should switch to list if it is a problem. */
- key = _eglHashFirstEntry(_eglDisplayHash);
- while (key) {
- _EGLDisplay *dpy = (_EGLDisplay *)
- _eglHashLookup(_eglDisplayHash, key);
- assert(dpy);
-
- if (dpy->NativeDisplay == nativeDisplay)
+ dpy = _eglGlobal.DisplayList;
+ while (dpy) {
+ if (dpy->NativeDisplay == nativeDisplay) {
+ _eglUnlockMutex(_eglGlobal.Mutex);
return dpy;
- key = _eglHashNextEntry(_eglDisplayHash, key);
+ }
+ dpy = dpy->Next;
}
+ _eglUnlockMutex(_eglGlobal.Mutex);
+
return NULL;
}
diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
index dfc54f17cb6..19a4d4e542c 100644
--- a/src/egl/main/egldisplay.h
+++ b/src/egl/main/egldisplay.h
@@ -24,8 +24,10 @@ struct _egl_extensions
struct _egl_display
{
+ /* used to link displays */
+ _EGLDisplay *Next;
+
EGLNativeDisplayType NativeDisplay;
- EGLDisplay Handle;
const char *DriverName;
_EGLDriver *Driver;
@@ -58,6 +60,10 @@ struct _egl_display
};
+extern void
+_eglFiniDisplay(void);
+
+
extern _EGLDisplay *
_eglNewDisplay(NativeDisplayType displayName);
diff --git a/src/egl/main/eglglobals.c b/src/egl/main/eglglobals.c
index 8c14f9c4bf9..3ae4c1ad3a3 100644
--- a/src/egl/main/eglglobals.c
+++ b/src/egl/main/eglglobals.c
@@ -13,12 +13,14 @@ static _EGL_DECLARE_MUTEX(_eglGlobalMutex);
struct _egl_global _eglGlobal =
{
&_eglGlobalMutex, /* Mutex */
+ NULL, /* DisplayList */
1, /* FreeScreenHandle */
0x0, /* ClientAPIsMask */
0, /* NumDrivers */
{ NULL }, /* Drivers */
- 1, /* NumAtExitCalls */
+ 2, /* NumAtExitCalls */
{ /* AtExitCalls */
+ _eglFiniDisplay,
_eglUnloadDrivers
},
};
diff --git a/src/egl/main/eglglobals.h b/src/egl/main/eglglobals.h
index d00d12afd85..58511076d45 100644
--- a/src/egl/main/eglglobals.h
+++ b/src/egl/main/eglglobals.h
@@ -2,7 +2,7 @@
#define EGLGLOBALS_INCLUDED
#include "egltypedefs.h"
-#include "eglhash.h"
+#include "egldisplay.h"
#include "eglcurrent.h"
#include "eglmutex.h"
@@ -13,6 +13,10 @@
struct _egl_global
{
_EGLMutex *Mutex;
+
+ /* the list of all displays */
+ _EGLDisplay *DisplayList;
+
EGLScreenMESA FreeScreenHandle;
/* bitmaks of supported APIs (supported by _some_ driver) */