egl: Allow binding to any client API.
[mesa.git] / src / egl / main / eglglobals.c
1 #include <stdlib.h>
2 #include <assert.h>
3 #include "eglglobals.h"
4 #include "egldriver.h"
5 #include "egllog.h"
6 #include "eglmutex.h"
7
8
9 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
10
11
12 static _EGL_DECLARE_MUTEX(_eglGlobalMutex);
13 struct _egl_global _eglGlobal =
14 {
15 &_eglGlobalMutex, /* Mutex */
16 NULL, /* DisplayList */
17 1, /* FreeScreenHandle */
18 0, /* NumDrivers */
19 { NULL }, /* Drivers */
20 2, /* NumAtExitCalls */
21 { /* AtExitCalls */
22 _eglFiniDisplay,
23 _eglUnloadDrivers
24 },
25 };
26
27
28 static void
29 _eglAtExit(void)
30 {
31 EGLint i;
32 for (i = _eglGlobal.NumAtExitCalls - 1; i >= 0; i--)
33 _eglGlobal.AtExitCalls[i]();
34 }
35
36
37 void
38 _eglAddAtExitCall(void (*func)(void))
39 {
40 if (func) {
41 static EGLBoolean registered = EGL_FALSE;
42
43 _eglLockMutex(_eglGlobal.Mutex);
44
45 if (!registered) {
46 atexit(_eglAtExit);
47 registered = EGL_TRUE;
48 }
49
50 assert(_eglGlobal.NumAtExitCalls < ARRAY_SIZE(_eglGlobal.AtExitCalls));
51 _eglGlobal.AtExitCalls[_eglGlobal.NumAtExitCalls++] = func;
52
53 _eglUnlockMutex(_eglGlobal.Mutex);
54 }
55 }