From 39e16978c3b4ac8eaf2201fac56316623910d9da Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 29 Aug 1997 01:19:12 +0000 Subject: Update. 1997-08-29 02:36 Ulrich Drepper * Makefile (version-info.h): Use ISO form for the date. * catgets/catgetsinfo.h: Include . (struct catalog_obj): Add lock field. (__open_catalog): Remove second parameter from prototype. * catgets/catgets.c (catopen): Initialize lock field. (catgets): Don't pass second parameter to __open_catalog. * catgets/gencat.c: Initialize lock field and don't pass second parameter to __open_catalog. * catgets/open_catalog.c (__open_catalog): Decide about use of path by examining path in struct, not based on extra argument. Acquire a the lock before trying to load the catalog and release it before returning. * csu/Makefile (abi-tag.h): Make sure target directory exists. * io/Makefile (headers): Add bits/poll.h. * io/sys/poll.h: Remove definitions of POLL* constants. Include . * sysdeps/generic/bits/poll.h: New file. * sysdeps/unix/sysv/linux/bits/poll.h: New file. * sysdeps/unix/sysv/linux/m68k/bits/poll.h: New file. * sysdeps/unix/sysv/linux/mips/bits/poll.h: New file. * sysdeps/unix/sysv/linux/sparc/bits/poll.h: New file. * libio/fileops.c (_IO_file_read, _IO_file_write): Remove dead code. * malloc/obstack.c: Add casts to keep very verbose compilers on 64bit machine quiet. * nss/Makefile (libnss_db.so): Find libdb.so in db2 directory. 1997-08-28 17:30 Ulrich Drepper * catgets/catgets.c (catopen): Correctly determine length of string in NLSPATH evironment variable. Patch by HJ Lu . 1997-08-27 23:19 Richard Henderson * sysdeps/generic/dl-sysdep.c (DL_FIND_ARG_COMPONENTS): Provide default macro to track down arguments from stack start. (_dl_sysdep_start): Use it. * sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c: Truncate to simply providing a special DL_FIND_ARG_COMPONENTS and including the next file up the line. * sysdeps/powerpc/e_sqrt.c: Move contents to w_sqrt.c and provide stub. * sysdeps/powerpc/e_sqrtf.c: Likewise. * sysdeps/powerpc/s_copysignf.S: Provide empty file; symbol is with the double precision version. * sysdeps/powerpc/s_fabsf.S: Likewise. * sysdeps/powerpc/s_isnanf.S: Likewise. --- catgets/catgets.c | 6 ++++-- catgets/catgetsinfo.h | 7 +++++-- catgets/gencat.c | 4 +++- catgets/open_catalog.c | 28 ++++++++++++++++++++-------- 4 files changed, 32 insertions(+), 13 deletions(-) (limited to 'catgets') diff --git a/catgets/catgets.c b/catgets/catgets.c index 4c6997e..d5eefc9 100644 --- a/catgets/catgets.c +++ b/catgets/catgets.c @@ -87,7 +87,7 @@ catopen (const char *cat_name, int flag) if (nlspath != NULL && *nlspath != '\0') { /* Append the system dependent directory. */ - size_t len = strlen (nlspath + 1 + sizeof NLSPATH); + size_t len = strlen (nlspath) + 1 + sizeof NLSPATH; char *tmp = alloca (len); __stpcpy (__stpcpy (__stpcpy (tmp, nlspath), ":"), NLSPATH); @@ -111,6 +111,8 @@ catopen (const char *cat_name, int flag) result->nlspath = NULL; } + __libc_lock_init (result->lock); + return (nl_catd) result; } @@ -130,7 +132,7 @@ catgets (nl_catd catalog_desc, int set, int message, const char *string) catalog = (__nl_catd) catalog_desc; if (catalog->status == closed) - __open_catalog (catalog, 1); + __open_catalog (catalog); if (catalog->status == nonexisting) { diff --git a/catgets/catgetsinfo.h b/catgets/catgetsinfo.h index 292572d..edb1099 100644 --- a/catgets/catgetsinfo.h +++ b/catgets/catgetsinfo.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper, . @@ -18,6 +18,7 @@ Boston, MA 02111-1307, USA. */ #include +#include struct catalog_obj @@ -47,6 +48,8 @@ typedef struct catalog_info struct catalog_obj *file_ptr; size_t file_size; + + __libc_lock_define (,lock); } *__nl_catd; @@ -56,4 +59,4 @@ typedef struct catalog_info /* Prototypes for helper functions. */ -void __open_catalog (__nl_catd __catalog, int __with_path); +void __open_catalog (__nl_catd __catalog); diff --git a/catgets/gencat.c b/catgets/gencat.c index 9ce962c..8d310d8 100644 --- a/catgets/gencat.c +++ b/catgets/gencat.c @@ -988,9 +988,11 @@ read_old (struct catalog *catalog, const char *file_name) old_cat_obj.status = closed; old_cat_obj.cat_name = file_name; + old_cat_obj.nlspath = NULL; + __libc_lock_init (old_cat_obj.lock); /* Try to open catalog, but don't look through the NLSPATH. */ - __open_catalog (&old_cat_obj, 0); + __open_catalog (&old_cat_obj); if (old_cat_obj.status != mmapped && old_cat_obj.status != malloced) if (errno == ENOENT) diff --git a/catgets/open_catalog.c b/catgets/open_catalog.c index 2c1cbb4..62fb111 100644 --- a/catgets/open_catalog.c +++ b/catgets/open_catalog.c @@ -33,14 +33,22 @@ void -__open_catalog (__nl_catd catalog, int with_path) +__open_catalog (__nl_catd catalog) { int fd; struct stat st; int swapping; - if (strchr (catalog->cat_name, '/') != NULL || !with_path) - fd = open (catalog->cat_name, O_RDONLY); + /* Make sure we are alone. */ + __libc_lock_lock (catalog->lock); + + /* Check whether there was no other thread faster. */ + if (catalog->status != closed) + /* While we waited some other thread tried to open the catalog. */ + goto unlock_return; + + if (strchr (catalog->cat_name, '/') != NULL || catalog->nlspath == NULL) + fd = __open (catalog->cat_name, O_RDONLY); else { const char *run_nlspath = catalog->nlspath; @@ -164,7 +172,7 @@ __open_catalog (__nl_catd catalog, int with_path) if (fd < 0 || __fstat (fd, &st) < 0) { catalog->status = nonexisting; - return; + goto unlock_return; } #ifndef MAP_COPY @@ -195,7 +203,7 @@ __open_catalog (__nl_catd catalog, int with_path) if (catalog->file_ptr == NULL) { catalog->status = nonexisting; - return; + goto unlock_return; } todo = st.st_size; /* Save read, handle partial reads. */ @@ -207,7 +215,7 @@ __open_catalog (__nl_catd catalog, int with_path) { free ((void *) catalog->file_ptr); catalog->status = nonexisting; - return; + goto unlock_return; } todo -= now; } @@ -227,14 +235,14 @@ __open_catalog (__nl_catd catalog, int with_path) swapping = 1; else { - /* Illegal file. Free he resources and mark catalog as not + /* Illegal file. Free the resources and mark catalog as not usable. */ if (catalog->status == mmapped) __munmap ((void *) catalog->file_ptr, catalog->file_size); else free (catalog->file_ptr); catalog->status = nonexisting; - return; + goto unlock_return; } #define SWAP(x) (swapping ? SWAPU32 (x) : (x)) @@ -260,4 +268,8 @@ __open_catalog (__nl_catd catalog, int with_path) catalog->strings = (const char *) &catalog->file_ptr->name_ptr[catalog->plane_size * catalog->plane_depth * 3 * 2]; + + /* Release the lock again. */ + unlock_return: + __libc_lock_unlock (catalog->lock); } -- cgit v1.1