| /* |
| ******************************************************************************* |
| * |
| * Copyright (C) 1998-1999, International Business Machines |
| * Corporation and others. All Rights Reserved. |
| * |
| ******************************************************************************* |
| * |
| * File loccache.c |
| * |
| * Modification History: |
| * |
| * Date Name Description |
| * 11/18/98 stephen Creation. |
| * 03/11/99 stephen Modified for new C API. |
| * 06/16/99 stephen Added #include for uloc.h |
| ******************************************************************************* |
| */ |
| |
| #include "loccache.h" |
| #include "uhash.h" |
| #include "unicode/uloc.h" |
| #include "umutex.h" |
| |
| /* The global cache */ |
| UHashtable *gLocaleCache = 0; |
| |
| ULocaleBundle* |
| u_loccache_get(const char *loc) |
| { |
| ULocaleBundle *result; |
| ULocaleBundle *tempBundle; |
| /*Mutex *lock;*/ |
| UHashtable *tempCache; |
| int32_t locCount; |
| UErrorCode status = U_ZERO_ERROR; |
| |
| /* Create the cache, if needed */ |
| if(gLocaleCache == 0) { |
| locCount = uloc_countAvailable(); |
| |
| tempCache = uhash_openSize(uhash_hashChars, uhash_compareChars, locCount, &status); |
| if(U_FAILURE(status)) return 0; |
| |
| /* Lock the cache */ |
| umtx_lock(0); |
| /* Make sure it didn't change while we were acquiring the lock */ |
| if(gLocaleCache == 0) { |
| gLocaleCache = tempCache; |
| } |
| else { |
| uhash_close(tempCache); |
| } |
| |
| /* Unlock the cache */ |
| umtx_unlock(0); |
| } |
| |
| /* Try and get the bundle from the cache */ |
| /* This will be slightly wasteful the first time around, */ |
| /* since we know the cache will be empty. But, it simplifies */ |
| /* the code a great deal. */ |
| |
| result = (ULocaleBundle*)uhash_get(gLocaleCache, loc); |
| |
| /* If the bundle wasn't found, create it and add it to the cache */ |
| if(result == 0) { |
| /* Create the bundle */ |
| tempBundle = u_locbund_new(loc); |
| |
| /* Lock the cache */ |
| umtx_lock(0); |
| |
| /* Make sure the cache didn't change while we were locking it */ |
| result = (ULocaleBundle*)uhash_get(gLocaleCache, loc); |
| if(result == 0) { |
| result = tempBundle; |
| uhash_put(gLocaleCache, tempBundle->fLocale, tempBundle, &status); |
| } |
| else |
| u_locbund_delete(tempBundle); |
| |
| /* Unlock the cache */ |
| umtx_unlock(0); |
| } |
| |
| return result; |
| } |