diff options
Diffstat (limited to 'cpukit/libcsupport/src/sync.c')
-rw-r--r-- | cpukit/libcsupport/src/sync.c | 118 |
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 ); + } } |