/* * Mutex Cleanup Function * Reset the mutex function callback pointers. * Called from the global ICU u_cleanup() function. */ U_CFUNC UBool umtx_cleanup(void) { /* Extra, do-nothing function call to suppress compiler warnings on platforms where * mutexed_compare_and_swap is not otherwise used. */ void *pv = &globalMutex; mutexed_compare_and_swap(&pv, NULL, NULL); usrMutexCleanup(); pIncFn = NULL; pDecFn = NULL; gIncDecContext = NULL; return TRUE; }
U_CFUNC UBool umtx_cleanup(void) { ICUMutex *thisMutex = NULL; ICUMutex *nextMutex = NULL; /* Extra, do-nothing function call to suppress compiler warnings on platforms where * mutexed_compare_and_swap is not otherwise used. */ mutexed_compare_and_swap(&globalUMTX, NULL, NULL); /* Delete all of the ICU mutexes. Do the global mutex last because it is used during * the umtx_destroy operation of other mutexes. */ for (thisMutex=mutexListHead; thisMutex!=NULL; thisMutex=nextMutex) { UMTX *umtx = thisMutex->owner; nextMutex = thisMutex->next; U_ASSERT(*umtx = (void *)thisMutex); if (umtx != &globalUMTX) { umtx_destroy(umtx); } } umtx_destroy(&globalUMTX); pMutexInitFn = NULL; pMutexDestroyFn = NULL; pMutexLockFn = NULL; pMutexUnlockFn = NULL; gMutexContext = NULL; pIncFn = NULL; pDecFn = NULL; gIncDecContext = NULL; gIncDecMutex = NULL; #if defined (POSIX) /* POSIX platforms must come out of u_cleanup() with a functioning global mutex * to permit the safe resumption of use of ICU in multi-threaded environments. */ umtx_init(&globalUMTX); #endif return TRUE; }