Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc Redo the locale cache to be constant. It now contai...



details:   https://anonhg.NetBSD.org/src/rev/6e7c3d48d5a4
branches:  trunk
changeset: 789924:6e7c3d48d5a4
user:      joerg <joerg%NetBSD.org@localhost>
date:      Fri Sep 13 13:13:32 2013 +0000

description:
Redo the locale cache to be constant. It now contains the localeconv()
data and which LC_MONETARY and LC_NUMERIC values it is derived from.
In newlocale(3) and setlocale(3), check for the existing entries and on
miss, create a new entry. This is currently not using a lock for the
list as the worst case is a small memory leak.

diffstat:

 lib/libc/citrus/citrus_lc_ctype.c          |  12 +---
 lib/libc/compat/locale/compat_setlocale1.c |  11 ++-
 lib/libc/locale/global_locale.c            |  52 ++++++++---------
 lib/libc/locale/localeconv.c               |   8 +-
 lib/libc/locale/nb_lc_messages_misc.h      |  10 +---
 lib/libc/locale/nb_lc_monetary_misc.h      |  37 +------------
 lib/libc/locale/nb_lc_numeric_misc.h       |  18 +-----
 lib/libc/locale/nb_lc_template.h           |   3 +-
 lib/libc/locale/nb_lc_template_decl.h      |   6 +-
 lib/libc/locale/nb_lc_time_misc.h          |  11 +---
 lib/libc/locale/newlocale.c                |   8 ++-
 lib/libc/locale/setlocale.c                |  88 ++++++++++++++++++++++++++++-
 lib/libc/locale/setlocale_local.h          |  21 ++++---
 13 files changed, 146 insertions(+), 139 deletions(-)

diffs (truncated from 581 to 300 lines):

diff -r e9277402f509 -r 6e7c3d48d5a4 lib/libc/citrus/citrus_lc_ctype.c
--- a/lib/libc/citrus/citrus_lc_ctype.c Fri Sep 13 07:18:34 2013 +0000
+++ b/lib/libc/citrus/citrus_lc_ctype.c Fri Sep 13 13:13:32 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: citrus_lc_ctype.c,v 1.14 2013/08/20 19:58:30 joerg Exp $ */
+/* $NetBSD: citrus_lc_ctype.c,v 1.15 2013/09/13 13:13:32 joerg Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: citrus_lc_ctype.c,v 1.14 2013/08/20 19:58:30 joerg Exp $");
+__RCSID("$NetBSD: citrus_lc_ctype.c,v 1.15 2013/09/13 13:13:32 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "reentrant.h"
@@ -96,14 +96,6 @@
 }
 
 static __inline void
-_PREFIX(build_cache)(struct _locale_cache_t * __restrict cache,
-    _RuneLocale * __restrict data)
-{
-       _DIAGASSERT(cache != NULL);
-       _DIAGASSERT(data != NULL);
-}
-
-static __inline void
 _PREFIX(update_global)(_RuneLocale *data)
 {
        _DIAGASSERT(data != NULL);
diff -r e9277402f509 -r 6e7c3d48d5a4 lib/libc/compat/locale/compat_setlocale1.c
--- a/lib/libc/compat/locale/compat_setlocale1.c        Fri Sep 13 07:18:34 2013 +0000
+++ b/lib/libc/compat/locale/compat_setlocale1.c        Fri Sep 13 13:13:32 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: compat_setlocale1.c,v 1.1 2010/06/07 13:52:30 tnozaki Exp $ */
+/* $NetBSD: compat_setlocale1.c,v 1.2 2013/09/13 13:13:32 joerg Exp $ */
 
 /*-
  * Copyright (c)1999 Citrus Project,
@@ -30,7 +30,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: compat_setlocale1.c,v 1.1 2010/06/07 13:52:30 tnozaki Exp $");
+__RCSID("$NetBSD: compat_setlocale1.c,v 1.2 2013/09/13 13:13:32 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/types.h>
@@ -38,6 +38,8 @@
 
 #include "setlocale_local.h"
 
+#undef setlocale
+
 __warn_references(setlocale,
     "warning: reference to compatibility setlocale();"
     "include <locale.h> for correct reference")
@@ -47,7 +49,10 @@
  * This function will ensure binary compatibility for old executables.
  */
 char *
-setlocale(int category, const char *locale)
+compat_setlocale(int category, const char *locale) __RENAME(setlocale);
+
+char *
+compat_setlocale(int category, const char *locale)
 {
 
        /* locale may be NULL */
diff -r e9277402f509 -r 6e7c3d48d5a4 lib/libc/locale/global_locale.c
--- a/lib/libc/locale/global_locale.c   Fri Sep 13 07:18:34 2013 +0000
+++ b/lib/libc/locale/global_locale.c   Fri Sep 13 13:13:32 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: global_locale.c,v 1.20 2013/08/20 19:58:30 joerg Exp $ */
+/* $NetBSD: global_locale.c,v 1.21 2013/09/13 13:13:32 joerg Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: global_locale.c,v 1.20 2013/08/20 19:58:30 joerg Exp $");
+__RCSID("$NetBSD: global_locale.c,v 1.21 2013/09/13 13:13:32 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/types.h>
@@ -110,7 +110,10 @@
        "%I:%M:%S %p"
 };
 
-static const struct lconv _C_ldata = {
+static const char _lc_C_locale_name[] = _C_LOCALE;
+
+__dso_hidden const struct _locale_cache_t _C_cache = {
+    .ldata = {
        .decimal_point          = __UNCONST("."),
        .thousands_sep          = __UNCONST(""),
        .grouping               = __UNCONST(""),
@@ -135,23 +138,22 @@
        .int_n_sep_by_space     = NBCHAR_MAX,
        .int_p_sign_posn        = NBCHAR_MAX,
        .int_n_sign_posn        = NBCHAR_MAX,
-};
-
-static struct _locale_cache_t _global_cache = {
-    .ldata = __UNCONST(&_C_ldata),
+    },
+    .monetary_name = _lc_C_locale_name,
+    .numeric_name = _lc_C_locale_name,
 };
 
 __dso_protected struct _locale _lc_global_locale = {
-    .cache = &_global_cache,
+    .cache = &_C_cache,
     .query = { _C_LOCALE },
     .part_name = {
-       [(size_t)LC_ALL     ] = _C_LOCALE,
-       [(size_t)LC_COLLATE ] = _C_LOCALE,
-       [(size_t)LC_CTYPE   ] = _C_LOCALE,
-       [(size_t)LC_MONETARY] = _C_LOCALE,
-       [(size_t)LC_NUMERIC ] = _C_LOCALE,
-       [(size_t)LC_TIME    ] = _C_LOCALE,
-       [(size_t)LC_MESSAGES] = _C_LOCALE,
+       [(size_t)LC_ALL     ] = _lc_C_locale_name,
+       [(size_t)LC_COLLATE ] = _lc_C_locale_name,
+       [(size_t)LC_CTYPE   ] = _lc_C_locale_name,
+       [(size_t)LC_MONETARY] = _lc_C_locale_name,
+       [(size_t)LC_NUMERIC ] = _lc_C_locale_name,
+       [(size_t)LC_TIME    ] = _lc_C_locale_name,
+       [(size_t)LC_MESSAGES] = _lc_C_locale_name,
     },
     .part_impl = {
        [(size_t)LC_ALL     ] = (_locale_part_t)NULL,
@@ -169,21 +171,17 @@
     },
 };
 
-static const struct _locale_cache_t _C_cache = {
-    .ldata = __UNCONST(&_C_ldata),
-};
-
 __dso_protected const struct _locale _lc_C_locale = {
-    .cache = __UNCONST(&_C_cache),
+    .cache = &_C_cache,
     .query = { _C_LOCALE },
     .part_name = {
-       [(size_t)LC_ALL     ] = _C_LOCALE,
-       [(size_t)LC_COLLATE ] = _C_LOCALE,
-       [(size_t)LC_CTYPE   ] = _C_LOCALE,
-       [(size_t)LC_MONETARY] = _C_LOCALE,
-       [(size_t)LC_NUMERIC ] = _C_LOCALE,
-       [(size_t)LC_TIME    ] = _C_LOCALE,
-       [(size_t)LC_MESSAGES] = _C_LOCALE,
+       [(size_t)LC_ALL     ] = _lc_C_locale_name,
+       [(size_t)LC_COLLATE ] = _lc_C_locale_name,
+       [(size_t)LC_CTYPE   ] = _lc_C_locale_name,
+       [(size_t)LC_MONETARY] = _lc_C_locale_name,
+       [(size_t)LC_NUMERIC ] = _lc_C_locale_name,
+       [(size_t)LC_TIME    ] = _lc_C_locale_name,
+       [(size_t)LC_MESSAGES] = _lc_C_locale_name,
     },
     .part_impl = {
        [(size_t)LC_ALL     ] = (_locale_part_t)NULL,
diff -r e9277402f509 -r 6e7c3d48d5a4 lib/libc/locale/localeconv.c
--- a/lib/libc/locale/localeconv.c      Fri Sep 13 07:18:34 2013 +0000
+++ b/lib/libc/locale/localeconv.c      Fri Sep 13 13:13:32 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: localeconv.c,v 1.21 2013/05/17 12:55:57 joerg Exp $ */
+/* $NetBSD: localeconv.c,v 1.22 2013/09/13 13:13:32 joerg Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: localeconv.c,v 1.21 2013/05/17 12:55:57 joerg Exp $");
+__RCSID("$NetBSD: localeconv.c,v 1.22 2013/09/13 13:13:32 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/types.h>
@@ -41,11 +41,11 @@
 struct lconv *
 localeconv(void)
 {
-       return _current_cache()->ldata;
+       return localeconv_l(_current_locale());
 }
 
 struct lconv *
 localeconv_l(locale_t loc)
 {
-       return loc->cache->ldata;
+       return __UNCONST(&loc->cache->ldata);
 }
diff -r e9277402f509 -r 6e7c3d48d5a4 lib/libc/locale/nb_lc_messages_misc.h
--- a/lib/libc/locale/nb_lc_messages_misc.h     Fri Sep 13 07:18:34 2013 +0000
+++ b/lib/libc/locale/nb_lc_messages_misc.h     Fri Sep 13 13:13:32 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nb_lc_messages_misc.h,v 1.6 2013/08/20 19:58:30 joerg Exp $ */
+/* $NetBSD: nb_lc_messages_misc.h,v 1.7 2013/09/13 13:13:32 joerg Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -34,14 +34,6 @@
  */
 #define _CATEGORY_TYPE         _MessagesLocale
 
-static __inline void
-_PREFIX(build_cache)(struct _locale_cache_t * __restrict cache,
-    _MessagesLocale * __restrict data)
-{
-       _DIAGASSERT(cache != NULL);
-       _DIAGASSERT(data != NULL);
-}
-
 /* ARGSUSED */
 static __inline void
 _PREFIX(update_global)(_MessagesLocale *data)
diff -r e9277402f509 -r 6e7c3d48d5a4 lib/libc/locale/nb_lc_monetary_misc.h
--- a/lib/libc/locale/nb_lc_monetary_misc.h     Fri Sep 13 07:18:34 2013 +0000
+++ b/lib/libc/locale/nb_lc_monetary_misc.h     Fri Sep 13 13:13:32 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nb_lc_monetary_misc.h,v 1.6 2013/08/20 19:58:30 joerg Exp $ */
+/* $NetBSD: nb_lc_monetary_misc.h,v 1.7 2013/09/13 13:13:32 joerg Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -34,41 +34,6 @@
  */
 #define _CATEGORY_TYPE         _MonetaryLocale
 
-static __inline void
-_PREFIX(build_cache)(struct _locale_cache_t * __restrict cache,
-    _MonetaryLocale * __restrict data)
-{
-       struct lconv *ldata;
-
-       _DIAGASSERT(cache != NULL);
-       _DIAGASSERT(cache->ldata != NULL);
-       _DIAGASSERT(data != NULL);
-
-       ldata = cache->ldata;
-       ldata->int_curr_symbol   = __UNCONST(data->int_curr_symbol);
-       ldata->currency_symbol   = __UNCONST(data->currency_symbol);
-       ldata->mon_decimal_point = __UNCONST(data->mon_decimal_point);
-       ldata->mon_thousands_sep = __UNCONST(data->mon_thousands_sep);
-       ldata->mon_grouping      = __UNCONST(data->mon_grouping);
-       ldata->positive_sign     = __UNCONST(data->positive_sign);
-       ldata->negative_sign     = __UNCONST(data->negative_sign);
-
-       ldata->int_frac_digits    = data->int_frac_digits;
-       ldata->frac_digits        = data->frac_digits;
-       ldata->p_cs_precedes      = data->p_cs_precedes;
-       ldata->p_sep_by_space     = data->p_sep_by_space;
-       ldata->n_cs_precedes      = data->n_cs_precedes;
-       ldata->n_sep_by_space     = data->n_sep_by_space;
-       ldata->p_sign_posn        = data->p_sign_posn;
-       ldata->n_sign_posn        = data->n_sign_posn;
-       ldata->int_p_cs_precedes  = data->int_p_cs_precedes;
-       ldata->int_n_cs_precedes  = data->int_n_cs_precedes;
-       ldata->int_p_sep_by_space = data-> int_p_sep_by_space;
-       ldata->int_n_sep_by_space = data->int_n_sep_by_space;
-       ldata->int_p_sign_posn    = data->int_p_sign_posn;
-       ldata->int_n_sign_posn    = data->int_n_sign_posn;
-}
-
 /* ARGSUSED */
 static __inline void
 _PREFIX(update_global)(_MonetaryLocale *data)
diff -r e9277402f509 -r 6e7c3d48d5a4 lib/libc/locale/nb_lc_numeric_misc.h
--- a/lib/libc/locale/nb_lc_numeric_misc.h      Fri Sep 13 07:18:34 2013 +0000
+++ b/lib/libc/locale/nb_lc_numeric_misc.h      Fri Sep 13 13:13:32 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nb_lc_numeric_misc.h,v 1.6 2013/08/20 19:58:30 joerg Exp $ */
+/* $NetBSD: nb_lc_numeric_misc.h,v 1.7 2013/09/13 13:13:32 joerg Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -34,22 +34,6 @@
  */
 #define _CATEGORY_TYPE         _NumericLocale
 
-static __inline void
-_PREFIX(build_cache)(struct _locale_cache_t * __restrict cache,
-    _NumericLocale * __restrict data)
-{
-       struct lconv *ldata;
-
-       _DIAGASSERT(cache != NULL);
-       _DIAGASSERT(cache->ldata != NULL);
-       _DIAGASSERT(data != NULL);
-
-       ldata = cache->ldata;
-       ldata->decimal_point = __UNCONST(data->decimal_point);
-       ldata->thousands_sep = __UNCONST(data->thousands_sep);



Home | Main Index | Thread Index | Old Index