2004-07-16  Jakub Jelinek  <jakub@redhat.com>

	* locale/newlocale.c: Include bits/libc-lock.h.
	(__libc_setlocale_lock): Extern decl.
	(__newlocale): Use it.
	Reported by Ulrich Weigand <Ulrich.Weigand@de.ibm.com>.
This commit is contained in:
Ulrich Drepper 2004-07-16 19:06:46 +00:00
parent 06eee9f5f6
commit 531b71dd4d
2 changed files with 23 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2004-07-16 Jakub Jelinek <jakub@redhat.com>
* locale/newlocale.c: Include bits/libc-lock.h.
(__libc_setlocale_lock): Extern decl.
(__newlocale): Use it.
Reported by Ulrich Weigand <Ulrich.Weigand@de.ibm.com>.
2004-07-15 Jakub Jelinek <jakub@redhat.com> 2004-07-15 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/fcntl.c (__fcntl_nocancel): Remove * sysdeps/unix/sysv/linux/fcntl.c (__fcntl_nocancel): Remove

View File

@ -1,5 +1,6 @@
/* Return a reference to locale information record. /* Return a reference to locale information record.
Copyright (C) 1996,1997,1999,2000,2001,2002 Free Software Foundation, Inc. Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2004
Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@ -19,6 +20,7 @@
02111-1307 USA. */ 02111-1307 USA. */
#include <argz.h> #include <argz.h>
#include <bits/libc-lock.h>
#include <errno.h> #include <errno.h>
#include <locale.h> #include <locale.h>
#include <stdlib.h> #include <stdlib.h>
@ -27,6 +29,10 @@
#include "localeinfo.h" #include "localeinfo.h"
/* Lock for protecting global data. */
__libc_lock_define (extern , __libc_setlocale_lock attribute_hidden)
/* Use this when we come along an error. */ /* Use this when we come along an error. */
#define ERROR_RETURN \ #define ERROR_RETURN \
do { \ do { \
@ -154,6 +160,9 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
ERROR_RETURN; ERROR_RETURN;
} }
/* Protect global data. */
__libc_lock_lock (__libc_setlocale_lock);
/* Now process all categories we are interested in. */ /* Now process all categories we are interested in. */
names_len = 0; names_len = 0;
for (cnt = 0; cnt < __LC_LAST; ++cnt) for (cnt = 0; cnt < __LC_LAST; ++cnt)
@ -171,6 +180,9 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
&& result.__locales[cnt]->usage_count != UNDELETABLE) && result.__locales[cnt]->usage_count != UNDELETABLE)
/* We can remove the data. */ /* We can remove the data. */
_nl_remove_locale (cnt, result.__locales[cnt]); _nl_remove_locale (cnt, result.__locales[cnt]);
/* Critical section left. */
__libc_lock_unlock (__libc_setlocale_lock);
return NULL; return NULL;
} }
@ -249,6 +261,9 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
free (base); free (base);
} }
/* Critical section left. */
__libc_lock_unlock (__libc_setlocale_lock);
/* Update the special members. */ /* Update the special members. */
update: update:
{ {