egl: Make eglGetDisplay atomic.

Merge _eglNewDisplay and _eglLinkDisplay into _eglFindDisplay.  Remove
unused _eglUnlinkDisplay.
This commit is contained in:
Chia-I Wu 2010-02-17 18:39:27 +08:00
parent 99bcb1f06d
commit db5ce8b384
3 changed files with 22 additions and 103 deletions

View file

@ -208,18 +208,12 @@ _eglCheckMode(_EGLDisplay *disp, _EGLMode *m, const char *msg)
/**
* This is typically the first EGL function that an application calls.
* We initialize our global vars and create a private _EGLDisplay object.
* It associates a private _EGLDisplay object to the native display.
*/
EGLDisplay EGLAPIENTRY
eglGetDisplay(EGLNativeDisplayType nativeDisplay)
{
_EGLDisplay *dpy;
dpy = _eglFindDisplay(nativeDisplay);
if (!dpy) {
dpy = _eglNewDisplay(nativeDisplay);
if (dpy)
_eglLinkDisplay(dpy);
}
_EGLDisplay *dpy = _eglFindDisplay(nativeDisplay);
return _eglGetDisplayHandle(dpy);
}

View file

@ -45,73 +45,8 @@ _eglFiniDisplay(void)
/**
* Allocate a new _EGLDisplay object for the given nativeDisplay handle.
* We'll also try to determine the device driver name at this time.
*
* Note that nativeDisplay may be an X Display ptr, or a string.
*/
_EGLDisplay *
_eglNewDisplay(EGLNativeDisplayType nativeDisplay)
{
_EGLDisplay *dpy = (_EGLDisplay *) calloc(1, sizeof(_EGLDisplay));
if (dpy) {
_eglInitMutex(&dpy->Mutex);
dpy->NativeDisplay = nativeDisplay;
}
return dpy;
}
/**
* Link a display to itself and return the handle of the link.
* The handle can be passed to client directly.
*/
EGLDisplay
_eglLinkDisplay(_EGLDisplay *dpy)
{
_eglLockMutex(_eglGlobal.Mutex);
dpy->Next = _eglGlobal.DisplayList;
_eglGlobal.DisplayList = dpy;
_eglUnlockMutex(_eglGlobal.Mutex);
return (EGLDisplay) dpy;
}
/**
* Unlink a linked display from itself.
* Accessing an unlinked display should generate EGL_BAD_DISPLAY error.
*/
void
_eglUnlinkDisplay(_EGLDisplay *dpy)
{
_EGLDisplay *prev;
_eglLockMutex(_eglGlobal.Mutex);
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);
}
/**
* Find the display corresponding to the specified native display id in all
* linked displays.
* Find the display corresponding to the specified native display, or create a
* new one.
*/
_EGLDisplay *
_eglFindDisplay(EGLNativeDisplayType nativeDisplay)
@ -120,18 +55,30 @@ _eglFindDisplay(EGLNativeDisplayType nativeDisplay)
_eglLockMutex(_eglGlobal.Mutex);
/* search the display list first */
dpy = _eglGlobal.DisplayList;
while (dpy) {
if (dpy->NativeDisplay == nativeDisplay) {
_eglUnlockMutex(_eglGlobal.Mutex);
return dpy;
}
if (dpy->NativeDisplay == nativeDisplay)
break;
dpy = dpy->Next;
}
/* create a new display */
if (!dpy) {
dpy = (_EGLDisplay *) calloc(1, sizeof(_EGLDisplay));
if (dpy) {
_eglInitMutex(&dpy->Mutex);
dpy->NativeDisplay = nativeDisplay;
/* add to the display list */
dpy->Next = _eglGlobal.DisplayList;
_eglGlobal.DisplayList = dpy;
}
}
_eglUnlockMutex(_eglGlobal.Mutex);
return NULL;
return dpy;
}

View file

@ -88,19 +88,7 @@ _eglFiniDisplay(void);
extern _EGLDisplay *
_eglNewDisplay(EGLNativeDisplayType displayName);
extern EGLDisplay
_eglLinkDisplay(_EGLDisplay *dpy);
extern void
_eglUnlinkDisplay(_EGLDisplay *dpy);
extern _EGLDisplay *
_eglFindDisplay(EGLNativeDisplayType nativeDisplay);
_eglFindDisplay(EGLNativeDisplayType displayName);
PUBLIC void
@ -167,16 +155,6 @@ _eglGetDisplayHandle(_EGLDisplay *dpy)
}
/**
* Return true if the display is linked.
*/
static INLINE EGLBoolean
_eglIsDisplayLinked(_EGLDisplay *dpy)
{
return (EGLBoolean) (_eglGetDisplayHandle(dpy) != EGL_NO_DISPLAY);
}
extern void
_eglLinkResource(_EGLResource *res, _EGLResourceType type, _EGLDisplay *dpy);