aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-07-09 14:49:13 +0000
committerRoland McGrath <roland@gnu.org>1996-07-09 14:49:13 +0000
commitc150923988933b5db75a974d4cc08cd7f7aaf3dc (patch)
tree93cbfeaafc3d720b353e4012a5a54c69a7fec55d /sysdeps/unix
parent089b2b8ad8bac143a3820e6c9b60f7c505ca8b49 (diff)
downloadglibc-c150923988933b5db75a974d4cc08cd7f7aaf3dc.zip
glibc-c150923988933b5db75a974d4cc08cd7f7aaf3dc.tar.gz
glibc-c150923988933b5db75a974d4cc08cd7f7aaf3dc.tar.bz2
Tue Jul 9 09:37:55 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* sysdeps/mach/libc-lock.h: New file. * sysdeps/unix/readdir.c: Do locking. * sysdeps/unix/seekdir.c: Likewise. * sysdeps/unix/rewinddir.c: Likewise. * sysdeps/unix/closedir.c: Likewise. * sysdeps/unix/bsd/telldir.c: Likewise. * sysdeps/mach/hurd/seekdir.c: Likewise. * sysdeps/mach/hurd/readdir.c: Likewise. * sysdeps/mach/hurd/closedir.c: Likewise. * sysdeps/mach/hurd/opendir.c: Initialize the lock. * sysdeps/unix/opendir.c: Likewise. * sysdeps/mach/hurd/dirstream.h: Include <libc-lock.h>. (struct __dirstream): Add lock member using __libc_lock_define. * sysdeps/unix/dirstream.h: Likewise. * sysdeps/stub/libc-lock.h (__libc_lock_fini): New macro. * stdlib/mbstowcs.c: Pass address of pointer to mbsrtowcs. * stdlib/wcstombs.c: Use wcsrtombs instead of mbsrtowcs. Thu Jul 4 01:34:04 1996 Ulrich Drepper <drepper@cygnus.com> * locale/programs/stringtrans.c: Fix typo in copyright. * stdio-common/printf-prs.c: Add casts to prevent signed<->unsigned warnings. * stdio-common/printf-parse.h: Initialize state variable before calling mbrlen. * stdio-common/printf-prs.c: Don't initialize state variable here. * stdio-common/vfprintf.c: Don't initialize state variable. (vfprintf): While determining length of multibyte string don't try to be clever in determining characters to use for first call. Add real implementation of multibyte<->wide char conversion functions. The functions always convert between the fixed wide char format (ISO 10646 in UCS4) and the UTF8 representation of this character set. Conversion between the currently used 8bit character set and ISO 10646 will not take place. This is what iconv() is for. * wcsmbs/wchar.h (mbstate_t): Define as structure to replace dummy definition. Add optimized version of `mbrlen' function. * wcsmbs/btowc.c (btowc): Restrict range of legal characters to 0...0x7f. * wcsmbs/wctob.c (wctob): Restrict range of legal characters to 0..0x7f. * wcsmbs/mbrlen.c: Make mbrlen a weak alias of __mbrlen. This is needed in the wchar.h header. * wcsmbs/mbrtowc.c: Replace dummy implementation. Convert UTF8 encoded character to UCS4. * wcsmbs/mbsinit.c: Replace dummy implementation. Test COUNT element of `mbstate_t' for initial state. * wcsmbs/mbsrtowcs.c: Replace dummy implementation. Convert UTF8 encoded string to UCS4 string. * wcsmbs/wcrtomb.c: Replace dummy implementation. Convert UCS4 character to UTF8 encoded form. * wcsmbs/wcsrtombs.c: Replace dummy implementation. Convert UCS4 encoded string to UTF8 encoded form.
Diffstat (limited to 'sysdeps/unix')
-rw-r--r--sysdeps/unix/bsd/telldir.c30
-rw-r--r--sysdeps/unix/closedir.c6
-rw-r--r--sysdeps/unix/dirstream.h4
-rw-r--r--sysdeps/unix/opendir.c3
-rw-r--r--sysdeps/unix/readdir.c9
-rw-r--r--sysdeps/unix/rewinddir.c2
-rw-r--r--sysdeps/unix/seekdir.c2
7 files changed, 49 insertions, 7 deletions
diff --git a/sysdeps/unix/bsd/telldir.c b/sysdeps/unix/bsd/telldir.c
index 0658093..4400883 100644
--- a/sysdeps/unix/bsd/telldir.c
+++ b/sysdeps/unix/bsd/telldir.c
@@ -36,6 +36,7 @@ struct record
#define NBUCKETS 32
static struct record *records[32];
static off_t lastpos;
+__libc_lock_define_initialized(static, lock); /* Locks above data. */
/* Return the current position of DIRP. */
@@ -43,6 +44,9 @@ off_t
DEFUN(telldir, (dirp), DIR *dirp)
{
struct record *new;
+ off_t pos;
+
+ __libc_lock_lock (lock);
new = malloc (sizeof *new);
if (new == NULL)
@@ -54,7 +58,11 @@ DEFUN(telldir, (dirp), DIR *dirp)
new->next = records[new->cookie % NBUCKETS];
records[new->cookie % NBUCKETS] = new;
- return new->cookie;
+ pos = new->cookie;
+
+ __libc_lock_unlock (lock);
+
+ return pos;
}
@@ -65,11 +73,14 @@ DEFUN(seekdir, (dirp, pos), DIR *dirp AND __off_t pos)
{
struct record *r, **prevr;
+ __libc_lock_lock (lock);
+
for (prevr = &records[pos % NBUCKETS], r = *prevr;
r != NULL;
prevr = &r->next, r = r->next)
if (r->cookie == pos)
{
+ __libc_lock_lock (dirp->__lock);
if (dirp->filepos != r->pos || dirp->offset != r->offset)
{
dirp->size = 0; /* Must read a fresh buffer. */
@@ -79,16 +90,25 @@ DEFUN(seekdir, (dirp, pos), DIR *dirp AND __off_t pos)
dirp->offset = 0;
/* Read entries until we reach the saved offset. */
while (dirp->offset < r->offset)
- if (readdir (dirp) == NULL)
- break;
+ {
+ struct dirent *scan;
+ __libc_lock_unlock (dirp->__lock);
+ scan = readdir (dirp);
+ __libc_lock_lock (dirp->__lock);
+ if (! scan)
+ break;
+ }
}
+ __libc_lock_unlock (dirp->__lock);
/* To prevent leaking memory, cookies returned from telldir
can only be used once. So free this one's record now. */
*prevr = r->next;
free (r);
- return;
+ break;
}
- /* We lost, but have no way to indicate it. Oh well. */
+ __libc_lock_unlock (lock);
+
+ /* If we lost there is no way to indicate it. Oh well. */
}
diff --git a/sysdeps/unix/closedir.c b/sysdeps/unix/closedir.c
index 791eaad..1d4fd8e 100644
--- a/sysdeps/unix/closedir.c
+++ b/sysdeps/unix/closedir.c
@@ -37,9 +37,13 @@ DEFUN(closedir, (dirp), DIR *dirp)
return -1;
}
- fd = dirp->fd;
+ __libc_lock_lock (dirp->lock);
+ fd = dirp->fd;
free ((PTR) dirp->data);
+
+ __libc_lock_fini (dirp->lock);
+
free ((PTR) dirp);
return __close (fd);
diff --git a/sysdeps/unix/dirstream.h b/sysdeps/unix/dirstream.h
index 87e78b6..3d27967 100644
--- a/sysdeps/unix/dirstream.h
+++ b/sysdeps/unix/dirstream.h
@@ -22,6 +22,8 @@ Cambridge, MA 02139, USA. */
#include <sys/types.h>
+#include <libc-lock.h>
+
/* Directory stream type.
The miscellaneous Unix `readdir' implementations read directory data
@@ -37,6 +39,8 @@ struct __dirstream
size_t offset; /* Current offset into the block. */
off_t filepos; /* Position of next entry to read. */
+
+ __libc_lock_define (, lock); /* Mutex lock for this structure. */
};
#define _DIR_dirfd(dirp) ((dirp)->fd)
diff --git a/sysdeps/unix/opendir.c b/sysdeps/unix/opendir.c
index df20b9c..8dca80b 100644
--- a/sysdeps/unix/opendir.c
+++ b/sysdeps/unix/opendir.c
@@ -90,5 +90,8 @@ opendir (const char *name)
}
dirp->fd = fd;
+
+ __libc_lock_init (dirp->lock);
+
return dirp;
}
diff --git a/sysdeps/unix/readdir.c b/sysdeps/unix/readdir.c
index 00446a2..5d0c40f 100644
--- a/sysdeps/unix/readdir.c
+++ b/sysdeps/unix/readdir.c
@@ -40,6 +40,8 @@ readdir (DIR *dirp)
return NULL;
}
+ __libc_lock_lock (dirp->lock);
+
do
{
size_t reclen;
@@ -62,7 +64,10 @@ readdir (DIR *dirp)
base = dirp->filepos;
bytes = __getdirentries (dirp->fd, dirp->data, maxread, &base);
if (bytes <= 0)
- return NULL;
+ {
+ dp = NULL;
+ break;
+ }
dirp->size = (size_t) bytes;
/* Reset the offset into the buffer. */
@@ -96,5 +101,7 @@ readdir (DIR *dirp)
/* Skip deleted files. */
} while (dp->d_ino == 0);
+ __libc_lock_unlock (dirp->lock);
+
return dp;
}
diff --git a/sysdeps/unix/rewinddir.c b/sysdeps/unix/rewinddir.c
index 791ecc1..3a91b06 100644
--- a/sysdeps/unix/rewinddir.c
+++ b/sysdeps/unix/rewinddir.c
@@ -27,7 +27,9 @@ Cambridge, MA 02139, USA. */
void
DEFUN(rewinddir, (dirp), DIR *dirp)
{
+ __libc_lock_lock (dirp->lock);
(void) lseek(dirp->fd, (off_t) 0, SEEK_SET);
dirp->offset = 0;
dirp->size = 0;
+ __libc_lock_unlock (dirp->lock);
}
diff --git a/sysdeps/unix/seekdir.c b/sysdeps/unix/seekdir.c
index 9ce332b..b1201f6 100644
--- a/sysdeps/unix/seekdir.c
+++ b/sysdeps/unix/seekdir.c
@@ -27,7 +27,9 @@ Cambridge, MA 02139, USA. */
void
DEFUN(seekdir, (dirp, pos), DIR *dirp AND __off_t pos)
{
+ __libc_lock_lock (dirp->lock);
(void) __lseek(dirp->fd, pos, SEEK_SET);
dirp->size = 0;
dirp->offset = 0;
+ __libc_lock_unlock (dirp->lock);
}