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