aboutsummaryrefslogtreecommitdiff
path: root/locale/setlocale.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-12-31 22:46:53 +0000
committerUlrich Drepper <drepper@redhat.com>2003-12-31 22:46:53 +0000
commita31f867a42e8dd7a92e58f70b73366e0a3677f57 (patch)
tree3d121d1903b77603a770852988ad4c3e734f8699 /locale/setlocale.c
parent520ec963af2e012caa5609ad2fac041f6e7af6d7 (diff)
downloadglibc-a31f867a42e8dd7a92e58f70b73366e0a3677f57.tar
glibc-a31f867a42e8dd7a92e58f70b73366e0a3677f57.tar.gz
glibc-a31f867a42e8dd7a92e58f70b73366e0a3677f57.tar.bz2
glibc-a31f867a42e8dd7a92e58f70b73366e0a3677f57.zip
Update.
* locale/setlocale.c (setlocale): Avoid duplicating locale names if we can reuse old strings.
Diffstat (limited to 'locale/setlocale.c')
-rw-r--r--locale/setlocale.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/locale/setlocale.c b/locale/setlocale.c
index 9f6e96439b..d012d0265f 100644
--- a/locale/setlocale.c
+++ b/locale/setlocale.c
@@ -322,17 +322,25 @@ setlocale (int category, const char *locale)
break;
}
- /* We must not simply free a global locale since we have no
- control over the usage. So we mark it as un-deletable. */
+ /* We must not simply free a global locale since we have
+ no control over the usage. So we mark it as
+ un-deletable. And yes, the 'if' is needed, the data
+ might be in read-only memory. */
if (newdata[category]->usage_count != UNDELETABLE)
newdata[category]->usage_count = UNDELETABLE;
/* Make a copy of locale name. */
if (newnames[category] != _nl_C_name)
{
- newnames[category] = __strdup (newnames[category]);
- if (newnames[category] == NULL)
- break;
+ if (strcmp (newnames[category],
+ _nl_global_locale.__names[category]) == 0)
+ newnames[category] = _nl_global_locale.__names[category];
+ else
+ {
+ newnames[category] = __strdup (newnames[category]);
+ if (newnames[category] == NULL)
+ break;
+ }
}
}
@@ -356,7 +364,8 @@ setlocale (int category, const char *locale)
}
else
for (++category; category < __LC_LAST; ++category)
- if (category != LC_ALL && newnames[category] != _nl_C_name)
+ if (category != LC_ALL && newnames[category] != _nl_C_name
+ && newnames[category] != _nl_global_locale.__names[category])
free ((char *) newnames[category]);
/* Critical section left. */