summaryrefslogtreecommitdiffstats
path: root/cpukit/libcsupport/src/sync.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libcsupport/src/sync.c')
-rw-r--r--cpukit/libcsupport/src/sync.c118
1 files changed, 34 insertions, 84 deletions
diff --git a/cpukit/libcsupport/src/sync.c b/cpukit/libcsupport/src/sync.c
index 265c6f07c9..551dfd56bb 100644
--- a/cpukit/libcsupport/src/sync.c
+++ b/cpukit/libcsupport/src/sync.c
@@ -1,102 +1,52 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
/**
- * @file
+ * @file
+ *
+ * @ingroup libcsupport
*
- * @brief Synchronize Data on Disk with Memory
- * @ingroup libcsupport
+ * @brief This source file contains the implementation of sync().
*/
/*
- * COPYRIGHT (c) 1989-2008.
- * On-Line Applications Research Corporation (OAR).
+ * Copyright (C) 2022 embedded brains GmbH & Co. KG
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
*
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-/* Since we compile with strict ANSI we need to undef it to get
- * prototypes for extensions
- */
-#undef __STRICT_ANSI__
-int fdatasync(int); /* still not always prototyped */
-
-
#include <unistd.h>
-#include <stdio.h>
-
-#include <rtems.h>
-#include <rtems/score/thread.h>
-#include <rtems/score/percpu.h>
-
-/* XXX check standards -- Linux version appears to be void */
-void _fwalk(struct _reent *, void *);
-
-
-static void sync_wrapper(FILE *f)
-{
- int fn = fileno(f);
-
- /*
- * There is no way to report errors here. So this is a best-effort approach.
- */
- (void) fsync(fn);
- (void) fdatasync(fn);
-}
-
-/* iterate over all FILE *'s for this thread */
-static bool sync_per_thread(Thread_Control *t, void *arg)
-{
- struct _reent *current_reent;
- struct _reent *this_reent;
-
- /*
- * The sync_wrapper() function will operate on the current thread's
- * reent structure so we will temporarily use that.
- */
- this_reent = t->libc_reent;
- if ( this_reent ) {
- Thread_Control *executing = _Thread_Get_executing();
- current_reent = executing->libc_reent;
- executing->libc_reent = this_reent;
- _fwalk (t->libc_reent, sync_wrapper);
- executing->libc_reent = current_reent;
- }
-
- return false;
-}
-/*
- * _global_impure_ptr is not prototyped in any .h files.
- * We have to extern it here.
- */
-extern struct _reent * const _global_impure_ptr __ATTRIBUTE_IMPURE_PTR__;
+#include <rtems/libio_.h>
-/**
- * This function operates by as follows:
- * for all threads
- * for all FILE *
- * fsync()
- * fdatasync()
- */
-void sync(void)
+void sync( void )
{
+ int fd;
- /*
- * Walk the one used initially by RTEMS.
- */
- _fwalk(_global_impure_ptr, sync_wrapper);
-
- /*
- * XXX Do we walk the one used globally by newlib?
- * XXX Do we need the RTEMS global one?
- */
-
- /*
- * Now walk all the per-thread reentrancy structures.
- */
- rtems_task_iterate(sync_per_thread, NULL);
+ for ( fd = 0; fd < (int) rtems_libio_number_iops; ++fd ) {
+ (void) fsync( fd );
+ (void) fdatasync( fd );
+ }
}