svn commit: branches/uClibc_0_9_28/libc/stdio
andersen at uclibc.org
andersen at uclibc.org
Thu Feb 8 18:37:32 UTC 2007
Author: andersen
Date: 2007-02-08 10:37:31 -0800 (Thu, 08 Feb 2007)
New Revision: 17820
Log:
backport fixes from trunk
Modified:
branches/uClibc_0_9_28/libc/stdio/fclose.c
Changeset:
Modified: branches/uClibc_0_9_28/libc/stdio/fclose.c
===================================================================
--- branches/uClibc_0_9_28/libc/stdio/fclose.c 2007-02-08 18:35:43 UTC (rev 17819)
+++ branches/uClibc_0_9_28/libc/stdio/fclose.c 2007-02-08 18:37:31 UTC (rev 17820)
@@ -7,40 +7,38 @@
#include "_stdio.h"
+
int fclose(register FILE *stream)
{
int rv = 0;
__STDIO_AUTO_THREADLOCK_VAR;
-#warning dead code... but may want to simply check and not remove
-/* #ifdef __STDIO_HAS_OPENLIST */
-/* #if !defined(__UCLIBC_HAS_THREADS__) || !defined(__STDIO_BUFFERS) */
-/* /\* First, remove the file from the open file list. *\/ */
-/* { */
-/* register FILE *ptr; */
+#ifdef __STDIO_HAS_OPENLIST
+#if !defined(__UCLIBC_HAS_THREADS__) || !defined(__STDIO_BUFFERS)
+ /* First, remove the file from the open file list. */
+ {
+ FILE *ptr;
-/* __STDIO_THREADLOCK_OPENLIST; */
-/* if ((ptr = _stdio_openlist) == stream) { */
-/* #warning does a mod!!! */
-/* _stdio_openlist = stream->__nextopen; */
-/* } else { */
-/* while (ptr) { */
-/* if (ptr->__nextopen == stream) { */
-/* ptr->__nextopen = stream->__nextopen; */
-/* break; */
-/* } */
-/* ptr = ptr->__nextopen; */
-/* } */
-/* } */
-/* __STDIO_THREADUNLOCK_OPENLIST; */
+ __STDIO_THREADLOCK_OPENLIST_DEL;
+ __STDIO_THREADLOCK_OPENLIST_ADD;
+ ptr = _stdio_openlist;
+ if ((ptr = _stdio_openlist) == stream) {
+ _stdio_openlist = stream->__nextopen;
+ } else {
+ while (ptr) {
+ if (ptr->__nextopen == stream) {
+ ptr->__nextopen = stream->__nextopen;
+ break;
+ }
+ ptr = ptr->__nextopen;
+ }
+ }
+ __STDIO_THREADUNLOCK_OPENLIST_ADD;
+ __STDIO_THREADUNLOCK_OPENLIST_DEL;
+ }
+#endif
+#endif
-/* if (!ptr) { /\* Did not find stream in the open file list! *\/ */
-/* return EOF; */
-/* } */
-/* } */
-/* #endif */
-/* #endif */
-
__STDIO_AUTO_THREADLOCK(stream);
__STDIO_STREAM_VALIDATE(stream);
@@ -48,7 +46,7 @@
#ifdef __STDIO_BUFFERS
/* Write any pending buffered chars. */
if (__STDIO_STREAM_IS_WRITING(stream)) {
- rv = __fflush_unlocked(stream);
+ rv = fflush_unlocked(stream);
}
#endif
@@ -62,6 +60,11 @@
* Since a file can't be both readonly and writeonly, that makes
* an effective signal. It also has the benefit of disabling
* transitions to either reading or writing. */
+#if defined(__UCLIBC_HAS_THREADS__) && defined(__STDIO_BUFFERS)
+ /* Before we mark the file as closed, make sure we increment the openlist use count
+ * so it isn't freed under us while still cleaning up. */
+ __STDIO_OPENLIST_INC_USE;
+#endif
stream->__modeflags &= (__FLAG_FREEBUF|__FLAG_FREEFILE);
stream->__modeflags |= (__FLAG_READONLY|__FLAG_WRITEONLY);
@@ -84,10 +87,11 @@
__STDIO_AUTO_THREADUNLOCK(stream);
__STDIO_STREAM_FREE_BUFFER(stream);
-#warning... inefficient - locks and unlocks twice and walks whole list
+#ifdef __UCLIBC_MJN3_ONLY__
+#warning REMINDER: inefficient - locks and unlocks twice and walks whole list
+#endif
#if defined(__UCLIBC_HAS_THREADS__) && defined(__STDIO_BUFFERS)
/* inefficient - locks/unlocks twice and walks whole list */
- __STDIO_OPENLIST_INC_USE;
__STDIO_OPENLIST_INC_DEL_CNT;
__STDIO_OPENLIST_DEC_USE; /* This with free the file if necessary. */
#else
@@ -96,3 +100,4 @@
return rv;
}
+libc_hidden_def(fclose)
More information about the uClibc-cvs
mailing list