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