From 0f283ffc5e8822a367c4703abd584348ff139810 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Sun, 1 Sep 2002 12:39:40 +0000 Subject: * sysdeps/generic/libc-tls.c (__pthread_initialize_minimal): Pass TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN instead of 0, 1. * include/getopt.h: Include before . * locale/findlocale.c (_nl_remove_locale): Don't search in _nl_locale_file_list if DATA->alloc is ld_archive. Use _nl_unload_locale to do the rest of the work. * locale/loadarchive.c (_nl_load_locale_from_archive): Set usage_count of new structure to UNDELETABLE. * wctype/wctype.h (iswalnum, iswalpha, iswcntrl, iswdigit, iswlower, iswgraph, iswprint, iswpunct, iswspace, iswupper, iswxdigit, iswblank, towlower, towupper): Macros removed. * ctype/ctype.h (__tobody): Put parens around macro argument. (__isctype): Macro removed. (__ctype_b, __ctype_tolower, __ctype_toupper): Decls removed. (isalnum, isalpha, iscntrl, isdigit, islower, isgraph, isprint, ispunct, isspace, isupper, isxdigit, isblank, _tolower, _toupper, tolower, toupper): Macros and inlines removed. * include/ctype.h [! NOT_IN_libc] (isalnum, isalpha, iscntrl, isdigit, islower, isgraph, isprint, ispunct, isspace, isupper, isxdigit, isblank, _tolower, _toupper, tolower, toupper): Define here instead, using _NL_CURRENT. * ctype/ctype.c (__ctype_tolower, __ctype_toupper): Define as macros using _NL_CURRENT. * ctype/ctype-extn.c (__ctype_tolower, __ctype_toupper): Likewise. * ctype/ctype-info.c (__ctype_b, __ctype_tolower, __ctype_toupper): Renamed these to __ctype_old_*. Define old names only for SHLIB_COMPAT. (__ctype32_b, __ctype32_tolower, __ctype32_toupper): Likewise. (__ctype32_wctrans, __ctype32_wctrans, __ctype32_width): Removed. * locale/lc-ctype.c (_nl_postload_ctype): Use renamed variables, conditional on SHLIB_COMPAT. Don't set removed variables at all. * wctype/wcfuncs.c: Use _NL_CURRENT instead of those globals. * wcsmbs/wcwidth.h (internal_wcwidth): Likewise. * resolv/res_init.c [RESOLVSORT] (sort_mask): Renamed sort_mask_chars. (ISSORTMASK): Update use. * intl/localealias.c [__GNUC__]: #undef alloca before #define. * nss/nss_files/files-XXX.c (last_use): Rename `none' to `nouse'. (_nss_files_getENTNAME_r): Likewise. * nss/nss_files/files-alias.c (last_use, _nss_files_getaliasent_r): Likewise. * Makerules (all-nonlib): Renamed from all-tests. Include $(others) here too. * locale/Makefile (CPPFLAGS-locale, CPPFLAGS-localedef, CPPFLAGS-ld-ctype, CPPFLAGS-ld-time, CPPFLAGS-ld-numeric, CPPFLAGS-ld-monetary, CPPFLAGS-ld-collate, CPPFLAGS-ld-identification, CPPFLAGS-charmap, CPPFLAGS-locarchive, CPPFLAGS-linereader, CPPFLAGS-charmap-dir): Variables removed. Instead, catch all the program modules via cppflags-iterator.mk. * sunrpc/Makefile (CPPFLAGS-rpc_main): Variable removed. Instead, catch all rpcgen-objs via cppflags-iterator.mk. * posix/tst-getconf.sh: If no third arg, work with static linking. --- locale/Makefile | 17 +++++------------ locale/findlocale.c | 47 +++++++++++++++------------------------------ locale/lc-ctype.c | 54 +++++++++++++++++++++++++++------------------------- locale/loadarchive.c | 9 +++++++++ 4 files changed, 57 insertions(+), 70 deletions(-) (limited to 'locale') diff --git a/locale/Makefile b/locale/Makefile index 27bd893c4a..ec47bde054 100644 --- a/locale/Makefile +++ b/locale/Makefile @@ -101,18 +101,11 @@ CFLAGS-charmap.c = -Wno-write-strings -Wno-char-subscripts CFLAGS-locfile.c = -Wno-write-strings -Wno-char-subscripts CFLAGS-charmap-dir.c = -Wno-write-strings -CPPFLAGS-locale = -DNOT_IN_libc -CPPFLAGS-localedef = -DNOT_IN_libc -CPPFLAGS-ld-ctype = -DNOT_IN_libc -CPPFLAGS-ld-time = -DNOT_IN_libc -CPPFLAGS-ld-numeric = -DNOT_IN_libc -CPPFLAGS-ld-monetary = -DNOT_IN_libc -CPPFLAGS-ld-collate = -DNOT_IN_libc -CPPFLAGS-ld-identification = -DNOT_IN_libc -CPPFLAGS-charmap = -DNOT_IN_libc -CPPFLAGS-locarchive = -DNOT_IN_libc -CPPFLAGS-linereader = -DNOT_IN_libc -CPPFLAGS-charmap-dir = -DNOT_IN_libc +# This makes sure -DNOT_IN_libc is passed for all these modules. +cpp-srcs-left := $(addsuffix .c,$(localedef-modules) $(localedef-aux) \ + $(locale-modules) $(lib-modules)) +lib := locale_programs +include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) # Depend on libc.so so a DT_NEEDED is generated in the shared objects. # This ensures they will load libc.so for needed symbols if loaded by diff --git a/locale/findlocale.c b/locale/findlocale.c index 6ecfdc2324..9c9b85347f 100644 --- a/locale/findlocale.c +++ b/locale/findlocale.c @@ -270,40 +270,23 @@ _nl_remove_locale (int locale, struct locale_data *data) { if (--data->usage_count == 0) { - /* First search the entry in the list of loaded files. */ - struct loaded_l10nfile *ptr = _nl_locale_file_list[locale]; - - /* Search for the entry. It must be in the list. Otherwise it - is a bug and we crash badly. */ - while ((struct locale_data *) ptr->data != data) - ptr = ptr->next; - - /* Mark the data as not available anymore. So when the data has - to be used again it is reloaded. */ - ptr->decided = 0; - ptr->data = NULL; - - /* Free the name. */ - free ((char *) data->name); - -#ifdef _POSIX_MAPPED_FILES - /* Really delete the data. First delete the real data. */ - if (__builtin_expect (data->alloc == ld_mapped, 1)) + if (data->alloc != ld_archive) { - /* Try to unmap the area. If this fails we mark the area as - permanent. */ - if (__munmap ((caddr_t) data->filedata, data->filesize) != 0) - { - data->usage_count = UNDELETABLE; - return; - } + /* First search the entry in the list of loaded files. */ + struct loaded_l10nfile *ptr = _nl_locale_file_list[locale]; + + /* Search for the entry. It must be in the list. Otherwise it + is a bug and we crash badly. */ + while ((struct locale_data *) ptr->data != data) + ptr = ptr->next; + + /* Mark the data as not available anymore. So when the data has + to be used again it is reloaded. */ + ptr->decided = 0; + ptr->data = NULL; } - else -#endif /* _POSIX_MAPPED_FILES */ - /* The memory was malloced. */ - free ((void *) data->filedata); - /* Now free the structure itself. */ - free (data); + /* This does the real work. */ + _nl_unload_locale (data); } } diff --git a/locale/lc-ctype.c b/locale/lc-ctype.c index 59ff7019aa..69414020b8 100644 --- a/locale/lc-ctype.c +++ b/locale/lc-ctype.c @@ -34,7 +34,8 @@ _NL_CURRENT_DEFINE (LC_CTYPE); void _nl_postload_ctype (void) { - const struct locale_data *data = _NL_CURRENT_DATA (LC_CTYPE); +#include +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3) #define paste(a,b) paste1(a,b) #define paste1(a,b) a##b @@ -42,29 +43,30 @@ _nl_postload_ctype (void) #define current(type,x,offset) \ ((const type *) _NL_CURRENT (LC_CTYPE, paste(_NL_CTYPE_,x)) + offset) - extern const uint32_t *__ctype32_b; - extern const uint32_t *__ctype32_toupper; - extern const uint32_t *__ctype32_tolower; - extern const char *__ctype32_wctype[12] attribute_hidden; - extern const char *__ctype32_wctrans[2] attribute_hidden; - extern const char *__ctype32_width attribute_hidden; - - size_t offset, cnt; - - __ctype_b = current (uint16_t, CLASS, 128); - __ctype_toupper = current (uint32_t, TOUPPER, 128); - __ctype_tolower = current (uint32_t, TOLOWER, 128); - __ctype32_b = current (uint32_t, CLASS32, 0); - __ctype32_toupper = current (uint32_t, TOUPPER32, 0); - __ctype32_tolower = current (uint32_t, TOLOWER32, 0); - - offset = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_CLASS_OFFSET); - for (cnt = 0; cnt < 12; cnt++) - __ctype32_wctype[cnt] = data->values[offset + cnt].string; - - offset = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_OFFSET); - for (cnt = 0; cnt < 2; cnt++) - __ctype32_wctrans[cnt] = data->values[offset + cnt].string; - - __ctype32_width = current (char, WIDTH, 0); +/* These are defined in ctype-info.c. + The declarations here must match those in localeinfo.h. + + These point into arrays of 384, so they can be indexed by any `unsigned + char' value [0,255]; by EOF (-1); or by any `signed char' value + [-128,-1). ISO C requires that the ctype functions work for `unsigned + char' values and for EOF; we also support negative `signed char' values + for broken old programs. The case conversion arrays are of `int's + rather than `unsigned char's because tolower (EOF) must be EOF, which + doesn't fit into an `unsigned char'. But today more important is that + the arrays are also used for multi-byte character sets. */ + extern __const unsigned short int *__ctype_old_b; /* Characteristics. */ + extern __const __int32_t *__ctype_old_tolower; /* Case conversions. */ + extern __const __int32_t *__ctype_old_toupper; /* Case conversions. */ + + extern const uint32_t *__ctype32_old_b; + extern const uint32_t *__ctype32_old_toupper; + extern const uint32_t *__ctype32_old_tolower; + + __ctype_old_b = current (uint16_t, CLASS, 128); + __ctype_old_toupper = current (uint32_t, TOUPPER, 128); + __ctype_old_tolower = current (uint32_t, TOLOWER, 128); + __ctype32_old_b = current (uint32_t, CLASS32, 0); + __ctype32_old_toupper = current (uint32_t, TOUPPER32, 0); + __ctype32_old_tolower = current (uint32_t, TOLOWER32, 0); +#endif } diff --git a/locale/loadarchive.c b/locale/loadarchive.c index e8235c9a4d..aa19dbd5f8 100644 --- a/locale/loadarchive.c +++ b/locale/loadarchive.c @@ -477,6 +477,15 @@ _nl_load_locale_from_archive (int category, const char **namep) /* _nl_intern_locale_data leaves us these fields to initialize. */ lia->data[cnt]->alloc = ld_archive; lia->data[cnt]->name = lia->name; + + /* We do this instead of bumping the count each time we return + this data because the mappings stay around forever anyway + and we might as well hold on to a little more memory and not + have to rebuild it on the next lookup of the same thing. + If we were to maintain the usage_count normally and let the + structures be freed, we would have to remove the elements + from archloaded too. */ + lia->data[cnt]->usage_count = UNDELETABLE; } } -- cgit 1.4.1