150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* 250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho****************************************************************************** 383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius* 483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius* Copyright (C) 2009-2011, International Business Machines 583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius* Corporation and others. All Rights Reserved. 683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius* 750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho****************************************************************************** 850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* file name: ucln_imp.h 950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* encoding: US-ASCII 1050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* tab size: 8 (not used) 1150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* indentation:4 1250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* 1350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* This file contains the platform specific implementation of per-library cleanup. 1450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* 1550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*/ 1650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#ifndef __UCLN_IMP_H__ 1950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define __UCLN_IMP_H__ 2050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "ucln.h" 2250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include <stdlib.h> 2350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/** 2550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Auto cleanup of ICU libraries 2650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * There are several methods in per library cleanup of icu libraries: 2750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * 1) Compiler/Platform based cleanup: 2850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * a) Windows MSVC uses DllMain() 2950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * b) GCC uses destructor function attribute 3050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * c) Sun Studio, AIX VA, and HP-UX aCC uses a linker option to set the exit function 3150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * 2) Using atexit() 3250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * 3) Implementing own automatic cleanup functions 3350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * 3450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * For option 1, ensure that UCLN_NO_AUTO_CLEANUP is set to 0 by using --enable-auto-cleanup 3583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius * configure option or by otherwise setting UCLN_NO_AUTO_CLEANUP to 0 3650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * For option 2, follow option 1 and also define UCLN_AUTO_ATEXIT 3750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * For option 3, follow option 1 and also define UCLN_AUTO_LOCAL (see below for more information) 3850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 3950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCLN_NO_AUTO_CLEANUP 4150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* 4350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * The following declarations are for when UCLN_AUTO_LOCAL or UCLN_AUTO_ATEXIT 4450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * are defined. They are commented out because they are static and will be defined 4550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * later. The information is still here to provide some guidance for the developer 4650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * who chooses to use UCLN_AUTO_LOCAL. 4750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 4850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/** 4950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Give the library an opportunity to register an automatic cleanup. 5050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * This may be called more than once. 5150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 5250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/*static void ucln_registerAutomaticCleanup();*/ 5350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/** 5450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Unregister an automatic cleanup, if possible. Called from cleanup. 5550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 5650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/*static void ucln_unRegisterAutomaticCleanup();*/ 5750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 5883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#ifdef UCLN_TYPE_IS_COMMON 5983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius# define UCLN_CLEAN_ME_UP u_cleanup() 6083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#else 6183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius# define UCLN_CLEAN_ME_UP ucln_cleanupOne(UCLN_TYPE) 6283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#endif 6383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 6450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* ------------ automatic cleanup: registration. Choose ONE ------- */ 6550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if defined(UCLN_AUTO_LOCAL) 6650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* To use: 6750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * 1. define UCLN_AUTO_LOCAL, 6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * 2. create ucln_local_hook.c containing implementations of 6950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * static void ucln_registerAutomaticCleanup() 7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * static void ucln_unRegisterAutomaticCleanup() 7150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 7250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "ucln_local_hook.c" 7350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 7450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#elif defined(UCLN_AUTO_ATEXIT) 7550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* 7650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Use the ANSI C 'atexit' function. Note that this mechanism does not 7750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * guarantee the order of cleanup relative to other users of ICU! 7850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 7950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UBool gAutoCleanRegistered = FALSE; 8050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 8150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void ucln_atexit_handler() 8250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 8383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UCLN_CLEAN_ME_UP; 8450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 8550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 8650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void ucln_registerAutomaticCleanup() 8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 8850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(!gAutoCleanRegistered) { 8950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho gAutoCleanRegistered = TRUE; 9050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho atexit(&ucln_atexit_handler); 9150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 9250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 9350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 9450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void ucln_unRegisterAutomaticCleanup () { 9550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 9650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* ------------end of automatic cleanup: registration. ------- */ 9750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 9850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#elif defined (UCLN_FINI) 9950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/** 10050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * If UCLN_FINI is defined, it is the (versioned, etc) name of a cleanup 10150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * entrypoint. Add a stub to call ucln_cleanupOne 10250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Used on AIX, Solaris, and HP-UX 10350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 10450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI void U_EXPORT2 UCLN_FINI (void); 10550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 10650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI void U_EXPORT2 UCLN_FINI () 10750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 10850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* This function must be defined, if UCLN_FINI is defined, else link error. */ 10983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UCLN_CLEAN_ME_UP; 11050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 11150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 11250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* Windows: DllMain */ 11383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#elif U_PLATFORM_HAS_WIN32_API 11450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* 11550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * ICU's own DllMain. 11650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 11750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* these are from putil.c */ 11950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* READ READ READ READ! Are you getting compilation errors from windows.h? 12050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho Any source file which includes this (ucln_imp.h) header MUST 12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho be defined with language extensions ON. */ 12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# define WIN32_LEAN_AND_MEAN 12350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# define VC_EXTRALEAN 12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# define NOUSER 12550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# define NOSERVICE 12650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# define NOIME 12750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# define NOMCX 12850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# include <windows.h> 12950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* 13050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * This is a stub DllMain function with icu specific process handling code. 13150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 13250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoBOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 13350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 13450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho BOOL status = TRUE; 13550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho switch(fdwReason) { 13750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case DLL_PROCESS_ATTACH: 13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* ICU does not trap process attach, but must pass these through properly. */ 13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* ICU specific process attach could go here */ 14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho break; 14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 14250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case DLL_PROCESS_DETACH: 14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Here is the one we actually care about. */ 14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 14583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UCLN_CLEAN_ME_UP; 14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho break; 14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case DLL_THREAD_ATTACH: 15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* ICU does not trap thread attach, but must pass these through properly. */ 15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* ICU specific thread attach could go here */ 15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho break; 15350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 15450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case DLL_THREAD_DETACH: 15550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* ICU does not trap thread detach, but must pass these through properly. */ 15650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* ICU specific thread detach could go here */ 15750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho break; 15850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 15950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 16050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return status; 16150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 16283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 16383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#elif defined(__GNUC__) 16483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius/* GCC - use __attribute((destructor)) */ 16583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusstatic void ucln_destructor() __attribute__((destructor)) ; 16683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 16783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusstatic void ucln_destructor() 16883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius{ 16983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UCLN_CLEAN_ME_UP; 17083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius} 17183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 17250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 17350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 17450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif /* UCLN_NO_AUTO_CLEANUP */ 17550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 17650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else 17750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#error This file can only be included once. 17850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 179