Merge branch 'master' of ssh://git.freedesktop.org/git/mesa/mesa into pipe-video
[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 "egldriver.h"
6 #include "eglmutex.h"
7
8
9 static _EGL_DECLARE_MUTEX(_eglGlobalMutex);
10 struct _egl_global _eglGlobal =
11 {
12 &_eglGlobalMutex, /* Mutex */
13 NULL, /* DisplayList */
14 2, /* NumAtExitCalls */
15 {
16 /* default AtExitCalls, called in reverse order */
17 _eglUnloadDrivers, /* always called last */
18 _eglFiniDisplay
19 },
20 };
21
22
23 static void
24 _eglAtExit(void)
25 {
26 EGLint i;
27 for (i = _eglGlobal.NumAtExitCalls - 1; i >= 0; i--)
28 _eglGlobal.AtExitCalls[i]();
29 }
30
31
32 void
33 _eglAddAtExitCall(void (*func)(void))
34 {
35 if (func) {
36 static EGLBoolean registered = EGL_FALSE;
37
38 _eglLockMutex(_eglGlobal.Mutex);
39
40 if (!registered) {
41 atexit(_eglAtExit);
42 registered = EGL_TRUE;
43 }
44
45 assert(_eglGlobal.NumAtExitCalls < ARRAY_SIZE(_eglGlobal.AtExitCalls));
46 _eglGlobal.AtExitCalls[_eglGlobal.NumAtExitCalls++] = func;
47
48 _eglUnlockMutex(_eglGlobal.Mutex);
49 }
50 }