/*
*******************************************************************************
*
*   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 "unicode/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((UHashFunction)u_locbund_hash, 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. */
  
  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;
}
