summaryrefslogtreecommitdiff
path: root/lib/libc/stdio
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/stdio')
-rw-r--r--lib/libc/stdio/flockfile.c61
-rw-r--r--lib/libc/stdio/local.h4
2 files changed, 47 insertions, 18 deletions
diff --git a/lib/libc/stdio/flockfile.c b/lib/libc/stdio/flockfile.c
index 7fba26b2d0a..efa420f93e0 100644
--- a/lib/libc/stdio/flockfile.c
+++ b/lib/libc/stdio/flockfile.c
@@ -1,4 +1,4 @@
-/* $NetBSD: flockfile.c,v 1.4 2003/02/01 03:25:00 nathanw Exp $ */
+/* $NetBSD: flockfile.c,v 1.5 2003/07/18 21:50:41 nathanw Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: flockfile.c,v 1.4 2003/02/01 03:25:00 nathanw Exp $");
+__RCSID("$NetBSD: flockfile.c,v 1.5 2003/07/18 21:50:41 nathanw Exp $");
#endif /* LIBC_SCCS and not lint */
#include "namespace.h"
@@ -68,21 +68,7 @@ void
flockfile(FILE *fp)
{
- if (__isthreaded == 0)
- return;
-
- mutex_lock(&_LOCK(fp));
-
- if (_LOCKOWNER(fp) == thr_self()) {
- _LOCKCOUNT(fp)++;
- } else {
- while (_LOCKOWNER(fp) != NULL)
- cond_wait(&_LOCKCOND(fp), &_LOCK(fp));
- _LOCKOWNER(fp) = thr_self();
- _LOCKCOUNT(fp) = 1;
- }
-
- mutex_unlock(&_LOCK(fp));
+ __flockfile_internal(fp, 0);
}
int
@@ -113,11 +99,52 @@ void
funlockfile(FILE *fp)
{
+ __funlockfile_internal(fp, 0);
+}
+
+void
+__flockfile_internal(FILE *fp, int internal)
+{
+
if (__isthreaded == 0)
return;
mutex_lock(&_LOCK(fp));
+ if (_LOCKOWNER(fp) == thr_self()) {
+ _LOCKCOUNT(fp)++;
+ if (internal) {
+ if (_LOCKINTERNAL(fp) == 0)
+ /* stash cancellation state and disable */
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,
+ &_LOCKCANCELSTATE(fp));
+ _LOCKINTERNAL(fp)++;
+ }
+ } else {
+ while (_LOCKOWNER(fp) != NULL)
+ cond_wait(&_LOCKCOND(fp), &_LOCK(fp));
+ _LOCKOWNER(fp) = thr_self();
+ _LOCKCOUNT(fp) = 1;
+ }
+
+ mutex_unlock(&_LOCK(fp));
+}
+
+void
+__funlockfile_internal(FILE *fp, int internal)
+{
+
+ if (__isthreaded == 0)
+ return;
+
+ mutex_lock(&_LOCK(fp));
+
+ if (internal) {
+ _LOCKINTERNAL(fp)--;
+ if (_LOCKINTERNAL(fp) == 0)
+ pthread_setcancelstate(_LOCKCANCELSTATE(fp), NULL);
+ }
+
_LOCKCOUNT(fp)--;
if (_LOCKCOUNT(fp) == 0) {
_LOCKOWNER(fp) = NULL;
diff --git a/lib/libc/stdio/local.h b/lib/libc/stdio/local.h
index 64e6d2e3916..41c3ab9274c 100644
--- a/lib/libc/stdio/local.h
+++ b/lib/libc/stdio/local.h
@@ -1,4 +1,4 @@
-/* $NetBSD: local.h,v 1.15 2003/03/07 07:11:38 tshiozak Exp $ */
+/* $NetBSD: local.h,v 1.16 2003/07/18 21:50:41 nathanw Exp $ */
/*-
* Copyright (c) 1990, 1993
@@ -102,3 +102,5 @@ extern wint_t __fputwc_unlock __P((wchar_t, FILE *));
(fp)->_lb._base = NULL; \
}
+extern void __flockfile_internal __P((FILE *, int));
+extern void __funlockfile_internal __P((FILE *, int));