58 lines
1.7 KiB
Diff
58 lines
1.7 KiB
Diff
Index: lib/libc/locale/setrunelocale.c
|
|
===================================================================
|
|
--- lib/libc/locale/setrunelocale.c (revision 284940)
|
|
+++ lib/libc/locale/setrunelocale.c (working copy)
|
|
@@ -202,6 +202,8 @@ __set_thread_rune_locale(locale_t loc)
|
|
|
|
if (loc == NULL) {
|
|
_ThreadRuneLocale = &_DefaultRuneLocale;
|
|
+ } else if (loc == LC_GLOBAL_LOCALE) {
|
|
+ _ThreadRuneLocale = 0;
|
|
} else {
|
|
_ThreadRuneLocale = XLOCALE_CTYPE(loc)->runes;
|
|
}
|
|
Index: lib/libc/locale/xlocale.c
|
|
===================================================================
|
|
--- lib/libc/locale/xlocale.c (revision 284940)
|
|
+++ lib/libc/locale/xlocale.c (working copy)
|
|
@@ -154,23 +154,24 @@ __get_locale(void)
|
|
static void
|
|
set_thread_locale(locale_t loc)
|
|
{
|
|
+ locale_t l = (loc == LC_GLOBAL_LOCALE) ? 0 : loc;
|
|
|
|
_once(&once_control, init_key);
|
|
|
|
- if (NULL != loc) {
|
|
- xlocale_retain((struct xlocale_refcounted*)loc);
|
|
+ if (NULL != l) {
|
|
+ xlocale_retain((struct xlocale_refcounted*)l);
|
|
}
|
|
locale_t old = pthread_getspecific(locale_info_key);
|
|
- if ((NULL != old) && (loc != old)) {
|
|
+ if ((NULL != old) && (l != old)) {
|
|
xlocale_release((struct xlocale_refcounted*)old);
|
|
}
|
|
if (fake_tls) {
|
|
- thread_local_locale = loc;
|
|
+ thread_local_locale = l;
|
|
} else {
|
|
- pthread_setspecific(locale_info_key, loc);
|
|
+ pthread_setspecific(locale_info_key, l);
|
|
}
|
|
#ifndef __NO_TLS
|
|
- __thread_locale = loc;
|
|
+ __thread_locale = l;
|
|
__set_thread_rune_locale(loc);
|
|
#endif
|
|
}
|
|
@@ -361,9 +362,6 @@ locale_t uselocale(locale_t loc)
|
|
{
|
|
locale_t old = get_thread_locale();
|
|
if (NULL != loc) {
|
|
- if (LC_GLOBAL_LOCALE == loc) {
|
|
- loc = NULL;
|
|
- }
|
|
set_thread_locale(loc);
|
|
}
|
|
return (old ? old : LC_GLOBAL_LOCALE);
|