1f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu/**************************************************************************
2f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
3f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com>
5f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2010-2011 LunarG, Inc.
6f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * All Rights Reserved.
7f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
8f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
9f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * copy of this software and associated documentation files (the
10f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * "Software"), to deal in the Software without restriction, including
11f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * without limitation the rights to use, copy, modify, merge, publish,
12f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * distribute, sub license, and/or sell copies of the Software, and to
13f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * permit persons to whom the Software is furnished to do so, subject to
14f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * the following conditions:
15f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
16f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * The above copyright notice and this permission notice (including the
17f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * next paragraph) shall be included in all copies or substantial portions
18f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * of the Software.
19f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
20f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
23f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * DEALINGS IN THE SOFTWARE.
27f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
28f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu **************************************************************************/
29f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu
30f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu
31b2006a40eb22899d38cd31691640555228e36975Brian Paul#include <stdlib.h>
32435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu#include <assert.h>
33adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglglobals.h"
3494cb321b5d246185abf71d89968d472a626f1a23Chia-I Wu#include "egldisplay.h"
350eaa02c836821556c1e8d0141f49f57e23f2548dChia-I Wu#include "egldriver.h"
36435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu#include "eglmutex.h"
37adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
38435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu
39435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wustatic _EGL_DECLARE_MUTEX(_eglGlobalMutex);
400e3687e33dd482115c1a0e39c50b424936cb05a6Chia-I Wustruct _egl_global _eglGlobal =
41655ca5afad5f5d79f0ad60b5aa7fcafd35e97b62Jonathan White{
42435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu   &_eglGlobalMutex,       /* Mutex */
4338feefdc4eb4a3c7530b9cddea4c55e9ef39aec8Chia-I Wu   NULL,                   /* DisplayList */
4438feefdc4eb4a3c7530b9cddea4c55e9ef39aec8Chia-I Wu   2,                      /* NumAtExitCalls */
45f1c5cab5525dfcb8edffa275e7c8c3e753c7536fChia-I Wu   {
46f1c5cab5525dfcb8edffa275e7c8c3e753c7536fChia-I Wu      /* default AtExitCalls, called in reverse order */
47f1c5cab5525dfcb8edffa275e7c8c3e753c7536fChia-I Wu      _eglUnloadDrivers, /* always called last */
48f1c5cab5525dfcb8edffa275e7c8c3e753c7536fChia-I Wu      _eglFiniDisplay
490eaa02c836821556c1e8d0141f49f57e23f2548dChia-I Wu   },
50655ca5afad5f5d79f0ad60b5aa7fcafd35e97b62Jonathan White};
51435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu
52435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu
53435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wustatic void
54435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu_eglAtExit(void)
55435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu{
56435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu   EGLint i;
57435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu   for (i = _eglGlobal.NumAtExitCalls - 1; i >= 0; i--)
58435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu      _eglGlobal.AtExitCalls[i]();
59435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu}
60435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu
61435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu
62435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wuvoid
63435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu_eglAddAtExitCall(void (*func)(void))
64435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu{
65435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu   if (func) {
66435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu      static EGLBoolean registered = EGL_FALSE;
67435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu
68435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu      _eglLockMutex(_eglGlobal.Mutex);
69435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu
70435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu      if (!registered) {
71435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu         atexit(_eglAtExit);
72435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu         registered = EGL_TRUE;
73435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu      }
74435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu
75435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu      assert(_eglGlobal.NumAtExitCalls < ARRAY_SIZE(_eglGlobal.AtExitCalls));
76435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu      _eglGlobal.AtExitCalls[_eglGlobal.NumAtExitCalls++] = func;
77435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu
78435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu      _eglUnlockMutex(_eglGlobal.Mutex);
79435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu   }
80435c7ac24d8d6f8ddae59f4b66983d7642250d1eChia-I Wu}
81