]> git.saurik.com Git - apple/icu.git/blob - icuSources/common/ucln_cmn.c
ICU-491.11.1.tar.gz
[apple/icu.git] / icuSources / common / ucln_cmn.c
1 /*
2 ******************************************************************************
3 * Copyright (C) 2001-2011, International Business Machines
4 * Corporation and others. All Rights Reserved.
5 ******************************************************************************
6 * file name: ucln_cmn.c
7 * encoding: US-ASCII
8 * tab size: 8 (not used)
9 * indentation:4
10 *
11 * created on: 2001July05
12 * created by: George Rhoten
13 */
14
15 #include "unicode/utypes.h"
16 #include "unicode/uclean.h"
17 #include "utracimp.h"
18 #include "ucln_cmn.h"
19 #include "umutex.h"
20 #include "ucln.h"
21 #include "cmemory.h"
22 #include "uassert.h"
23
24 /** Auto-client for UCLN_COMMON **/
25 #define UCLN_TYPE_IS_COMMON
26 #include "ucln_imp.h"
27
28 U_CDECL_BEGIN
29
30 UBool gICUInitialized = FALSE;
31 UMTX gICUInitMutex = NULL;
32
33 U_CDECL_END
34
35 static cleanupFunc *gCommonCleanupFunctions[UCLN_COMMON_COUNT];
36 static cleanupFunc *gLibCleanupFunctions[UCLN_COMMON];
37
38 /************************************************
39 The cleanup order is important in this function.
40 Please be sure that you have read ucln.h
41 ************************************************/
42 U_CAPI void U_EXPORT2
43 u_cleanup(void)
44 {
45 UTRACE_ENTRY_OC(UTRACE_U_CLEANUP);
46 umtx_lock(NULL); /* Force a memory barrier, so that we are sure to see */
47 umtx_unlock(NULL); /* all state left around by any other threads. */
48
49 ucln_lib_cleanup();
50
51 umtx_destroy(&gICUInitMutex);
52 umtx_cleanup();
53 cmemory_cleanup(); /* undo any heap functions set by u_setMemoryFunctions(). */
54 gICUInitialized = FALSE;
55 UTRACE_EXIT(); /* Must be before utrace_cleanup(), which turns off tracing. */
56 /*#if U_ENABLE_TRACING*/
57 utrace_cleanup();
58 /*#endif*/
59 }
60
61 U_CAPI void U_EXPORT2 ucln_cleanupOne(ECleanupLibraryType libType)
62 {
63 if (gLibCleanupFunctions[libType])
64 {
65 gLibCleanupFunctions[libType]();
66 gLibCleanupFunctions[libType] = NULL;
67 }
68 }
69
70 U_CFUNC void
71 ucln_common_registerCleanup(ECleanupCommonType type,
72 cleanupFunc *func)
73 {
74 U_ASSERT(UCLN_COMMON_START < type && type < UCLN_COMMON_COUNT);
75 if (UCLN_COMMON_START < type && type < UCLN_COMMON_COUNT)
76 {
77 gCommonCleanupFunctions[type] = func;
78 }
79 #if !UCLN_NO_AUTO_CLEANUP && (defined(UCLN_AUTO_ATEXIT) || defined(UCLN_AUTO_LOCAL))
80 ucln_registerAutomaticCleanup();
81 #endif
82 }
83
84 U_CAPI void U_EXPORT2
85 ucln_registerCleanup(ECleanupLibraryType type,
86 cleanupFunc *func)
87 {
88 U_ASSERT(UCLN_START < type && type < UCLN_COMMON);
89 if (UCLN_START < type && type < UCLN_COMMON)
90 {
91 gLibCleanupFunctions[type] = func;
92 }
93 }
94
95 U_CFUNC UBool ucln_lib_cleanup(void) {
96 ECleanupLibraryType libType = UCLN_START;
97 ECleanupCommonType commonFunc = UCLN_COMMON_START;
98
99 for (libType++; libType<UCLN_COMMON; libType++) {
100 ucln_cleanupOne(libType);
101 }
102
103 for (commonFunc++; commonFunc<UCLN_COMMON_COUNT; commonFunc++) {
104 if (gCommonCleanupFunctions[commonFunc])
105 {
106 gCommonCleanupFunctions[commonFunc]();
107 gCommonCleanupFunctions[commonFunc] = NULL;
108 }
109 }
110 #if !UCLN_NO_AUTO_CLEANUP && (defined(UCLN_AUTO_ATEXIT) || defined(UCLN_AUTO_LOCAL))
111 ucln_unRegisterAutomaticCleanup();
112 #endif
113 return TRUE;
114 }