Merge branch 'new-frag-attribs'
[mesa.git] / src / egl / main / eglglobals.c
1 #include <stdlib.h>
2 #include <assert.h>
3 #include "eglglobals.h"
4 #include "egldisplay.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 1, /* FreeScreenHandle */
17 0x0, /* ClientAPIsMask */
18 { 0x0 }, /* ClientAPIs */
19 0, /* NumDrivers */
20 { NULL }, /* Drivers */
21 0, /* NumAtExitCalls */
22 { NULL }, /* AtExitCalls */
23 };
24
25
26 static void
27 _eglAtExit(void)
28 {
29 EGLint i;
30 for (i = _eglGlobal.NumAtExitCalls - 1; i >= 0; i--)
31 _eglGlobal.AtExitCalls[i]();
32 }
33
34
35 void
36 _eglAddAtExitCall(void (*func)(void))
37 {
38 if (func) {
39 static EGLBoolean registered = EGL_FALSE;
40
41 _eglLockMutex(_eglGlobal.Mutex);
42
43 if (!registered) {
44 atexit(_eglAtExit);
45 registered = EGL_TRUE;
46 }
47
48 assert(_eglGlobal.NumAtExitCalls < ARRAY_SIZE(_eglGlobal.AtExitCalls));
49 _eglGlobal.AtExitCalls[_eglGlobal.NumAtExitCalls++] = func;
50
51 _eglUnlockMutex(_eglGlobal.Mutex);
52 }
53 }