From 3ccfb58311ace35a0562daa6ecff6e94f77bfe8b Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 13 May 2022 13:10:00 +0200 Subject: Synchronize all file descriptors in sync() Synchronize all file descriptors and not just the ones associated with a FILE object. Close #4656. --- cpukit/libcsupport/src/sync.c | 84 +++++++------------------------------------ 1 file changed, 12 insertions(+), 72 deletions(-) (limited to 'cpukit/libcsupport') diff --git a/cpukit/libcsupport/src/sync.c b/cpukit/libcsupport/src/sync.c index dc50ae1121..7ce53cc781 100644 --- a/cpukit/libcsupport/src/sync.c +++ b/cpukit/libcsupport/src/sync.c @@ -1,15 +1,15 @@ /* SPDX-License-Identifier: BSD-2-Clause */ /** - * @file + * @file * - * @brief Synchronize Data on Disk with Memory - * @ingroup libcsupport + * @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 * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -37,76 +37,16 @@ #include "config.h" #endif -#include #include -#include - -#include -#include -#include -/* In Newlib this function is declared in a private header file */ -int _fwalk_reent (struct _reent *, int (*)(struct _reent *, FILE *)); +#include -static int sync_wrapper(struct _reent *reent, FILE *f) +void sync( void ) { - int fn = fileno(f); - - (void) reent; - - /* - * There is no way to report errors here. So this is a best-effort approach. - */ - (void) fsync(fn); - (void) fdatasync(fn); - - return 0; -} - -/* 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_reent (this_reent, sync_wrapper); - executing->libc_reent = current_reent; - } - - return false; -} - -/** - * This function operates by as follows: - * for all threads - * for all FILE * - * fsync() - * fdatasync() - */ -void sync(void) -{ - - /* - * Walk the one used initially by RTEMS. - */ - _fwalk_reent(_GLOBAL_REENT, sync_wrapper); - - /* - * XXX Do we walk the one used globally by newlib? - * XXX Do we need the RTEMS global one? - */ + int fd; - /* - * 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 ); + } } -- cgit v1.2.3