summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/stdio.h38
-rw-r--r--lib/libc/gen/getgrent.c5
-rw-r--r--lib/libc/gen/getgrouplist.c4
-rw-r--r--lib/libc/gen/getttyent.c4
-rw-r--r--lib/libc/stdio/asprintf.c4
-rw-r--r--lib/libc/stdio/clrerr.c7
-rw-r--r--lib/libc/stdio/fclose.c6
-rw-r--r--lib/libc/stdio/feof.c10
-rw-r--r--lib/libc/stdio/ferror.c10
-rw-r--r--lib/libc/stdio/fflush.c25
-rw-r--r--lib/libc/stdio/fgetc.c4
-rw-r--r--lib/libc/stdio/fgetln.c21
-rw-r--r--lib/libc/stdio/fgets.c9
-rw-r--r--lib/libc/stdio/fgetwc.c6
-rw-r--r--lib/libc/stdio/fgetws.c8
-rw-r--r--lib/libc/stdio/fileno.c10
-rw-r--r--lib/libc/stdio/findfp.c36
-rw-r--r--lib/libc/stdio/fpurge.c5
-rw-r--r--lib/libc/stdio/fputc.c7
-rw-r--r--lib/libc/stdio/fputs.c8
-rw-r--r--lib/libc/stdio/fputwc.c6
-rw-r--r--lib/libc/stdio/fputws.c8
-rw-r--r--lib/libc/stdio/fread.c5
-rw-r--r--lib/libc/stdio/freopen.c7
-rw-r--r--lib/libc/stdio/fseek.c12
-rw-r--r--lib/libc/stdio/ftell.c11
-rw-r--r--lib/libc/stdio/fvwrite.c8
-rw-r--r--lib/libc/stdio/fwalk.c7
-rw-r--r--lib/libc/stdio/fwide.c6
-rw-r--r--lib/libc/stdio/fwrite.c8
-rw-r--r--lib/libc/stdio/getc.c7
-rw-r--r--lib/libc/stdio/gets.c12
-rw-r--r--lib/libc/stdio/local.h7
-rw-r--r--lib/libc/stdio/putc.c6
-rw-r--r--lib/libc/stdio/puts.c9
-rw-r--r--lib/libc/stdio/putw.c9
-rw-r--r--lib/libc/stdio/refill.c15
-rw-r--r--lib/libc/stdio/setvbuf.c5
-rw-r--r--lib/libc/stdio/snprintf.c4
-rw-r--r--lib/libc/stdio/sprintf.c4
-rw-r--r--lib/libc/stdio/ungetc.c18
-rw-r--r--lib/libc/stdio/ungetwc.c10
-rw-r--r--lib/libc/stdio/vasprintf.c4
-rw-r--r--lib/libc/stdio/vfprintf.c17
-rw-r--r--lib/libc/stdio/vfscanf.c12
-rw-r--r--lib/libc/stdio/vsnprintf.c4
-rw-r--r--lib/libc/stdio/vsprintf.c4
-rw-r--r--lib/libc/stdio/wbuf.c8
-rw-r--r--lib/libpthread/uthread/uthread_file.c253
49 files changed, 289 insertions, 424 deletions
diff --git a/include/stdio.h b/include/stdio.h
index abb4f383a4c..14b65aae5ce 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: stdio.h,v 1.36 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: stdio.h,v 1.37 2009/10/22 01:23:16 guenther Exp $ */
/* $NetBSD: stdio.h,v 1.18 1996/04/25 18:29:21 jtc Exp $ */
/*-
@@ -157,7 +157,6 @@ __END_DECLS
#define __SOFF 0x1000 /* set iff _offset is in fact correct */
#define __SMOD 0x2000 /* true => fgetln modified _p text */
#define __SALC 0x4000 /* allocate string space dynamically */
-#define __SIGN 0x8000 /* ignore this file in _fwalk */
/*
* The following three definitions are for ANSI C, which took them
@@ -323,6 +322,12 @@ char *tempnam(const char *, const char *);
#endif
__END_DECLS
+#ifndef _POSIX_THREADS
+# define flockfile(fp) /* nothing */
+# define ftrylockfile(fp) (0)
+# define funlockfile(fp) /* nothing */
+#endif
+
#endif /* __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE */
/*
@@ -397,37 +402,32 @@ static __inline int __sputc(int _c, FILE *_p) {
#define __sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF)))
#define __sfileno(p) ((p)->_file)
-extern int __isthreaded;
+#define feof(p) __sfeof(p)
+#define ferror(p) __sferror(p)
-#define feof(p) (!__isthreaded ? __sfeof(p) : (feof)(p))
-#define ferror(p) (!__isthreaded ? __sferror(p) : (ferror)(p))
-#define clearerr(p) (!__isthreaded ? __sclearerr(p) : (clearerr)(p))
+#ifndef _POSIX_THREADS
+#define clearerr(p) __sclearerr(p)
+#endif
#if __POSIX_VISIBLE
-#define fileno(p) (!__isthreaded ? __sfileno(p) : (fileno)(p))
+#define fileno(p) __sfileno(p)
#endif
-#define getc(fp) (!__isthreaded ? __sgetc(fp) : (getc)(fp))
-
-#if __BSD_VISIBLE
-/*
- * The macro implementations of putc and putc_unlocked are not
- * fully POSIX compliant; they do not set errno on failure
- */
-#define putc(x, fp) (!__isthreaded ? __sputc(x, fp) : (putc)(x, fp))
-#endif /* __BSD_VISIBLE */
-
#ifndef lint
-#if __POSIX_VISIBLE >= 199506
+#ifndef _POSIX_THREADS
+#define getc(fp) __sgetc(fp)
+#endif /* _POSIX_THREADS */
#define getc_unlocked(fp) __sgetc(fp)
/*
* The macro implementations of putc and putc_unlocked are not
* fully POSIX compliant; they do not set errno on failure
*/
#if __BSD_VISIBLE
+#ifndef _POSIX_THREADS
+#define putc(x, fp) __sputc(x, fp)
+#endif /* _POSIX_THREADS */
#define putc_unlocked(x, fp) __sputc(x, fp)
#endif /* __BSD_VISIBLE */
-#endif /* __POSIX_VISIBLE >= 199506 */
#endif /* lint */
#define getchar() getc(stdin)
diff --git a/lib/libc/gen/getgrent.c b/lib/libc/gen/getgrent.c
index 13ca99b8fc4..341f5158901 100644
--- a/lib/libc/gen/getgrent.c
+++ b/lib/libc/gen/getgrent.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: getgrent.c,v 1.33 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: getgrent.c,v 1.34 2009/10/22 01:23:16 guenther Exp $ */
/*
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
@@ -319,8 +319,7 @@ grscan(int search, gid_t gid, const char *name, struct group *p_gr,
if (!strchr(line, '\n')) {
int ch;
- while ((ch = getc_unlocked(_gr_fp)) != '\n' &&
- ch != EOF)
+ while ((ch = getc(_gr_fp)) != '\n' && ch != EOF)
;
continue;
}
diff --git a/lib/libc/gen/getgrouplist.c b/lib/libc/gen/getgrouplist.c
index 564ca8fb3c1..3f8dda203b4 100644
--- a/lib/libc/gen/getgrouplist.c
+++ b/lib/libc/gen/getgrouplist.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: getgrouplist.c,v 1.19 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: getgrouplist.c,v 1.20 2009/10/22 01:23:16 guenther Exp $ */
/*
* Copyright (c) 2008 Ingo Schwarze <schwarze@usta.de>
* Copyright (c) 1991, 1993
@@ -123,7 +123,7 @@ _read_netid(const char *key, uid_t uid, gid_t *groups, int *ngroups,
*p = '\0';
else { /* Skip lines that are too long. */
int ch;
- while ((ch = getc_unlocked(fp)) != '\n' && ch != EOF)
+ while ((ch = getc(fp)) != '\n' && ch != EOF)
;
continue;
}
diff --git a/lib/libc/gen/getttyent.c b/lib/libc/gen/getttyent.c
index 081b56f6665..f92887da485 100644
--- a/lib/libc/gen/getttyent.c
+++ b/lib/libc/gen/getttyent.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: getttyent.c,v 1.10 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: getttyent.c,v 1.11 2009/10/22 01:23:16 guenther Exp $ */
/*
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
@@ -68,7 +68,7 @@ getttyent(void)
return (NULL);
/* skip lines that are too big */
if (!strchr(p, '\n')) {
- while ((c = getc_unlocked(tf)) != '\n' && c != EOF)
+ while ((c = getc(tf)) != '\n' && c != EOF)
;
continue;
}
diff --git a/lib/libc/stdio/asprintf.c b/lib/libc/stdio/asprintf.c
index b3b037a1fb2..f58cc0041d3 100644
--- a/lib/libc/stdio/asprintf.c
+++ b/lib/libc/stdio/asprintf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: asprintf.c,v 1.16 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: asprintf.c,v 1.17 2009/10/22 01:23:16 guenther Exp $ */
/*
* Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
@@ -40,7 +40,7 @@ asprintf(char **str, const char *fmt, ...)
goto err;
f._bf._size = f._w = 127; /* Leave room for the NUL */
va_start(ap, fmt);
- ret = __vfprintf(&f, fmt, ap);
+ ret = vfprintf(&f, fmt, ap);
va_end(ap);
if (ret == -1)
goto err;
diff --git a/lib/libc/stdio/clrerr.c b/lib/libc/stdio/clrerr.c
index 8286305c5be..be993640d4f 100644
--- a/lib/libc/stdio/clrerr.c
+++ b/lib/libc/stdio/clrerr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: clrerr.c,v 1.7 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: clrerr.c,v 1.8 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -32,13 +32,12 @@
*/
#include <stdio.h>
-#include "local.h"
#undef clearerr
void
clearerr(FILE *fp)
{
- FLOCKFILE(fp);
+ flockfile(fp);
__sclearerr(fp);
- FUNLOCKFILE(fp);
+ funlockfile(fp);
}
diff --git a/lib/libc/stdio/fclose.c b/lib/libc/stdio/fclose.c
index 3d0c7b97dd8..98e9826b82c 100644
--- a/lib/libc/stdio/fclose.c
+++ b/lib/libc/stdio/fclose.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fclose.c,v 1.7 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fclose.c,v 1.8 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -45,7 +45,6 @@ fclose(FILE *fp)
errno = EBADF;
return (EOF);
}
- FLOCKFILE(fp);
WCIO_FREE(fp);
r = fp->_flags & __SWR ? __sflush(fp) : 0;
if (fp->_close != NULL && (*fp->_close)(fp->_cookie) < 0)
@@ -56,8 +55,7 @@ fclose(FILE *fp)
FREEUB(fp);
if (HASLB(fp))
FREELB(fp);
- fp->_r = fp->_w = 0; /* Mess up if reaccessed. */
fp->_flags = 0; /* Release this FILE for reuse. */
- FUNLOCKFILE(fp);
+ fp->_r = fp->_w = 0; /* Mess up if reaccessed. */
return (r);
}
diff --git a/lib/libc/stdio/feof.c b/lib/libc/stdio/feof.c
index d381a29c4f7..67da8536df3 100644
--- a/lib/libc/stdio/feof.c
+++ b/lib/libc/stdio/feof.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: feof.c,v 1.6 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: feof.c,v 1.7 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -32,7 +32,6 @@
*/
#include <stdio.h>
-#include "local.h"
/*
* A subroutine version of the macro feof.
@@ -42,10 +41,5 @@
int
feof(FILE *fp)
{
- int ret;
-
- FLOCKFILE(fp);
- ret = __sfeof(fp);
- FUNLOCKFILE(fp);
- return (ret);
+ return (__sfeof(fp));
}
diff --git a/lib/libc/stdio/ferror.c b/lib/libc/stdio/ferror.c
index 29b08d3642a..0e093410b5c 100644
--- a/lib/libc/stdio/ferror.c
+++ b/lib/libc/stdio/ferror.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ferror.c,v 1.6 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: ferror.c,v 1.7 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -32,7 +32,6 @@
*/
#include <stdio.h>
-#include "local.h"
/*
* A subroutine version of the macro ferror.
@@ -42,10 +41,5 @@
int
ferror(FILE *fp)
{
- int ret;
-
- FLOCKFILE(fp);
- ret = __sferror(fp);
- FUNLOCKFILE(fp);
- return (ret);
+ return (__sferror(fp));
}
diff --git a/lib/libc/stdio/fflush.c b/lib/libc/stdio/fflush.c
index 554f531e7e0..2fe62a16834 100644
--- a/lib/libc/stdio/fflush.c
+++ b/lib/libc/stdio/fflush.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fflush.c,v 1.6 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fflush.c,v 1.7 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -39,18 +39,14 @@
int
fflush(FILE *fp)
{
- int r;
if (fp == NULL)
- return (_fwalk(__sflush_locked));
- FLOCKFILE(fp);
+ return (_fwalk(__sflush));
if ((fp->_flags & (__SWR | __SRW)) == 0) {
errno = EBADF;
- r = EOF;
- } else
- r = __sflush(fp);
- FUNLOCKFILE(fp);
- return (r);
+ return (EOF);
+ }
+ return (__sflush(fp));
}
int
@@ -84,14 +80,3 @@ __sflush(FILE *fp)
}
return (0);
}
-
-int
-__sflush_locked(FILE *fp)
-{
- int r;
-
- FLOCKFILE(fp);
- r = __sflush(fp);
- FUNLOCKFILE(fp);
- return (r);
-}
diff --git a/lib/libc/stdio/fgetc.c b/lib/libc/stdio/fgetc.c
index d5a08a9abf3..200ed439c2c 100644
--- a/lib/libc/stdio/fgetc.c
+++ b/lib/libc/stdio/fgetc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fgetc.c,v 1.6 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fgetc.c,v 1.7 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -36,5 +36,5 @@
int
fgetc(FILE *fp)
{
- return (getc(fp));
+ return (__sgetc(fp));
}
diff --git a/lib/libc/stdio/fgetln.c b/lib/libc/stdio/fgetln.c
index 8723f7982ac..061e5cb4c91 100644
--- a/lib/libc/stdio/fgetln.c
+++ b/lib/libc/stdio/fgetln.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fgetln.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fgetln.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -71,18 +71,19 @@ char *
fgetln(FILE *fp, size_t *lenp)
{
unsigned char *p;
- char *ret;
size_t len;
size_t off;
- FLOCKFILE(fp);
-
/* make sure there is input */
- if (fp->_r <= 0 && __srefill(fp))
- goto error;
+ if (fp->_r <= 0 && __srefill(fp)) {
+ *lenp = 0;
+ return (NULL);
+ }
/* look for a newline in the input */
if ((p = memchr((void *)fp->_p, '\n', fp->_r)) != NULL) {
+ char *ret;
+
/*
* Found one. Flag buffer as modified to keep fseek from
* `optimising' a backward seek, in case the user stomps on
@@ -94,7 +95,6 @@ fgetln(FILE *fp, size_t *lenp)
fp->_flags |= __SMOD;
fp->_r -= len;
fp->_p = p;
- FUNLOCKFILE(fp);
return (ret);
}
@@ -139,15 +139,12 @@ fgetln(FILE *fp, size_t *lenp)
break;
}
*lenp = len;
- ret = (char *)fp->_lb._base;
#ifdef notdef
- ret[len] = '\0';
+ fp->_lb._base[len] = '\0';
#endif
- FUNLOCKFILE(fp);
- return (ret);
+ return ((char *)fp->_lb._base);
error:
*lenp = 0; /* ??? */
- FUNLOCKFILE(fp);
return (NULL); /* ??? */
}
diff --git a/lib/libc/stdio/fgets.c b/lib/libc/stdio/fgets.c
index 66ba159509c..661ec0d3861 100644
--- a/lib/libc/stdio/fgets.c
+++ b/lib/libc/stdio/fgets.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fgets.c,v 1.12 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fgets.c,v 1.13 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -54,7 +54,6 @@ fgets(char *buf, int n, FILE *fp)
return (NULL);
}
- FLOCKFILE(fp);
_SET_ORIENTATION(fp, -1);
s = buf;
n--; /* leave space for NUL */
@@ -65,10 +64,8 @@ fgets(char *buf, int n, FILE *fp)
if (fp->_r <= 0) {
if (__srefill(fp)) {
/* EOF/error: stop with partial or no line */
- if (s == buf) {
- FUNLOCKFILE(fp);
+ if (s == buf)
return (NULL);
- }
break;
}
}
@@ -90,7 +87,6 @@ fgets(char *buf, int n, FILE *fp)
fp->_p = t;
(void)memcpy((void *)s, (void *)p, len);
s[len] = '\0';
- FUNLOCKFILE(fp);
return (buf);
}
fp->_r -= len;
@@ -100,6 +96,5 @@ fgets(char *buf, int n, FILE *fp)
n -= len;
}
*s = '\0';
- FUNLOCKFILE(fp);
return (buf);
}
diff --git a/lib/libc/stdio/fgetwc.c b/lib/libc/stdio/fgetwc.c
index 0ab5cb78200..d42e02b44ba 100644
--- a/lib/libc/stdio/fgetwc.c
+++ b/lib/libc/stdio/fgetwc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fgetwc.c,v 1.2 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fgetwc.c,v 1.3 2009/10/22 01:23:16 guenther Exp $ */
/* $NetBSD: fgetwc.c,v 1.3 2003/03/07 07:11:36 tshiozak Exp $ */
/*-
@@ -82,9 +82,9 @@ fgetwc(FILE *fp)
{
wint_t r;
- FLOCKFILE(fp);
+ flockfile(fp);
r = __fgetwc_unlock(fp);
- FUNLOCKFILE(fp);
+ funlockfile(fp);
return (r);
}
diff --git a/lib/libc/stdio/fgetws.c b/lib/libc/stdio/fgetws.c
index 5716021f430..e58ad07797b 100644
--- a/lib/libc/stdio/fgetws.c
+++ b/lib/libc/stdio/fgetws.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fgetws.c,v 1.3 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fgetws.c,v 1.4 2009/10/22 01:23:16 guenther Exp $ */
/* $NetBSD: fgetws.c,v 1.1 2003/03/07 07:11:37 tshiozak Exp $ */
/*-
@@ -45,7 +45,7 @@ fgetws(ws, n, fp)
wchar_t *wsp;
wint_t wc;
- FLOCKFILE(fp);
+ flockfile(fp);
_SET_ORIENTATION(fp, 1);
if (n <= 0) {
@@ -72,11 +72,11 @@ fgetws(ws, n, fp)
}
*wsp++ = L'\0';
- FUNLOCKFILE(fp);
+ funlockfile(fp);
return (ws);
error:
- FUNLOCKFILE(fp);
+ funlockfile(fp);
return (NULL);
}
diff --git a/lib/libc/stdio/fileno.c b/lib/libc/stdio/fileno.c
index 7237beb84dc..ea5d5dd213f 100644
--- a/lib/libc/stdio/fileno.c
+++ b/lib/libc/stdio/fileno.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fileno.c,v 1.6 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fileno.c,v 1.7 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -32,7 +32,6 @@
*/
#include <stdio.h>
-#include "local.h"
/*
* A subroutine version of the macro fileno.
@@ -42,10 +41,5 @@
int
fileno(FILE *fp)
{
- int ret;
-
- FLOCKFILE(fp);
- ret = __sfileno(fp);
- FUNLOCKFILE(fp);
- return (ret);
+ return (__sfileno(fp));
}
diff --git a/lib/libc/stdio/findfp.c b/lib/libc/stdio/findfp.c
index f3e000c3591..2be93a56c74 100644
--- a/lib/libc/stdio/findfp.c
+++ b/lib/libc/stdio/findfp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: findfp.c,v 1.10 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: findfp.c,v 1.11 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -39,7 +39,6 @@
#include <string.h>
#include "local.h"
#include "glue.h"
-#include "thread_private.h"
int __sdidinit;
@@ -55,8 +54,6 @@ int __sdidinit;
static FILE usual[FOPEN_MAX - 3];
static struct __sfileext usualext[FOPEN_MAX - 3];
static struct glue uglue = { 0, FOPEN_MAX - 3, usual };
-static struct glue *lastglue = &uglue;
-_THREAD_PRIVATE_MUTEX(__sfp_mutex);
struct __sfileext __sFext[3];
FILE __sF[3] = {
@@ -107,25 +104,16 @@ __sfp(void)
if (!__sdidinit)
__sinit();
-
- _THREAD_PRIVATE_MUTEX_LOCK(__sfp_mutex);
- for (g = &__sglue; g != NULL; g = g->next) {
+ for (g = &__sglue;; g = g->next) {
for (fp = g->iobs, n = g->niobs; --n >= 0; fp++)
if (fp->_flags == 0)
goto found;
+ if (g->next == NULL && (g->next = moreglue(NDYNAMIC)) == NULL)
+ break;
}
-
- /* release lock while mallocing */
- _THREAD_PRIVATE_MUTEX_UNLOCK(__sfp_mutex);
- if ((g = moreglue(NDYNAMIC)) == NULL)
- return (NULL);
- _THREAD_PRIVATE_MUTEX_LOCK(__sfp_mutex);
- lastglue->next = g;
- lastglue = g;
- fp = g->iobs;
+ return (NULL);
found:
fp->_flags = 1; /* reserve this slot; caller sets real flags */
- _THREAD_PRIVATE_MUTEX_UNLOCK(__sfp_mutex);
fp->_p = NULL; /* no current pointer */
fp->_w = 0; /* nothing to read or write */
fp->_r = 0;
@@ -155,12 +143,8 @@ f_prealloc(void)
n = getdtablesize() - FOPEN_MAX + 20; /* 20 for slop. */
for (g = &__sglue; (n -= g->niobs) > 0 && g->next; g = g->next)
/* void */;
- if (n > 0 && ((g = moreglue(n)) != NULL)) {
- _THREAD_PRIVATE_MUTEX_LOCK(__sfp_mutex);
- lastglue->next = g;
- lastglue = g;
- _THREAD_PRIVATE_MUTEX_UNLOCK(__sfp_mutex);
- }
+ if (n > 0)
+ g->next = moreglue(n);
}
/*
@@ -184,18 +168,12 @@ _cleanup(void)
void
__sinit(void)
{
- _THREAD_PRIVATE_MUTEX(__sinit_mutex);
int i;
- _THREAD_PRIVATE_MUTEX_LOCK(__sinit_mutex);
- if (__sdidinit)
- goto out; /* bail out if caller lost the race */
for (i = 0; i < FOPEN_MAX - 3; i++) {
_FILEEXT_SETUP(usual+i, usualext+i);
}
/* make sure we clean up on exit */
__atexit_register_cleanup(_cleanup); /* conservative */
__sdidinit = 1;
-out:
- _THREAD_PRIVATE_MUTEX_UNLOCK(__sinit_mutex);
}
diff --git a/lib/libc/stdio/fpurge.c b/lib/libc/stdio/fpurge.c
index 4a0988e8479..8fa541dd1c7 100644
--- a/lib/libc/stdio/fpurge.c
+++ b/lib/libc/stdio/fpurge.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fpurge.c,v 1.7 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fpurge.c,v 1.8 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -43,9 +43,7 @@
int
fpurge(FILE *fp)
{
- FLOCKFILE(fp);
if (!fp->_flags) {
- FUNLOCKFILE(fp);
errno = EBADF;
return(EOF);
}
@@ -56,6 +54,5 @@ fpurge(FILE *fp)
fp->_p = fp->_bf._base;
fp->_r = 0;
fp->_w = fp->_flags & (__SLBF|__SNBF) ? 0 : fp->_bf._size;
- FUNLOCKFILE(fp);
return (0);
}
diff --git a/lib/libc/stdio/fputc.c b/lib/libc/stdio/fputc.c
index 275e0398411..0c95ed9a14f 100644
--- a/lib/libc/stdio/fputc.c
+++ b/lib/libc/stdio/fputc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fputc.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fputc.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -33,9 +33,14 @@
#include <stdio.h>
#include <errno.h>
+#include "local.h"
int
fputc(int c, FILE *fp)
{
+ if (cantwrite(fp)) {
+ errno = EBADF;
+ return (EOF);
+ }
return (putc(c, fp));
}
diff --git a/lib/libc/stdio/fputs.c b/lib/libc/stdio/fputs.c
index 4a861fa66b9..1ec32d85b41 100644
--- a/lib/libc/stdio/fputs.c
+++ b/lib/libc/stdio/fputs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fputs.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fputs.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -44,15 +44,11 @@ fputs(const char *s, FILE *fp)
{
struct __suio uio;
struct __siov iov;
- int ret;
iov.iov_base = (void *)s;
iov.iov_len = uio.uio_resid = strlen(s);
uio.uio_iov = &iov;
uio.uio_iovcnt = 1;
- FLOCKFILE(fp);
_SET_ORIENTATION(fp, -1);
- ret = __sfvwrite(fp, &uio);
- FUNLOCKFILE(fp);
- return (ret);
+ return (__sfvwrite(fp, &uio));
}
diff --git a/lib/libc/stdio/fputwc.c b/lib/libc/stdio/fputwc.c
index 4d399730440..d3871241660 100644
--- a/lib/libc/stdio/fputwc.c
+++ b/lib/libc/stdio/fputwc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fputwc.c,v 1.2 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fputwc.c,v 1.3 2009/10/22 01:23:16 guenther Exp $ */
/* $NetBSD: fputwc.c,v 1.3 2003/03/07 07:11:37 tshiozak Exp $ */
/*-
@@ -80,9 +80,9 @@ fputwc(wchar_t wc, FILE *fp)
{
wint_t r;
- FLOCKFILE(fp);
+ flockfile(fp);
r = __fputwc_unlock(wc, fp);
- FUNLOCKFILE(fp);
+ funlockfile(fp);
return (r);
}
diff --git a/lib/libc/stdio/fputws.c b/lib/libc/stdio/fputws.c
index d2163affc36..b1ab6dcd60a 100644
--- a/lib/libc/stdio/fputws.c
+++ b/lib/libc/stdio/fputws.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fputws.c,v 1.3 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fputws.c,v 1.4 2009/10/22 01:23:16 guenther Exp $ */
/* $NetBSD: fputws.c,v 1.1 2003/03/07 07:11:37 tshiozak Exp $ */
/*-
@@ -40,17 +40,17 @@ fputws(ws, fp)
const wchar_t * __restrict ws;
FILE * __restrict fp;
{
- FLOCKFILE(fp);
+ flockfile(fp);
_SET_ORIENTATION(fp, 1);
while (*ws != '\0') {
if (__fputwc_unlock(*ws++, fp) == WEOF) {
- FUNLOCKFILE(fp);
+ funlockfile(fp);
return (-1);
}
}
- FUNLOCKFILE(fp);
+ funlockfile(fp);
return (0);
}
diff --git a/lib/libc/stdio/fread.c b/lib/libc/stdio/fread.c
index 572be07160f..99185385b0d 100644
--- a/lib/libc/stdio/fread.c
+++ b/lib/libc/stdio/fread.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fread.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fread.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -48,7 +48,6 @@ fread(void *buf, size_t size, size_t count, FILE *fp)
*/
if ((resid = count * size) == 0)
return (0);
- FLOCKFILE(fp);
if (fp->_r < 0)
fp->_r = 0;
total = resid;
@@ -61,13 +60,11 @@ fread(void *buf, size_t size, size_t count, FILE *fp)
resid -= r;
if (__srefill(fp)) {
/* no more input: return partial result */
- FUNLOCKFILE(fp);
return ((total - resid) / size);
}
}
(void)memcpy((void *)p, (void *)fp->_p, resid);
fp->_r -= resid;
fp->_p += resid;
- FUNLOCKFILE(fp);
return (count);
}
diff --git a/lib/libc/stdio/freopen.c b/lib/libc/stdio/freopen.c
index b5dbc3096d4..7b4b480619d 100644
--- a/lib/libc/stdio/freopen.c
+++ b/lib/libc/stdio/freopen.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: freopen.c,v 1.11 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: freopen.c,v 1.12 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -60,8 +60,6 @@ freopen(const char *file, const char *mode, FILE *fp)
if (!__sdidinit)
__sinit();
- FLOCKFILE(fp);
-
/*
* There are actually programs that depend on being able to "freopen"
* descriptors that weren't originally open. Keep this from breaking.
@@ -123,7 +121,6 @@ freopen(const char *file, const char *mode, FILE *fp)
if (f < 0) { /* did not get it after all */
fp->_flags = 0; /* set it free */
- FUNLOCKFILE(fp);
errno = sverrno; /* restore in case _close clobbered */
return (NULL);
}
@@ -143,7 +140,6 @@ freopen(const char *file, const char *mode, FILE *fp)
/* _file is only a short */
if (f > SHRT_MAX) {
fp->_flags = 0; /* set it free */
- FUNLOCKFILE(fp);
errno = EMFILE;
return (NULL);
}
@@ -166,6 +162,5 @@ freopen(const char *file, const char *mode, FILE *fp)
*/
if (oflags & O_APPEND)
(void) __sseek((void *)fp, (fpos_t)0, SEEK_END);
- FUNLOCKFILE(fp);
return (fp);
}
diff --git a/lib/libc/stdio/fseek.c b/lib/libc/stdio/fseek.c
index 525c095f895..98e95750879 100644
--- a/lib/libc/stdio/fseek.c
+++ b/lib/libc/stdio/fseek.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fseek.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fseek.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -70,7 +70,6 @@ fseeko(FILE *fp, off_t offset, int whence)
* Change any SEEK_CUR to SEEK_SET, and check `whence' argument.
* After this, whence is either SEEK_SET or SEEK_END.
*/
- FLOCKFILE(fp);
switch (whence) {
case SEEK_CUR:
@@ -84,10 +83,8 @@ fseeko(FILE *fp, off_t offset, int whence)
curoff = fp->_offset;
else {
curoff = (*seekfn)(fp->_cookie, (fpos_t)0, SEEK_CUR);
- if (curoff == (fpos_t)-1) {
- FUNLOCKFILE(fp);
+ if (curoff == (fpos_t)-1)
return (EOF);
- }
}
if (fp->_flags & __SRD) {
curoff -= fp->_r;
@@ -108,7 +105,6 @@ fseeko(FILE *fp, off_t offset, int whence)
break;
default:
- FUNLOCKFILE(fp);
errno = EINVAL;
return (EOF);
}
@@ -193,7 +189,6 @@ fseeko(FILE *fp, off_t offset, int whence)
if (HASUB(fp))
FREEUB(fp);
fp->_flags &= ~__SEOF;
- FUNLOCKFILE(fp);
return (0);
}
@@ -220,7 +215,6 @@ fseeko(FILE *fp, off_t offset, int whence)
fp->_p += n;
fp->_r -= n;
}
- FUNLOCKFILE(fp);
return (0);
/*
@@ -230,7 +224,6 @@ fseeko(FILE *fp, off_t offset, int whence)
dumb:
if (__sflush(fp) ||
(*seekfn)(fp->_cookie, (fpos_t)offset, whence) == POS_ERR) {
- FUNLOCKFILE(fp);
return (EOF);
}
/* success: clear EOF indicator and discard ungetc() data */
@@ -240,7 +233,6 @@ dumb:
fp->_r = 0;
/* fp->_w = 0; */ /* unnecessary (I think...) */
fp->_flags &= ~__SEOF;
- FUNLOCKFILE(fp);
return (0);
}
diff --git a/lib/libc/stdio/ftell.c b/lib/libc/stdio/ftell.c
index 9d4d54628ac..3def3bfb6bc 100644
--- a/lib/libc/stdio/ftell.c
+++ b/lib/libc/stdio/ftell.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ftell.c,v 1.7 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: ftell.c,v 1.8 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -45,22 +45,20 @@ ftello(FILE *fp)
if (fp->_seek == NULL) {
errno = ESPIPE; /* historic practice */
- pos = -1;
- goto out;
+ return ((off_t)-1);
}
/*
* Find offset of underlying I/O object, then
* adjust for buffered bytes.
*/
- FLOCKFILE(fp);
__sflush(fp); /* may adjust seek offset on append stream */
if (fp->_flags & __SOFF)
pos = fp->_offset;
else {
pos = (*fp->_seek)(fp->_cookie, (fpos_t)0, SEEK_CUR);
- if (pos == -1)
- goto out;
+ if (pos == -1L)
+ return (pos);
}
if (fp->_flags & __SRD) {
/*
@@ -79,7 +77,6 @@ ftello(FILE *fp)
*/
pos += fp->_p - fp->_bf._base;
}
-out: FUNLOCKFILE(fp);
return (pos);
}
diff --git a/lib/libc/stdio/fvwrite.c b/lib/libc/stdio/fvwrite.c
index d16db977329..9e916afddf5 100644
--- a/lib/libc/stdio/fvwrite.c
+++ b/lib/libc/stdio/fvwrite.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fvwrite.c,v 1.15 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fvwrite.c,v 1.16 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -134,7 +134,7 @@ __sfvwrite(FILE *fp, struct __suio *uio)
COPY(w);
/* fp->_w -= w; */ /* unneeded */
fp->_p += w;
- if (__sflush(fp))
+ if (fflush(fp))
goto err;
} else if (len >= (w = fp->_bf._size)) {
/* write directly */
@@ -174,7 +174,7 @@ __sfvwrite(FILE *fp, struct __suio *uio)
COPY(w);
/* fp->_w -= w; */
fp->_p += w;
- if (__sflush(fp))
+ if (fflush(fp))
goto err;
} else if (s >= (w = fp->_bf._size)) {
w = (*fp->_write)(fp->_cookie, p, w);
@@ -188,7 +188,7 @@ __sfvwrite(FILE *fp, struct __suio *uio)
}
if ((nldist -= w) == 0) {
/* copied the newline: flush and forget */
- if (__sflush(fp))
+ if (fflush(fp))
goto err;
nlknown = 0;
}
diff --git a/lib/libc/stdio/fwalk.c b/lib/libc/stdio/fwalk.c
index 0f1c1b6e32f..9c6ec873282 100644
--- a/lib/libc/stdio/fwalk.c
+++ b/lib/libc/stdio/fwalk.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fwalk.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fwalk.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -45,9 +45,8 @@ _fwalk(int (*function)(FILE *))
ret = 0;
for (g = &__sglue; g != NULL; g = g->next)
- for (fp = g->iobs, n = g->niobs; --n >= 0; fp++) {
- if ((fp->_flags != 0) && ((fp->_flags & __SIGN) == 0))
+ for (fp = g->iobs, n = g->niobs; --n >= 0; fp++)
+ if (fp->_flags != 0)
ret |= (*function)(fp);
- }
return (ret);
}
diff --git a/lib/libc/stdio/fwide.c b/lib/libc/stdio/fwide.c
index b15a14f2375..974374254b8 100644
--- a/lib/libc/stdio/fwide.c
+++ b/lib/libc/stdio/fwide.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fwide.c,v 1.2 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fwide.c,v 1.3 2009/10/22 01:23:16 guenther Exp $ */
/* $NetBSD: fwide.c,v 1.2 2003/01/18 11:29:54 thorpej Exp $ */
/*-
@@ -49,7 +49,7 @@ fwide(FILE *fp, int mode)
else if (mode < 0)
mode = -1;
- FLOCKFILE(fp);
+ flockfile(fp);
wcio = WCIO_GET(fp);
if (!wcio)
return 0; /* XXX */
@@ -58,7 +58,7 @@ fwide(FILE *fp, int mode)
wcio->wcio_mode = mode;
else
mode = wcio->wcio_mode;
- FUNLOCKFILE(fp);
+ funlockfile(fp);
return mode;
}
diff --git a/lib/libc/stdio/fwrite.c b/lib/libc/stdio/fwrite.c
index 8e7ae01e096..9308e4d66a7 100644
--- a/lib/libc/stdio/fwrite.c
+++ b/lib/libc/stdio/fwrite.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fwrite.c,v 1.7 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: fwrite.c,v 1.8 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -45,7 +45,6 @@ fwrite(const void *buf, size_t size, size_t count, FILE *fp)
size_t n;
struct __suio uio;
struct __siov iov;
- int ret;
/*
* ANSI and SUSv2 require a return value of 0 if size or count are 0.
@@ -63,10 +62,7 @@ fwrite(const void *buf, size_t size, size_t count, FILE *fp)
* skip the divide if this happens, since divides are
* generally slow and since this occurs whenever size==0.
*/
- FLOCKFILE(fp);
- ret = __sfvwrite(fp, &uio);
- FUNLOCKFILE(fp);
- if (ret == 0)
+ if (__sfvwrite(fp, &uio) == 0)
return (count);
return ((n - uio.uio_resid) / size);
}
diff --git a/lib/libc/stdio/getc.c b/lib/libc/stdio/getc.c
index 8a1f8c9e510..b77696c3d87 100644
--- a/lib/libc/stdio/getc.c
+++ b/lib/libc/stdio/getc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: getc.c,v 1.7 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: getc.c,v 1.8 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -32,7 +32,6 @@
*/
#include <stdio.h>
-#include "local.h"
/*
* A subroutine version of the macro getc_unlocked.
@@ -55,8 +54,8 @@ getc(FILE *fp)
{
int c;
- FLOCKFILE(fp);
+ flockfile(fp);
c = __sgetc(fp);
- FUNLOCKFILE(fp);
+ funlockfile(fp);
return (c);
}
diff --git a/lib/libc/stdio/gets.c b/lib/libc/stdio/gets.c
index 30cd712e035..c3666d88492 100644
--- a/lib/libc/stdio/gets.c
+++ b/lib/libc/stdio/gets.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: gets.c,v 1.10 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: gets.c,v 1.11 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -32,7 +32,6 @@
*/
#include <stdio.h>
-#include "local.h"
__warn_references(gets,
"warning: gets() is very unsafe; consider using fgets()");
@@ -43,17 +42,14 @@ gets(char *buf)
int c;
char *s;
- FLOCKFILE(stdin);
- for (s = buf; (c = getchar_unlocked()) != '\n';)
+ for (s = buf; (c = getchar()) != '\n';)
if (c == EOF)
- if (s == buf) {
- FUNLOCKFILE(stdin);
+ if (s == buf)
return (NULL);
- } else
+ else
break;
else
*s++ = c;
*s = '\0';
- FUNLOCKFILE(stdin);
return (buf);
}
diff --git a/lib/libc/stdio/local.h b/lib/libc/stdio/local.h
index 5c5e878841f..68babbd4f0c 100644
--- a/lib/libc/stdio/local.h
+++ b/lib/libc/stdio/local.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: local.h,v 1.13 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: local.h,v 1.14 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
@@ -42,7 +42,6 @@
#include "fileext.h"
int __sflush(FILE *);
-int __sflush_locked(FILE *);
FILE *__sfp(void);
int __srefill(FILE *);
int __sread(void *, char *, int);
@@ -57,7 +56,6 @@ int _fwalk(int (*)(FILE *));
int __swsetup(FILE *);
int __sflags(const char *, int *);
wint_t __fgetwc_unlock(FILE *);
-int __vfprintf(FILE *, const char *, __va_list);
extern void __atexit_register_cleanup(void (*)(void));
extern int __sdidinit;
@@ -88,6 +86,3 @@ extern int __sdidinit;
free((char *)(fp)->_lb._base); \
(fp)->_lb._base = NULL; \
}
-
-#define FLOCKFILE(fp) do { if (__isthreaded) flockfile(fp); } while (0)
-#define FUNLOCKFILE(fp) do { if (__isthreaded) funlockfile(fp); } while (0)
diff --git a/lib/libc/stdio/putc.c b/lib/libc/stdio/putc.c
index 571c7a70538..9426916024e 100644
--- a/lib/libc/stdio/putc.c
+++ b/lib/libc/stdio/putc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: putc.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: putc.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -60,8 +60,8 @@ putc(int c, FILE *fp)
{
int ret;
- FLOCKFILE(fp);
+ flockfile(fp);
ret = putc_unlocked(c, fp);
- FUNLOCKFILE(fp);
+ funlockfile(fp);
return (ret);
}
diff --git a/lib/libc/stdio/puts.c b/lib/libc/stdio/puts.c
index a3957b3b234..c932a83ce1b 100644
--- a/lib/libc/stdio/puts.c
+++ b/lib/libc/stdio/puts.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: puts.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: puts.c,v 1.9 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -33,7 +33,6 @@
#include <stdio.h>
#include <string.h>
-#include "local.h"
#include "fvwrite.h"
/*
@@ -45,7 +44,6 @@ puts(const char *s)
size_t c = strlen(s);
struct __suio uio;
struct __siov iov[2];
- int ret;
iov[0].iov_base = (void *)s;
iov[0].iov_len = c;
@@ -54,8 +52,5 @@ puts(const char *s)
uio.uio_resid = c + 1;
uio.uio_iov = &iov[0];
uio.uio_iovcnt = 2;
- FLOCKFILE(stdout);
- ret = __sfvwrite(stdout, &uio);
- FUNLOCKFILE(stdout);
- return (ret ? EOF : '\n');
+ return (__sfvwrite(stdout, &uio) ? EOF : '\n');
}
diff --git a/lib/libc/stdio/putw.c b/lib/libc/stdio/putw.c
index b47d87cb21f..af5d335ceb1 100644
--- a/lib/libc/stdio/putw.c
+++ b/lib/libc/stdio/putw.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: putw.c,v 1.7 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: putw.c,v 1.8 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -32,7 +32,6 @@
*/
#include <stdio.h>
-#include "local.h"
#include "fvwrite.h"
int
@@ -40,14 +39,10 @@ putw(int w, FILE *fp)
{
struct __suio uio;
struct __siov iov;
- int ret;
iov.iov_base = &w;
iov.iov_len = uio.uio_resid = sizeof(w);
uio.uio_iov = &iov;
uio.uio_iovcnt = 1;
- FLOCKFILE(fp);
- ret = __sfvwrite(fp, &uio);
- FUNLOCKFILE(fp);
- return (ret);
+ return (__sfvwrite(fp, &uio));
}
diff --git a/lib/libc/stdio/refill.c b/lib/libc/stdio/refill.c
index a559ca9b320..8b690b46b25 100644
--- a/lib/libc/stdio/refill.c
+++ b/lib/libc/stdio/refill.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: refill.c,v 1.9 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: refill.c,v 1.10 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -39,8 +39,9 @@
static int
lflush(FILE *fp)
{
+
if ((fp->_flags & (__SLBF|__SWR)) == (__SLBF|__SWR))
- return (__sflush_locked(fp)); /* ignored... */
+ return (__sflush(fp));
return (0);
}
@@ -102,16 +103,8 @@ __srefill(FILE *fp)
* flush all line buffered output files, per the ANSI C
* standard.
*/
- if (fp->_flags & (__SLBF|__SNBF)) {
- /* Ignore this file in _fwalk to avoid potential deadlock. */
- fp->_flags |= __SIGN;
+ if (fp->_flags & (__SLBF|__SNBF))
(void) _fwalk(lflush);
- fp->_flags &= ~__SIGN;
-
- /* Now flush this file without locking it. */
- if ((fp->_flags & (__SLBF|__SWR)) == (__SLBF|__SWR))
- __sflush(fp);
- }
fp->_p = fp->_bf._base;
fp->_r = (*fp->_read)(fp->_cookie, (char *)fp->_p, fp->_bf._size);
fp->_flags &= ~__SMOD; /* buffer contents are again pristine */
diff --git a/lib/libc/stdio/setvbuf.c b/lib/libc/stdio/setvbuf.c
index 21db80dbbdb..e7274465265 100644
--- a/lib/libc/stdio/setvbuf.c
+++ b/lib/libc/stdio/setvbuf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: setvbuf.c,v 1.9 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: setvbuf.c,v 1.10 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -61,7 +61,6 @@ setvbuf(FILE *fp, char *buf, int mode, size_t size)
* malloc()ed. We also clear any eof condition, as if this were
* a seek.
*/
- FLOCKFILE(fp);
ret = 0;
(void)__sflush(fp);
if (HASUB(fp))
@@ -108,7 +107,6 @@ nbf:
fp->_w = 0;
fp->_bf._base = fp->_p = fp->_nbuf;
fp->_bf._size = 1;
- FUNLOCKFILE(fp);
return (ret);
}
flags |= __SMBF;
@@ -147,7 +145,6 @@ nbf:
/* begin/continue reading, or stay in intermediate state */
fp->_w = 0;
}
- FUNLOCKFILE(fp);
__atexit_register_cleanup(_cleanup);
return (ret);
diff --git a/lib/libc/stdio/snprintf.c b/lib/libc/stdio/snprintf.c
index 56f3b612c37..678345894a8 100644
--- a/lib/libc/stdio/snprintf.c
+++ b/lib/libc/stdio/snprintf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: snprintf.c,v 1.15 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: snprintf.c,v 1.16 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -60,7 +60,7 @@ snprintf(char *str, size_t n, const char *fmt, ...)
f._bf._base = f._p = (unsigned char *)str;
f._bf._size = f._w = n - 1;
va_start(ap, fmt);
- ret = __vfprintf(&f, fmt, ap);
+ ret = vfprintf(&f, fmt, ap);
va_end(ap);
*f._p = '\0';
return (ret);
diff --git a/lib/libc/stdio/sprintf.c b/lib/libc/stdio/sprintf.c
index c26d0e3930e..4e9cd37a7c5 100644
--- a/lib/libc/stdio/sprintf.c
+++ b/lib/libc/stdio/sprintf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sprintf.c,v 1.14 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: sprintf.c,v 1.15 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -56,7 +56,7 @@ sprintf(char *str, const char *fmt, ...)
f._bf._base = f._p = (unsigned char *)str;
f._bf._size = f._w = INT_MAX;
va_start(ap, fmt);
- ret = __vfprintf(&f, fmt, ap);
+ ret = vfprintf(&f, fmt, ap);
va_end(ap);
*f._p = '\0';
return (ret);
diff --git a/lib/libc/stdio/ungetc.c b/lib/libc/stdio/ungetc.c
index 9c4296df053..85e0895f7b5 100644
--- a/lib/libc/stdio/ungetc.c
+++ b/lib/libc/stdio/ungetc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ungetc.c,v 1.10 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: ungetc.c,v 1.11 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -82,20 +82,17 @@ ungetc(int c, FILE *fp)
return (EOF);
if (!__sdidinit)
__sinit();
- FLOCKFILE(fp);
_SET_ORIENTATION(fp, -1);
if ((fp->_flags & __SRD) == 0) {
/*
* Not already reading: no good unless reading-and-writing.
* Otherwise, flush any current write stuff.
*/
- if ((fp->_flags & __SRW) == 0) {
-error: FUNLOCKFILE(fp);
+ if ((fp->_flags & __SRW) == 0)
return (EOF);
- }
if (fp->_flags & __SWR) {
if (__sflush(fp))
- goto error;
+ return (EOF);
fp->_flags &= ~__SWR;
fp->_w = 0;
fp->_lbfsize = 0;
@@ -110,10 +107,9 @@ error: FUNLOCKFILE(fp);
*/
if (HASUB(fp)) {
if (fp->_r >= _UB(fp)._size && __submore(fp))
- goto error;
+ return (EOF);
*--fp->_p = c;
-inc_ret: fp->_r++;
- FUNLOCKFILE(fp);
+ fp->_r++;
return (c);
}
fp->_flags &= ~__SEOF;
@@ -126,7 +122,8 @@ inc_ret: fp->_r++;
if (fp->_bf._base != NULL && fp->_p > fp->_bf._base &&
fp->_p[-1] == c) {
fp->_p--;
- goto inc_ret;
+ fp->_r++;
+ return (c);
}
/*
@@ -140,6 +137,5 @@ inc_ret: fp->_r++;
fp->_ubuf[sizeof(fp->_ubuf) - 1] = c;
fp->_p = &fp->_ubuf[sizeof(fp->_ubuf) - 1];
fp->_r = 1;
- FUNLOCKFILE(fp);
return (c);
}
diff --git a/lib/libc/stdio/ungetwc.c b/lib/libc/stdio/ungetwc.c
index 20d953e79e8..06f78c07a60 100644
--- a/lib/libc/stdio/ungetwc.c
+++ b/lib/libc/stdio/ungetwc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ungetwc.c,v 1.2 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: ungetwc.c,v 1.3 2009/10/22 01:23:16 guenther Exp $ */
/* $NetBSD: ungetwc.c,v 1.2 2003/01/18 11:29:59 thorpej Exp $ */
/*-
@@ -42,7 +42,7 @@ ungetwc(wint_t wc, FILE *fp)
if (wc == WEOF)
return WEOF;
- FLOCKFILE(fp);
+ flockfile(fp);
_SET_ORIENTATION(fp, 1);
/*
* XXX since we have no way to transform a wchar string to
@@ -52,19 +52,19 @@ ungetwc(wint_t wc, FILE *fp)
wcio = WCIO_GET(fp);
if (wcio == 0) {
- FUNLOCKFILE(fp);
+ funlockfile(fp);
errno = ENOMEM; /* XXX */
return WEOF;
}
if (wcio->wcio_ungetwc_inbuf >= WCIO_UNGETWC_BUFSIZE) {
- FUNLOCKFILE(fp);
+ funlockfile(fp);
return WEOF;
}
wcio->wcio_ungetwc_buf[wcio->wcio_ungetwc_inbuf++] = wc;
__sclearerr(fp);
- FUNLOCKFILE(fp);
+ funlockfile(fp);
return wc;
}
diff --git a/lib/libc/stdio/vasprintf.c b/lib/libc/stdio/vasprintf.c
index 65c15c038f2..073562cd31a 100644
--- a/lib/libc/stdio/vasprintf.c
+++ b/lib/libc/stdio/vasprintf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vasprintf.c,v 1.14 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: vasprintf.c,v 1.15 2009/10/22 01:23:16 guenther Exp $ */
/*
* Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
@@ -37,7 +37,7 @@ vasprintf(char **str, const char *fmt, __va_list ap)
if (f._bf._base == NULL)
goto err;
f._bf._size = f._w = 127; /* Leave room for the NUL */
- ret = __vfprintf(&f, fmt, ap);
+ ret = vfprintf(&f, fmt, ap);
if (ret == -1)
goto err;
*f._p = '\0';
diff --git a/lib/libc/stdio/vfprintf.c b/lib/libc/stdio/vfprintf.c
index 2d3fb3ebe13..4ab62b49f29 100644
--- a/lib/libc/stdio/vfprintf.c
+++ b/lib/libc/stdio/vfprintf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfprintf.c,v 1.55 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: vfprintf.c,v 1.56 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
@@ -130,8 +130,8 @@ __sbprintf(FILE *fp, const char *fmt, va_list ap)
fake._lbfsize = 0; /* not actually used, but Just In Case */
/* do the work, then copy any error status */
- ret = __vfprintf(&fake, fmt, ap);
- if (ret >= 0 && __sflush(&fake))
+ ret = vfprintf(&fake, fmt, ap);
+ if (ret >= 0 && fflush(&fake))
ret = EOF;
if (fake._flags & __SERR)
fp->_flags |= __SERR;
@@ -190,17 +190,6 @@ static int exponent(char *, int, int);
int
vfprintf(FILE *fp, const char *fmt0, __va_list ap)
{
- int ret;
-
- FLOCKFILE(fp);
- ret = __vfprintf(fp, fmt0, ap);
- FUNLOCKFILE(fp);
- return (ret);
-}
-
-int
-__vfprintf(FILE *fp, const char *fmt0, __va_list ap)
-{
char *fmt; /* format string */
int ch; /* character from fmt */
int n, n2; /* handy integers (short term usage) */
diff --git a/lib/libc/stdio/vfscanf.c b/lib/libc/stdio/vfscanf.c
index 3a579b19a02..5b2fd03f4eb 100644
--- a/lib/libc/stdio/vfscanf.c
+++ b/lib/libc/stdio/vfscanf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfscanf.c,v 1.23 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: vfscanf.c,v 1.24 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -117,7 +117,6 @@ VFSCANF(FILE *fp, const char *fmt0, __va_list ap)
static short basefix[17] =
{ 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
- FLOCKFILE(fp);
_SET_ORIENTATION(fp, -1);
nassigned = 0;
@@ -125,10 +124,8 @@ VFSCANF(FILE *fp, const char *fmt0, __va_list ap)
base = 0; /* XXX just to keep gcc happy */
for (;;) {
c = *fmt++;
- if (c == 0) {
- FUNLOCKFILE(fp);
+ if (c == 0)
return (nassigned);
- }
if (isspace(c)) {
while ((fp->_r > 0 || __srefill(fp) == 0) &&
isspace(*fp->_p))
@@ -296,7 +293,6 @@ literal:
* Disgusting backwards compatibility hacks. XXX
*/
case '\0': /* compat */
- FUNLOCKFILE(fp);
return (EOF);
default: /* compat */
@@ -694,10 +690,8 @@ literal:
}
}
input_failure:
- if (nassigned == 0)
- nassigned = -1;
+ return (nassigned ? nassigned : -1);
match_failure:
- FUNLOCKFILE(fp);
return (nassigned);
}
diff --git a/lib/libc/stdio/vsnprintf.c b/lib/libc/stdio/vsnprintf.c
index 5a08714075e..a3931226bd5 100644
--- a/lib/libc/stdio/vsnprintf.c
+++ b/lib/libc/stdio/vsnprintf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vsnprintf.c,v 1.13 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: vsnprintf.c,v 1.14 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -58,7 +58,7 @@ vsnprintf(char *str, size_t n, const char *fmt, __va_list ap)
f._flags = __SWR | __SSTR;
f._bf._base = f._p = (unsigned char *)str;
f._bf._size = f._w = n - 1;
- ret = __vfprintf(&f, fmt, ap);
+ ret = vfprintf(&f, fmt, ap);
*f._p = '\0';
return (ret);
}
diff --git a/lib/libc/stdio/vsprintf.c b/lib/libc/stdio/vsprintf.c
index 720adb32f4c..cfa1349984d 100644
--- a/lib/libc/stdio/vsprintf.c
+++ b/lib/libc/stdio/vsprintf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vsprintf.c,v 1.14 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: vsprintf.c,v 1.15 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -53,7 +53,7 @@ vsprintf(char *str, const char *fmt, __va_list ap)
f._flags = __SWR | __SSTR;
f._bf._base = f._p = (unsigned char *)str;
f._bf._size = f._w = INT_MAX;
- ret = __vfprintf(&f, fmt, ap);
+ ret = vfprintf(&f, fmt, ap);
*f._p = '\0';
return (ret);
}
diff --git a/lib/libc/stdio/wbuf.c b/lib/libc/stdio/wbuf.c
index 8d181a66f30..990f1ea48c4 100644
--- a/lib/libc/stdio/wbuf.c
+++ b/lib/libc/stdio/wbuf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: wbuf.c,v 1.10 2009/10/21 16:04:23 guenther Exp $ */
+/* $OpenBSD: wbuf.c,v 1.11 2009/10/22 01:23:16 guenther Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -65,20 +65,20 @@ __swbuf(int c, FILE *fp)
* stuff c into the buffer. If this causes the buffer to fill
* completely, or if c is '\n' and the file is line buffered,
* flush it (perhaps a second time). The second flush will always
- * happen on unbuffered streams, where _bf._size==1; __sflush()
+ * happen on unbuffered streams, where _bf._size==1; fflush()
* guarantees that putc() will always call wbuf() by setting _w
* to 0, so we need not do anything else.
*/
n = fp->_p - fp->_bf._base;
if (n >= fp->_bf._size) {
- if (__sflush(fp))
+ if (fflush(fp))
return (EOF);
n = 0;
}
fp->_w--;
*fp->_p++ = c;
if (++n == fp->_bf._size || (fp->_flags & __SLBF && c == '\n'))
- if (__sflush(fp))
+ if (fflush(fp))
return (EOF);
return (c);
}
diff --git a/lib/libpthread/uthread/uthread_file.c b/lib/libpthread/uthread/uthread_file.c
index 83bbefadd63..d8c9cdcb818 100644
--- a/lib/libpthread/uthread/uthread_file.c
+++ b/lib/libpthread/uthread/uthread_file.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uthread_file.c,v 1.15 2009/10/21 16:05:02 guenther Exp $ */
+/* $OpenBSD: uthread_file.c,v 1.16 2009/10/22 01:23:16 guenther Exp $ */
/*
* Copyright (c) 1995 John Birrell <jb@cimlogic.com.au>.
* All rights reserved.
@@ -41,7 +41,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <unistd.h>
#include <sys/queue.h>
#ifdef _THREAD_SAFE
#include <pthread.h>
@@ -174,65 +173,68 @@ do_lock(int idx, FILE *fp)
return(p);
}
-
void
flockfile(FILE * fp)
{
int idx = file_idx(fp);
struct file_lock *p;
- /* Lock the hash table: */
- _SPINLOCK(&hash_lock);
+ /* Check if this is a real file: */
+ if (fileno(fp) >= 0) {
+ /* Lock the hash table: */
+ _SPINLOCK(&hash_lock);
- /* Check if the static array has not been initialised: */
- if (!init_done) {
- /* Initialise the global array: */
- memset(flh,0,sizeof(flh));
+ /* Check if the static array has not been initialised: */
+ if (!init_done) {
+ /* Initialise the global array: */
+ memset(flh,0,sizeof(flh));
- /* Flag the initialisation as complete: */
- init_done = 1;
- }
+ /* Flag the initialisation as complete: */
+ init_done = 1;
+ }
- /* Get a pointer to any existing lock for the file: */
- if ((p = find_lock(idx, fp)) == NULL) {
- /*
- * The file is not locked, so this thread can
- * grab the lock:
- */
- p = do_lock(idx, fp);
+ /* Get a pointer to any existing lock for the file: */
+ if ((p = find_lock(idx, fp)) == NULL) {
+ /*
+ * The file is not locked, so this thread can
+ * grab the lock:
+ */
+ p = do_lock(idx, fp);
- /* Unlock the hash table: */
- _SPINUNLOCK(&hash_lock);
+ /* Unlock the hash table: */
+ _SPINUNLOCK(&hash_lock);
- /*
- * The file is already locked, so check if the
- * running thread is the owner:
- */
- } else if (p->owner == _thread_run) {
/*
- * The running thread is already the
- * owner, so increment the count of
- * the number of times it has locked
- * the file:
+ * The file is already locked, so check if the
+ * running thread is the owner:
*/
- p->count++;
+ } else if (p->owner == _thread_run) {
+ /*
+ * The running thread is already the
+ * owner, so increment the count of
+ * the number of times it has locked
+ * the file:
+ */
+ p->count++;
- /* Unlock the hash table: */
- _SPINUNLOCK(&hash_lock);
- } else {
- /*
- * The file is locked for another thread.
- * Append this thread to the queue of
- * threads waiting on the lock.
- */
- TAILQ_INSERT_TAIL(&p->l_head,_thread_run,qe);
+ /* Unlock the hash table: */
+ _SPINUNLOCK(&hash_lock);
+ } else {
+ /*
+ * The file is locked for another thread.
+ * Append this thread to the queue of
+ * threads waiting on the lock.
+ */
+ TAILQ_INSERT_TAIL(&p->l_head,_thread_run,qe);
- /* Unlock the hash table: */
- _SPINUNLOCK(&hash_lock);
+ /* Unlock the hash table: */
+ _SPINUNLOCK(&hash_lock);
- /* Wait on the FILE lock: */
- _thread_kern_sched_state(PS_FILE_WAIT, "", 0);
+ /* Wait on the FILE lock: */
+ _thread_kern_sched_state(PS_FILE_WAIT, "", 0);
+ }
}
+ return;
}
int
@@ -242,45 +244,48 @@ ftrylockfile(FILE * fp)
int idx = file_idx(fp);
struct file_lock *p;
- /* Lock the hash table: */
- _SPINLOCK(&hash_lock);
+ /* Check if this is a real file: */
+ if (fileno(fp) >= 0) {
+ /* Lock the hash table: */
+ _SPINLOCK(&hash_lock);
- /* Get a pointer to any existing lock for the file: */
- if ((p = find_lock(idx, fp)) == NULL) {
- /*
- * The file is not locked, so this thread can
- * grab the lock:
- */
- p = do_lock(idx, fp);
+ /* Get a pointer to any existing lock for the file: */
+ if ((p = find_lock(idx, fp)) == NULL) {
+ /*
+ * The file is not locked, so this thread can
+ * grab the lock:
+ */
+ p = do_lock(idx, fp);
- /*
- * The file is already locked, so check if the
- * running thread is the owner:
- */
- } else if (p->owner == _thread_run) {
- /*
- * The running thread is already the
- * owner, so increment the count of
- * the number of times it has locked
- * the file:
- */
- p->count++;
- } else {
/*
- * The file is locked for another thread,
- * so this try fails.
+ * The file is already locked, so check if the
+ * running thread is the owner:
*/
- p = NULL;
- }
+ } else if (p->owner == _thread_run) {
+ /*
+ * The running thread is already the
+ * owner, so increment the count of
+ * the number of times it has locked
+ * the file:
+ */
+ p->count++;
+ } else {
+ /*
+ * The file is locked for another thread,
+ * so this try fails.
+ */
+ p = NULL;
+ }
- /* Check if the lock was obtained: */
- if (p != NULL)
- /* Return success: */
- ret = 0;
+ /* Check if the lock was obtained: */
+ if (p != NULL)
+ /* Return success: */
+ ret = 0;
- /* Unlock the hash table: */
- _SPINUNLOCK(&hash_lock);
+ /* Unlock the hash table: */
+ _SPINUNLOCK(&hash_lock);
+ }
return (ret);
}
@@ -290,64 +295,68 @@ funlockfile(FILE * fp)
int idx = file_idx(fp);
struct file_lock *p;
- /*
- * Defer signals to protect the scheduling queues from
- * access by the signal handler:
- */
- _thread_kern_sig_defer();
+ /* Check if this is a real file: */
+ if (fileno(fp) >= 0) {
+ /*
+ * Defer signals to protect the scheduling queues from
+ * access by the signal handler:
+ */
+ _thread_kern_sig_defer();
- /* Lock the hash table: */
- _SPINLOCK(&hash_lock);
+ /* Lock the hash table: */
+ _SPINLOCK(&hash_lock);
- /*
- * Get a pointer to the lock for the file and check that
- * the running thread is the one with the lock:
- */
- if ((p = find_lock(idx, fp)) != NULL &&
- p->owner == _thread_run) {
/*
- * Check if this thread has locked the FILE
- * more than once:
+ * Get a pointer to the lock for the file and check that
+ * the running thread is the one with the lock:
*/
- if (p->count > 1)
+ if ((p = find_lock(idx, fp)) != NULL &&
+ p->owner == _thread_run) {
/*
- * Decrement the count of the number of
- * times the running thread has locked this
- * file:
+ * Check if this thread has locked the FILE
+ * more than once:
*/
- p->count--;
- else {
- /*
- * The running thread will release the
- * lock now:
- */
- p->count = 0;
-
- /* Get the new owner of the lock: */
- if ((p->owner = TAILQ_FIRST(&p->l_head)) != NULL) {
- /* Pop the thread off the queue: */
- TAILQ_REMOVE(&p->l_head,p->owner,qe);
-
+ if (p->count > 1)
/*
- * This is the first lock for the new
- * owner:
+ * Decrement the count of the number of
+ * times the running thread has locked this
+ * file:
*/
- p->count = 1;
-
- /* Allow the new owner to run: */
- PTHREAD_NEW_STATE(p->owner,PS_RUNNING);
+ p->count--;
+ else {
+ /*
+ * The running thread will release the
+ * lock now:
+ */
+ p->count = 0;
+
+ /* Get the new owner of the lock: */
+ if ((p->owner = TAILQ_FIRST(&p->l_head)) != NULL) {
+ /* Pop the thread off the queue: */
+ TAILQ_REMOVE(&p->l_head,p->owner,qe);
+
+ /*
+ * This is the first lock for the new
+ * owner:
+ */
+ p->count = 1;
+
+ /* Allow the new owner to run: */
+ PTHREAD_NEW_STATE(p->owner,PS_RUNNING);
+ }
}
}
- }
- /* Unlock the hash table: */
- _SPINUNLOCK(&hash_lock);
+ /* Unlock the hash table: */
+ _SPINUNLOCK(&hash_lock);
- /*
- * Undefer and handle pending signals, yielding if
- * necessary:
- */
- _thread_kern_sig_undefer();
+ /*
+ * Undefer and handle pending signals, yielding if
+ * necessary:
+ */
+ _thread_kern_sig_undefer();
+ }
+ return;
}
#endif