/************************************************ The cleanup order is important in this function. Please be sure that you have read ucln.h ************************************************/ U_CAPI void U_EXPORT2 u_cleanup(void) { UTRACE_ENTRY_OC(UTRACE_U_CLEANUP); icu::umtx_lock(NULL); /* Force a memory barrier, so that we are sure to see */ icu::umtx_unlock(NULL); /* all state left around by any other threads. */ ucln_lib_cleanup(); cmemory_cleanup(); /* undo any heap functions set by u_setMemoryFunctions(). */ UTRACE_EXIT(); /* Must be before utrace_cleanup(), which turns off tracing. */ /*#if U_ENABLE_TRACING*/ utrace_cleanup(); /*#endif*/ }
/************************************************ The cleanup order is important in this function. Please be sure that you have read ucln.h ************************************************/ U_CAPI void U_EXPORT2 u_cleanup(void) { ECleanupLibraryType libType; UTRACE_ENTRY_OC(UTRACE_U_CLEANUP); umtx_lock(NULL); /* Force a memory barrier, so that we are sure to see */ umtx_unlock(NULL); /* all state left around by any other threads. */ for (libType = UCLN_START+1; libType<UCLN_COMMON; libType++) { if (gCleanupFunctions[libType]) { gCleanupFunctions[libType](); gCleanupFunctions[libType] = NULL; } } #if !UCONFIG_NO_IDNA usprep_cleanup(); #endif #if !UCONFIG_NO_BREAK_ITERATION breakiterator_cleanup(); #endif #if !UCONFIG_NO_SERVICE service_cleanup(); #endif ures_cleanup(); locale_cleanup(); uloc_cleanup(); #if !UCONFIG_NO_NORMALIZATION unorm_cleanup(); #endif uset_cleanup(); unames_cleanup(); pname_cleanup(); uchar_cleanup(); ucnv_cleanup(); ucnv_io_cleanup(); udata_cleanup(); putil_cleanup(); umtx_destroy(&gICUInitMutex); umtx_cleanup(); cmemory_cleanup(); /* undo any heap functions set by u_setMemoryFunctions(). */ gICUInitialized = FALSE; UTRACE_EXIT(); /* Must be before utrace_cleanup(), which turns off tracing. */ utrace_cleanup(); }