egl: Rework driver loading.
[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 1, /* FreeScreenHandle */
15 2, /* NumAtExitCalls */
16 {
17 /* default AtExitCalls, called in reverse order */
18 _eglUnloadDrivers, /* always called last */
19 _eglFiniDisplay
20 },
21 };
22
23
24 static void
25 _eglAtExit(void)
26 {
27 EGLint i;
28 for (i = _eglGlobal.NumAtExitCalls - 1; i >= 0; i--)
29 _eglGlobal.AtExitCalls[i]();
30 }
31
32
33 void
34 _eglAddAtExitCall(void (*func)(void))
35 {
36 if (func) {
37 static EGLBoolean registered = EGL_FALSE;
38
39 _eglLockMutex(_eglGlobal.Mutex);
40
41 if (!registered) {
42 atexit(_eglAtExit);
43 registered = EGL_TRUE;
44 }
45
46 assert(_eglGlobal.NumAtExitCalls < ARRAY_SIZE(_eglGlobal.AtExitCalls));
47 _eglGlobal.AtExitCalls[_eglGlobal.NumAtExitCalls++] = func;
48
49 _eglUnlockMutex(_eglGlobal.Mutex);
50 }
51 }