From a31f867a42e8dd7a92e58f70b73366e0a3677f57 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 31 Dec 2003 22:46:53 +0000 Subject: Update. * locale/setlocale.c (setlocale): Avoid duplicating locale names if we can reuse old strings. --- locale/setlocale.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'locale') 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. */ -- cgit v1.2.3