2 ******************************************************************************
3 * Copyright (C) 2001-2013, 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 cleanupFunc
*gCommonCleanupFunctions
[UCLN_COMMON_COUNT
];
29 static cleanupFunc
*gLibCleanupFunctions
[UCLN_COMMON
];
32 /************************************************
33 The cleanup order is important in this function.
34 Please be sure that you have read ucln.h
35 ************************************************/
39 UTRACE_ENTRY_OC(UTRACE_U_CLEANUP
);
40 umtx_lock(NULL
); /* Force a memory barrier, so that we are sure to see */
41 umtx_unlock(NULL
); /* all state left around by any other threads. */
45 cmemory_cleanup(); /* undo any heap functions set by u_setMemoryFunctions(). */
46 UTRACE_EXIT(); /* Must be before utrace_cleanup(), which turns off tracing. */
47 /*#if U_ENABLE_TRACING*/
52 U_CAPI
void U_EXPORT2
ucln_cleanupOne(ECleanupLibraryType libType
)
54 if (gLibCleanupFunctions
[libType
])
56 gLibCleanupFunctions
[libType
]();
57 gLibCleanupFunctions
[libType
] = NULL
;
62 ucln_common_registerCleanup(ECleanupCommonType type
,
65 U_ASSERT(UCLN_COMMON_START
< type
&& type
< UCLN_COMMON_COUNT
);
66 if (UCLN_COMMON_START
< type
&& type
< UCLN_COMMON_COUNT
)
68 gCommonCleanupFunctions
[type
] = func
;
70 #if !UCLN_NO_AUTO_CLEANUP && (defined(UCLN_AUTO_ATEXIT) || defined(UCLN_AUTO_LOCAL))
71 ucln_registerAutomaticCleanup();
76 ucln_registerCleanup(ECleanupLibraryType type
,
79 U_ASSERT(UCLN_START
< type
&& type
< UCLN_COMMON
);
80 if (UCLN_START
< type
&& type
< UCLN_COMMON
)
82 gLibCleanupFunctions
[type
] = func
;
86 U_CFUNC UBool
ucln_lib_cleanup(void) {
87 ECleanupLibraryType libType
= UCLN_START
;
88 ECleanupCommonType commonFunc
= UCLN_COMMON_START
;
90 for (libType
++; libType
<UCLN_COMMON
; libType
++) {
91 ucln_cleanupOne(libType
);
94 for (commonFunc
++; commonFunc
<UCLN_COMMON_COUNT
; commonFunc
++) {
95 if (gCommonCleanupFunctions
[commonFunc
])
97 gCommonCleanupFunctions
[commonFunc
]();
98 gCommonCleanupFunctions
[commonFunc
] = NULL
;
101 #if !UCLN_NO_AUTO_CLEANUP && (defined(UCLN_AUTO_ATEXIT) || defined(UCLN_AUTO_LOCAL))
102 ucln_unRegisterAutomaticCleanup();