2 ******************************************************************************
3 * Copyright (C) 2001-2012, International Business Machines
4 * Corporation and others. All Rights Reserved.
5 ******************************************************************************
6 * file name: ucln_cmn.c
8 * tab size: 8 (not used)
11 * created on: 2001July05
12 * created by: George Rhoten
15 #include "unicode/utypes.h"
16 #include "unicode/uclean.h"
24 /** Auto-client for UCLN_COMMON **/
25 #define UCLN_TYPE_IS_COMMON
28 static UBool gICUInitialized
= FALSE
;
29 static UMutex gICUInitMutex
= U_MUTEX_INITIALIZER
;
31 static cleanupFunc
*gCommonCleanupFunctions
[UCLN_COMMON_COUNT
];
32 static cleanupFunc
*gLibCleanupFunctions
[UCLN_COMMON
];
34 U_CFUNC UBool
ucln_mutexedInit(initFunc
*func
, UErrorCode
*status
) {
35 UBool initialized
= FALSE
;
36 umtx_lock(&gICUInitMutex
);
37 if (!gICUInitialized
&& U_SUCCESS(*status
)) {
41 gICUInitialized
= TRUE
; /* TODO: don't set if U_FAILURE? */
44 umtx_unlock(&gICUInitMutex
);
48 /************************************************
49 The cleanup order is important in this function.
50 Please be sure that you have read ucln.h
51 ************************************************/
55 UTRACE_ENTRY_OC(UTRACE_U_CLEANUP
);
56 umtx_lock(NULL
); /* Force a memory barrier, so that we are sure to see */
57 umtx_unlock(NULL
); /* all state left around by any other threads. */
62 cmemory_cleanup(); /* undo any heap functions set by u_setMemoryFunctions(). */
63 gICUInitialized
= FALSE
;
64 UTRACE_EXIT(); /* Must be before utrace_cleanup(), which turns off tracing. */
65 /*#if U_ENABLE_TRACING*/
70 U_CAPI
void U_EXPORT2
ucln_cleanupOne(ECleanupLibraryType libType
)
72 if (gLibCleanupFunctions
[libType
])
74 gLibCleanupFunctions
[libType
]();
75 gLibCleanupFunctions
[libType
] = NULL
;
80 ucln_common_registerCleanup(ECleanupCommonType type
,
83 U_ASSERT(UCLN_COMMON_START
< type
&& type
< UCLN_COMMON_COUNT
);
84 if (UCLN_COMMON_START
< type
&& type
< UCLN_COMMON_COUNT
)
86 gCommonCleanupFunctions
[type
] = func
;
88 #if !UCLN_NO_AUTO_CLEANUP && (defined(UCLN_AUTO_ATEXIT) || defined(UCLN_AUTO_LOCAL))
89 ucln_registerAutomaticCleanup();
94 ucln_registerCleanup(ECleanupLibraryType type
,
97 U_ASSERT(UCLN_START
< type
&& type
< UCLN_COMMON
);
98 if (UCLN_START
< type
&& type
< UCLN_COMMON
)
100 gLibCleanupFunctions
[type
] = func
;
104 U_CFUNC UBool
ucln_lib_cleanup(void) {
105 ECleanupLibraryType libType
= UCLN_START
;
106 ECleanupCommonType commonFunc
= UCLN_COMMON_START
;
108 for (libType
++; libType
<UCLN_COMMON
; libType
++) {
109 ucln_cleanupOne(libType
);
112 for (commonFunc
++; commonFunc
<UCLN_COMMON_COUNT
; commonFunc
++) {
113 if (gCommonCleanupFunctions
[commonFunc
])
115 gCommonCleanupFunctions
[commonFunc
]();
116 gCommonCleanupFunctions
[commonFunc
] = NULL
;
119 #if !UCLN_NO_AUTO_CLEANUP && (defined(UCLN_AUTO_ATEXIT) || defined(UCLN_AUTO_LOCAL))
120 ucln_unRegisterAutomaticCleanup();