* locale/setlocale.c (free_mem): Don't try to free C locale data
	and use setdata instead of doing it by hand.

	* iconv/gconv_conf.c (add_alias): Check that so such alias is
	currently stored.

	* iconv/gconv_db.c (free_derivation): Free names if charsets for
	first and last step.
This commit is contained in:
Ulrich Drepper 1999-01-28 16:49:20 +00:00
parent e6df9a5693
commit 744541835f
5 changed files with 26 additions and 10 deletions

View File

@ -1,5 +1,14 @@
1999-01-28 Ulrich Drepper <drepper@cygnus.com> 1999-01-28 Ulrich Drepper <drepper@cygnus.com>
* locale/setlocale.c (free_mem): Don't try to free C locale data
and use setdata instead of doing it by hand.
* iconv/gconv_conf.c (add_alias): Check that so such alias is
currently stored.
* iconv/gconv_db.c (free_derivation): Free names if charsets for
first and last step.
* iconv/gconv_dl.c: Unload all modules when debugging memory use. * iconv/gconv_dl.c: Unload all modules when debugging memory use.
* locale/loadlocale.c (_nl_unload_locale): Free locale name. * locale/loadlocale.c (_nl_unload_locale): Free locale name.

View File

@ -206,8 +206,9 @@ add_alias (char *rp, void *modules)
from, wp - from); from, wp - from);
new_alias->toname = new_alias->fromname + (to - from); new_alias->toname = new_alias->fromname + (to - from);
if (__tsearch (new_alias, &__gconv_alias_db, __gconv_alias_compare) if (__tfind (new_alias, &__gconv_alias_db, __gconv_alias_compare) != NULL
== NULL) || (__tsearch (new_alias, &__gconv_alias_db, __gconv_alias_compare)
== NULL))
/* Something went wrong, free this entry. */ /* Something went wrong, free this entry. */
free (new_alias); free (new_alias);
} }

View File

@ -163,6 +163,10 @@ free_derivation (void *p)
if (deriv->steps[cnt].end_fct) if (deriv->steps[cnt].end_fct)
_CALL_DL_FCT (deriv->steps[cnt].end_fct, (&deriv->steps[cnt])); _CALL_DL_FCT (deriv->steps[cnt].end_fct, (&deriv->steps[cnt]));
/* Free the name strings. */
free ((char *) deriv->steps[0].from_name);
free ((char *) deriv->steps[deriv->nsteps - 1].to_name);
free ((struct gconv_step *) deriv->steps); free ((struct gconv_step *) deriv->steps);
free (deriv); free (deriv);
} }

View File

@ -254,16 +254,14 @@ __gconv_release_shlib (struct gconv_loaded_object *handle)
/* We run this if we debug the memory allocation. */ /* We run this if we debug the memory allocation. */
static void static void
do_release_all (const void *nodep, VISIT value, int level) do_release_all (void *nodep)
{ {
struct gconv_loaded_object *obj = *(struct gconv_loaded_object **) nodep; struct gconv_loaded_object *obj = (struct gconv_loaded_object *) nodep;
if (value != preorder && value != leaf)
return;
/* Unload the shared object. We don't use the trick to /* Unload the shared object. We don't use the trick to
catch errors since in the case an error is signalled catch errors since in the case an error is signalled
something is really wrong. */ something is really wrong. */
if (obj->handle != NULL)
_dl_close (obj->handle); _dl_close (obj->handle);
free (obj); free (obj);
@ -272,6 +270,6 @@ do_release_all (const void *nodep, VISIT value, int level)
static void __attribute__ ((unused)) static void __attribute__ ((unused))
free_mem (void) free_mem (void)
{ {
__twalk (loaded, do_release_all); __tdestroy (loaded, do_release_all);
} }
text_set_element (__libc_subfreeres, free_mem); text_set_element (__libc_subfreeres, free_mem);

View File

@ -402,9 +402,13 @@ free_mem (void)
{ {
struct locale_data *here = *_nl_current[category]; struct locale_data *here = *_nl_current[category];
/* If this category is already "C" don't do anything. */
if (here == _nl_C[category])
continue;
/* We have to be prepared that sometime later me still might /* We have to be prepared that sometime later me still might
need the locale information. */ need the locale information. */
*_nl_current[category] = _nl_C[category]; setdata (category, _nl_C[category]);
setname (category, _nl_C_name); setname (category, _nl_C_name);
_nl_unload_locale (here); _nl_unload_locale (here);