(Fwd) Re: DOSFS bug fixes, IDE drivers and sample released

Chris Johns cjohns at cybertec.com.au
Sat May 24 00:25:12 UTC 2003


Joel Sherrill wrote:
> 
> I think you are correct.  A sync() call must be available.  The guts
> of the logic are in libc_wrapup() in cpukit/libcsupport/newlibc.c.
> This code fragment hints at the solution:
> 
>   /*
>    * Try to drain output buffers.
>    *
>    * Should this be changed to do *all* file streams?
>    *    _fwalk (_REENT, fclose);
>    */
> 
>   fclose (stdin);
>   fclose (stdout);
>   fclose (stderr);
> 
> _fwalk() takes a (struct _reent *) as the 1st argument and
> a function pointer as its second.  The function is passed the FILE *
> for each open file on that reent structure. It looks like you 
> could implement sync something like this:
> 
> sync:
>   for each task
>     _fwalk( my reent, flush_and_sync )
>   
> 
> int flush_and_sync( FILE *fp ){
>   fflush(fp);
>   fsync(FILENO(fp);
> }
> 
> Does that look close to right?
> 

I do not think this is all that needs to happen. The SUSv3 standard for the sync 
call meantions:

   The sync() function shall cause all information in memory that updates
   file systems to be scheduled for writing out to all file systems.

   The writing, although scheduled, is not necessarily complete upon
   return from sync().

What happens with 'mkdir' or 'unlink' calls ? The fsync call may not handle 
this. It will depend on the FS implementation.

I feel for RTEMS we should do more than shedule an update.

The fflush(NULL) call is defined as:

   If stream points to an output stream or an update stream in which
   the most recent operation was not input, fflush() shall cause any
   unwritten data for that stream to be written to the file, [CX] and
   the st_ctime and st_mtime fields of the underlying file shall be
   marked for update.

   If stream is a null pointer, fflush() shall perform this flushing
   action on all streams for which the behavior is defined above.

Does fflush(NULL) flush all streams or just the task's files get flushed ?

The fflush(NULL) does an fwalk.

> Does that look close to right?
> 
> I am also thinking that the newlib per task exit handler and system
> exit handler might need to be addressed as part of this.
> 

I agreed with the system exit handler, but I am not sure about a task exit 
handler due to performance reasons. Once implemented the sync call can be used 
in an application where it is needed.

-- 
  Chris Johns, cjohns at cybertec.com.au




More information about the users mailing list