diff options
Diffstat (limited to 'src/locale/uselocale.c')
-rw-r--r-- | src/locale/uselocale.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/locale/uselocale.c b/src/locale/uselocale.c index 4fc5c64e..51067957 100644 --- a/src/locale/uselocale.c +++ b/src/locale/uselocale.c @@ -2,12 +2,25 @@ #include "pthread_impl.h" #include "libc.h" -locale_t uselocale(locale_t l) +locale_t __uselocale(locale_t new) { pthread_t self = __pthread_self(); locale_t old = self->locale; - if (l) self->locale = l; - return old; + locale_t global = &libc.global_locale; + + if (new == LC_GLOBAL_LOCALE) new = global; + + if (new && new != old) { + int adj = 0; + if (new == global) a_dec(&libc.uselocale_cnt); + else if (!new->ctype_utf8) adj++; + if (old == global) a_inc(&libc.uselocale_cnt); + else if (!old->ctype_utf8) adj--; + a_fetch_add(&libc.bytelocale_cnt_minus_1, adj); + self->locale = new; + } + + return old == global ? LC_GLOBAL_LOCALE : old; } -weak_alias(uselocale, __uselocale); +weak_alias(__uselocale, uselocale); |