diff options
author | Ulrich Drepper <drepper@redhat.com> | 1997-08-29 01:19:12 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1997-08-29 01:19:12 +0000 |
commit | 39e16978c3b4ac8eaf2201fac56316623910d9da (patch) | |
tree | 054fff18119b31464b3133ad91050694130c7d2a /catgets/open_catalog.c | |
parent | 92f1da4da04a7a86ddee91be5eaf0b10c333ac64 (diff) | |
download | glibc-39e16978c3b4ac8eaf2201fac56316623910d9da.tar.gz glibc-39e16978c3b4ac8eaf2201fac56316623910d9da.tar.xz glibc-39e16978c3b4ac8eaf2201fac56316623910d9da.zip |
Update. cvs/libc-ud-970828
1997-08-29 02:36 Ulrich Drepper <drepper@cygnus.com> * Makefile (version-info.h): Use ISO form for the date. * catgets/catgetsinfo.h: Include <bits/libc-lock.h>. (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 <bits/poll.h>. * 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 <drepper@cygnus.com> * catgets/catgets.c (catopen): Correctly determine length of string in NLSPATH evironment variable. Patch by HJ Lu <hjl@gnu.ai.mit.edu>. 1997-08-27 23:19 Richard Henderson <rth@cygnus.com> * 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.
Diffstat (limited to 'catgets/open_catalog.c')
-rw-r--r-- | catgets/open_catalog.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/catgets/open_catalog.c b/catgets/open_catalog.c index 2c1cbb4a4c..62fb111e43 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); } |