source: rtems/cpukit/libcsupport/src/sync.c @ e9a9bdd

4.8
Last change on this file since e9a9bdd was e9a9bdd, checked in by Ralf Corsepius <ralf.corsepius@…>, on 12/23/07 at 07:13:55

Make sync() POSIX-compliant.

  • Property mode set to 100644
File size: 1.9 KB
Line 
1/*
2 *  sync() - XXX ??? where is this defined
3 *
4 *  This function operates by as follows:
5 *    for all threads
6 *      for all FILE *
7 *         fsync()
8 *         fdatasync()
9 *
10 *  COPYRIGHT (c) 1989-2003.
11 *  On-Line Applications Research Corporation (OAR).
12 *
13 *  The license and distribution terms for this file may be
14 *  found in the file LICENSE in this distribution or at
15 *  http://www.rtems.com/license/LICENSE.
16 *
17 *  $Id$
18 */
19
20#if HAVE_CONFIG_H
21#include "config.h"
22#endif
23
24/* Since we compile with strict ANSI we need to undef it to get
25 * prototypes for extensions
26 */
27#undef __STRICT_ANSI__
28int fdatasync(int);        /* still not always prototyped */
29
30
31#include <unistd.h>
32#include <stdio.h>
33
34#include <rtems.h>
35/*
36#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
37
38#include <rtems/libio_.h>
39#include <rtems/seterr.h>
40*/
41
42/* XXX check standards -- Linux version appears to be void */
43void _fwalk(struct _reent *, void *);
44
45
46static void sync_wrapper(FILE *f)
47{
48  int fn = fileno(f);
49
50  fsync(fn);
51  fdatasync(fn);
52}
53
54/* iterate over all FILE *'s for this thread */
55static void sync_per_thread(Thread_Control *t)
56{
57   struct _reent *current_reent;
58   struct _reent *this_reent;
59
60   /*
61    *  The sync_wrapper() function will operate on the current thread's
62    *  reent structure so we will temporarily use that.
63    */
64   this_reent = t->libc_reent;
65   if ( this_reent ) {
66     current_reent = _Thread_Executing->libc_reent;
67     _Thread_Executing->libc_reent = this_reent;
68     _fwalk (t->libc_reent, sync_wrapper);
69     _Thread_Executing->libc_reent = current_reent;
70   }
71}
72
73void sync(void)
74{
75  extern struct _reent libc_global_reent;
76
77  /*
78   *  Walk the one used initially by RTEMS.
79   */
80  _fwalk(&libc_global_reent, sync_wrapper);
81
82  /*
83   *  XXX Do we walk the one used globally by newlib?
84   *  XXX Do we need the RTEMS global one?
85   */
86
87  /*
88   *  Now walk all the per-thread reentrancy structures.
89   */
90  rtems_iterate_over_all_threads(sync_per_thread);
91}
Note: See TracBrowser for help on using the repository browser.