about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--iconv/gconv_db.c18
-rw-r--r--iconv/gconv_int.h6
-rw-r--r--iconv/gconv_simple.c1
-rw-r--r--libio/iofclose.c4
5 files changed, 28 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 66105f207c..f5de14c000 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2004-03-09  Ulrich Drepper  <drepper@redhat.com>
 
+	* iconv/gconv_db.c: Don't define lock as static.  Rename to
+	__gconv_lock and export from the file.
+	* iconv/gconv_int.h: Declare __gconv_lock.
+	* libio/iofclose.c [_LIBC] (_IO_new_fclose): Lock gconv lock
+	before __gconv_release_step calls.
+	Patch by Shunichi Sagawa <s-sagawa@jp.fujitsu.com>.
+
+	* iconv/gconv_simple.c (internal_ucs4_loop): Fix typo in last change.
+
+	* iconv/gconv_db.c
+
 	* posix/Makefile (tests): Add tst-vfork1.
 	* posix/tst-vfork1.c: New file.
 
diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c
index 158e0e186e..a21f8ddb3c 100644
--- a/iconv/gconv_db.c
+++ b/iconv/gconv_db.c
@@ -1,5 +1,5 @@
 /* Provide access to the collection of available transformation modules.
-   Copyright (C) 1997,98,99,2000,2001,2002,2003 Free Software Foundation, Inc.
+   Copyright (C) 1997-2003, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
 
@@ -37,7 +37,7 @@ void *__gconv_alias_db;
 struct gconv_module *__gconv_modules_db;
 
 /* We modify global data.   */
-__libc_lock_define_initialized (static, lock)
+__libc_lock_define_initialized (, __gconv_lock)
 
 
 /* Provide access to module database.  */
@@ -683,20 +683,20 @@ __gconv_find_transform (const char *toset, const char *fromset,
   __libc_once (once, __gconv_read_conf);
 
   /* Acquire the lock.  */
-  __libc_lock_lock (lock);
+  __libc_lock_lock (__gconv_lock);
 
   result = __gconv_lookup_cache (toset, fromset, handle, nsteps, flags);
   if (result != __GCONV_NODB)
     {
       /* We have a cache and could resolve the request, successful or not.  */
-      __libc_lock_unlock (lock);
+      __libc_lock_unlock (__gconv_lock);
       return result;
     }
 
   /* If we don't have a module database return with an error.  */
   if (__gconv_modules_db == NULL)
     {
-      __libc_lock_unlock (lock);
+      __libc_lock_unlock (__gconv_lock);
       return __GCONV_NOCONV;
     }
 
@@ -715,7 +715,7 @@ __gconv_find_transform (const char *toset, const char *fromset,
 		      && strcmp (toset_expand, fromset_expand) == 0)))))
     {
       /* Both character sets are the same.  */
-      __libc_lock_unlock (lock);
+      __libc_lock_unlock (__gconv_lock);
       return __GCONV_NOCONV;
     }
 
@@ -723,7 +723,7 @@ __gconv_find_transform (const char *toset, const char *fromset,
 			    handle, nsteps);
 
   /* Release the lock.  */
-  __libc_lock_unlock (lock);
+  __libc_lock_unlock (__gconv_lock);
 
   /* The following code is necessary since `find_derivation' will return
      GCONV_OK even when no derivation was found but the same request
@@ -743,7 +743,7 @@ __gconv_close_transform (struct __gconv_step *steps, size_t nsteps)
   size_t cnt;
 
   /* Acquire the lock.  */
-  __libc_lock_lock (lock);
+  __libc_lock_lock (__gconv_lock);
 
 #ifndef STATIC_GCONV
   cnt = nsteps;
@@ -757,7 +757,7 @@ __gconv_close_transform (struct __gconv_step *steps, size_t nsteps)
   __gconv_release_cache (steps, nsteps);
 
   /* Release the lock.  */
-  __libc_lock_unlock (lock);
+  __libc_lock_unlock (__gconv_lock);
 
   return result;
 }
diff --git a/iconv/gconv_int.h b/iconv/gconv_int.h
index a5fb728447..782e16a58a 100644
--- a/iconv/gconv_int.h
+++ b/iconv/gconv_int.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 1997-2002, 2003, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
 
@@ -22,6 +22,7 @@
 
 #include "gconv.h"
 #include <stdlib.h>		/* For alloca used in macro below.  */
+#include <bits/libc-lock.h>
 
 __BEGIN_DECLS
 
@@ -124,6 +125,9 @@ extern struct gconv_module *__gconv_modules_db attribute_hidden;
 /* Value of the GCONV_PATH environment variable.  */
 extern const char *__gconv_path_envvar attribute_hidden;
 
+/* Lock for the conversion database content.  */
+__libc_lock_define (extern, __gconv_lock);
+
 
 /* The gconv functions expects the name to be in upper case and complete,
    including the trailing slashes if necessary.  */
diff --git a/iconv/gconv_simple.c b/iconv/gconv_simple.c
index 47f741e235..147068350a 100644
--- a/iconv/gconv_simple.c
+++ b/iconv/gconv_simple.c
@@ -91,7 +91,6 @@ internal_ucs4_loop (struct __gconv_step *step,
 
   for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4)
     *outptr32++ = bswap_32 (*(const uint32_t *) inptr);
-  outptr = 
 
   *inptrp = inptr;
   *outptrp = (unsigned char *) outptr32;
diff --git a/libio/iofclose.c b/libio/iofclose.c
index da0f9febe4..a372ae2b24 100644
--- a/libio/iofclose.c
+++ b/libio/iofclose.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993,1995,1997-2001,2002,2003 Free Software Foundation, Inc.
+/* Copyright (C) 1993,1995,1997-2003,2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -71,8 +71,10 @@ _IO_new_fclose (fp)
 	 the conversion functions.  */
       struct _IO_codecvt *cc = fp->_codecvt;
 
+      __libc_lock_lock (__gconv_lock);
       __gconv_release_step (cc->__cd_in.__cd.__steps);
       __gconv_release_step (cc->__cd_out.__cd.__steps);
+      __libc_lock_unlock (__gconv_lock);
 #endif
     }
   else