1 //========================================================================
5 // Implementation of C library file flush function as per ANSI 7.9.5.2
7 //========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
13 // eCos is free software; you can redistribute it and/or modify it under
14 // the terms of the GNU General Public License as published by the Free
15 // Software Foundation; either version 2 or (at your option) any later version.
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 // You should have received a copy of the GNU General Public License along
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
26 // As a special exception, if other files instantiate templates or use macros
27 // or inline functions from this file, or you compile this file and link it
28 // with other works to produce a work based on this file, this file does not
29 // by itself cause the resulting work to be covered by the GNU General Public
30 // License. However the source code for this file must still be made available
31 // in accordance with section (3) of the GNU General Public License.
33 // This exception does not invalidate any other reasons why a work based on
34 // this file might be covered by the GNU General Public License.
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37 // at http://sources.redhat.com/ecos/ecos-license/
38 // -------------------------------------------
39 //####ECOSGPLCOPYRIGHTEND####
40 //========================================================================
41 //#####DESCRIPTIONBEGIN####
43 // Author(s): jlarmour
46 // Purpose: Provides ISO C fflush() function
50 //####DESCRIPTIONEND####
52 //========================================================================
56 #include <pkgconf/libc_stdio.h> // Configuration header
60 #include <cyg/infra/cyg_type.h> // Common project-wide type definitions
61 #include <stddef.h> // NULL and size_t from compiler
62 #include <errno.h> // Error codes
63 #include <stdio.h> // header for fflush()
64 #include <cyg/libc/stdio/stream.hxx>// C library streams
65 #include <cyg/libc/stdio/stdiofiles.hxx> // C library files
66 #include <cyg/libc/stdio/stdiosupp.hxx> // support for stdio
70 // flush all but one stream
72 cyg_libc_stdio_flush_all_but( Cyg_StdioStream *not_this_stream )
74 cyg_bool files_flushed[FOPEN_MAX] = { false }; // sets all to 0
75 cyg_bool loop_again, looped = false;
78 Cyg_StdioStream *stream;
83 for (i=0; (i<FOPEN_MAX) && !err; i++) {
84 if (files_flushed[i] == false) {
86 stream = Cyg_libc_stdio_files::get_file_stream(i);
88 if ((stream == NULL) || (stream == not_this_stream)) {
89 // if it isn't a valid stream, set its entry in the
90 // list of files flushed since we don't want to
92 // Ditto if its the one we're meant to miss
94 files_flushed[i] = true;
98 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
99 // only buffers which we've written to need flushing
100 if ( !stream->flags.last_buffer_op_was_read)
103 // we try to flush the first time through so that
104 // everything is flushed that can be flushed.
105 // The second time through we should just wait
106 // in case some other lowerpri thread has locked the
107 // stream, otherwise we will spin needlessly and
108 // never let the lower pri thread run!
109 if ( (looped && stream->lock_me()) ||
110 stream->trylock_me() ) {
111 err = stream->flush_output_unlocked();
113 files_flushed[i] = true;
124 while(loop_again && !err);
127 } // cyg_libc_stdio_flush_all_but()
130 fflush( FILE *stream ) __THROW
132 Cyg_StdioStream *real_stream = (Cyg_StdioStream *)stream;
135 if (stream == NULL) { // tells us to flush ALL streams
136 err = cyg_libc_stdio_flush_all_but(NULL);
139 err = real_stream->flush_output();