X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fegl%2Fmain%2Feglglobals.c;h=52eebb07f6c4e3959c45929f659fcabe079ef613;hb=a8b6b6555c7d6a02a3d095c72ebbdc218bc45cd3;hp=870316865007ecd6e16ea0dd3a74bf52d405758a;hpb=0e3687e33dd482115c1a0e39c50b424936cb05a6;p=mesa.git diff --git a/src/egl/main/eglglobals.c b/src/egl/main/eglglobals.c index 87031686500..52eebb07f6c 100644 --- a/src/egl/main/eglglobals.c +++ b/src/egl/main/eglglobals.c @@ -1,13 +1,50 @@ #include +#include #include "eglglobals.h" #include "egldisplay.h" -#include "egllog.h" +#include "egldriver.h" +#include "eglmutex.h" + +static _EGL_DECLARE_MUTEX(_eglGlobalMutex); struct _egl_global _eglGlobal = { - 1, /* FreeScreenHandle */ - 0x0, /* ClientAPIsMask */ - { 0x0 }, /* ClientAPIs */ - 0, /* NumDrivers */ - { NULL }, /* Drivers */ + &_eglGlobalMutex, /* Mutex */ + NULL, /* DisplayList */ + 2, /* NumAtExitCalls */ + { + /* default AtExitCalls, called in reverse order */ + _eglUnloadDrivers, /* always called last */ + _eglFiniDisplay + }, }; + + +static void +_eglAtExit(void) +{ + EGLint i; + for (i = _eglGlobal.NumAtExitCalls - 1; i >= 0; i--) + _eglGlobal.AtExitCalls[i](); +} + + +void +_eglAddAtExitCall(void (*func)(void)) +{ + if (func) { + static EGLBoolean registered = EGL_FALSE; + + _eglLockMutex(_eglGlobal.Mutex); + + if (!registered) { + atexit(_eglAtExit); + registered = EGL_TRUE; + } + + assert(_eglGlobal.NumAtExitCalls < ARRAY_SIZE(_eglGlobal.AtExitCalls)); + _eglGlobal.AtExitCalls[_eglGlobal.NumAtExitCalls++] = func; + + _eglUnlockMutex(_eglGlobal.Mutex); + } +}