diff options
author | Florian Weimer <fweimer@redhat.com> | 2022-05-23 10:08:18 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2022-05-23 11:06:31 +0200 |
commit | 93ec1cf0fef422b137be7a99fdcdf007c318c71d (patch) | |
tree | 1914d79fbb2e93c2e7cb289dad5a94279c67f416 /wcsmbs/wcsmbsload.c | |
parent | 7ee41feba6b834d9e17e634bfbf222c4d8dd1a4f (diff) | |
download | glibc-93ec1cf0fef422b137be7a99fdcdf007c318c71d.tar.gz glibc-93ec1cf0fef422b137be7a99fdcdf007c318c71d.tar.xz glibc-93ec1cf0fef422b137be7a99fdcdf007c318c71d.zip |
locale: Add more cached data to LC_CTYPE
This data will be used in number formatting. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'wcsmbs/wcsmbsload.c')
-rw-r--r-- | wcsmbs/wcsmbsload.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/wcsmbs/wcsmbsload.c b/wcsmbs/wcsmbsload.c index 2650834e29..0f0f55f9ed 100644 --- a/wcsmbs/wcsmbsload.c +++ b/wcsmbs/wcsmbsload.c @@ -150,12 +150,14 @@ __libc_rwlock_define (extern, __libc_setlocale_lock attribute_hidden) void __wcsmbs_load_conv (struct __locale_data *new_category) { + struct lc_ctype_data *data = new_category->private; + /* Acquire the lock. */ __libc_rwlock_wrlock (__libc_setlocale_lock); /* We should repeat the test since while we waited some other thread might have run this function. */ - if (__glibc_likely (new_category->private == NULL)) + if (__glibc_likely (data->fcts == NULL)) { /* We must find the real functions. */ const char *charset_name; @@ -199,10 +201,10 @@ __wcsmbs_load_conv (struct __locale_data *new_category) free (new_fcts); failed: - new_category->private = (void *) &__wcsmbs_gconv_fcts_c; + data->fcts = (void *) &__wcsmbs_gconv_fcts_c; } else - new_category->private = new_fcts; + data->fcts = new_fcts; } __libc_rwlock_unlock (__libc_setlocale_lock); @@ -263,14 +265,15 @@ __wcsmbs_named_conv (struct gconv_fcts *copy, const char *name) void _nl_cleanup_ctype (struct __locale_data *locale) { - const struct gconv_fcts *const data = locale->private; - if (data != NULL && data != &__wcsmbs_gconv_fcts_c) + struct lc_ctype_data *data = locale->private; + if (data->fcts != NULL && data->fcts != &__wcsmbs_gconv_fcts_c) { - locale->private = NULL; - /* Free the old conversions. */ - __gconv_close_transform (data->tomb, data->tomb_nsteps); - __gconv_close_transform (data->towc, data->towc_nsteps); - free ((char *) data); + __gconv_close_transform (data->fcts->tomb, data->fcts->tomb_nsteps); + __gconv_close_transform (data->fcts->towc, data->fcts->towc_nsteps); + + free ((void *) data->fcts); + data->fcts = NULL; + /* data itself is allocated within locale. */ } } |