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