/*
*******************************************************************************
*
-* Copyright (C) 1998-2012, International Business Machines
+* Copyright (C) 1998-2013, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
#include "cmemory.h"
#include "cstring.h"
#include "ucln_io.h"
+#include "mutex.h"
#include "umutex.h"
#include "unicode/ustring.h"
#include "unicode/uloc.h"
}
U_CDECL_END
-
+static UMutex gLock = U_MUTEX_INITIALIZER;
static inline UNumberFormat * copyInvariantFormatter(ULocaleBundle *result, UNumberFormatStyle style) {
+ U_NAMESPACE_USE
+ Mutex lock(&gLock);
if (result->fNumberFormat[style-1] == NULL) {
- UErrorCode status = U_ZERO_ERROR;
- UBool needsInit;
-
- UMTX_CHECK(NULL, gPosixNumberFormat[style-1] == NULL, needsInit);
- if (needsInit) {
+ if (gPosixNumberFormat[style-1] == NULL) {
+ UErrorCode status = U_ZERO_ERROR;
UNumberFormat *formatAlias = unum_open(style, NULL, 0, "en_US_POSIX", NULL, &status);
-
- /* Cache upon first request. */
if (U_SUCCESS(status)) {
- umtx_lock(NULL);
gPosixNumberFormat[style-1] = formatAlias;
ucln_io_registerCleanup(UCLN_IO_LOCBUND, locbund_cleanup);
- umtx_unlock(NULL);
}
}
-
/* Copy the needed formatter. */
- result->fNumberFormat[style-1] = unum_clone(gPosixNumberFormat[style-1], &status);
+ if (gPosixNumberFormat[style-1] != NULL) {
+ UErrorCode status = U_ZERO_ERROR;
+ result->fNumberFormat[style-1] = unum_clone(gPosixNumberFormat[style-1], &status);
+ }
}
return result->fNumberFormat[style-1];
}