[rtems commit] Synchronize all file descriptors in sync()

Sebastian Huber sebh at rtems.org
Tue May 17 13:20:29 UTC 2022


Module:    rtems
Branch:    master
Commit:    3ccfb58311ace35a0562daa6ecff6e94f77bfe8b
Changeset: http://git.rtems.org/rtems/commit/?id=3ccfb58311ace35a0562daa6ecff6e94f77bfe8b

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri May 13 13:10:00 2022 +0200

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(-)

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 <sys/reent.h>
 #include <unistd.h>
-#include <stdio.h>
-
-#include <rtems.h>
-#include <rtems/score/thread.h>
-#include <rtems/score/percpu.h>
 
-/* In Newlib this function is declared in a private header file */
-int _fwalk_reent (struct _reent *, int (*)(struct _reent *, FILE *));
+#include <rtems/libio_.h>
 
-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 );
+  }
 }



More information about the vc mailing list