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