scuffed-code/icu4c/source/extra/ustdio/loccache.c
1999-10-07 00:07:53 +00:00

101 lines
2.8 KiB
C

/*
*******************************************************************************
* *
* COPYRIGHT: *
* (C) Copyright International Business Machines Corporation, 1998 *
* Licensed Material - Program-Property of IBM - All Rights Reserved. *
* US Government Users Restricted Rights - Use, duplication, or disclosure *
* restricted by GSA ADP Schedule Contract with IBM Corp. *
* *
*******************************************************************************
*
* 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 "uloc.h"
#include "umutex.h"
/* The global cache */
UHashtable *gLocaleCache = 0;
/* my custom hashing function */
int32_t
u_locbund_hash(const void *parm)
{
return uhash_hashString(((ULocaleBundle*)parm)->fLocale);
}
ULocaleBundle*
u_loccache_get(const char *loc)
{
ULocaleBundle *result;
ULocaleBundle *tempBundle;
/*Mutex *lock;*/
UHashtable *tempCache;
int32_t locCount;
int32_t hashKey;
UErrorCode status = U_ZERO_ERROR;
/* Create the cache, if needed */
if(gLocaleCache == 0) {
locCount = uloc_countAvailable();
tempCache = uhash_openSize(u_locbund_hash, locCount, &status);
if(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. */
hashKey = uhash_hashString(loc);
result = uhash_get(gLocaleCache, hashKey);
/* 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 = uhash_get(gLocaleCache, hashKey);
if(result == 0) {
result = tempBundle;
uhash_put(gLocaleCache, result, &status);
}
else
u_locbund_delete(tempBundle);
/* Unlock the cache */
umtx_unlock(0);
}
return result;
}