blob: 836af22cf2192449758e4d5cbd366e71ffe0bbd1 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1999-2014 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below). A copy of the license is included in the section entitled
"GNU Free Documentation License".
(a) The FSF's Front-Cover Text is:
A GNU Manual
(b) The FSF's Back-Cover Text is:
You have freedom to copy and modify this GNU Manual, like GNU
software. Copies published by the Free Software Foundation raise
funds for GNU development. -->
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>The GNU Fortran Compiler: Data consistency and durability</title>
<meta name="description" content="The GNU Fortran Compiler: Data consistency and durability">
<meta name="keywords" content="The GNU Fortran Compiler: Data consistency and durability">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Compiler-Characteristics.html#Compiler-Characteristics" rel="up" title="Compiler Characteristics">
<link href="Extensions.html#Extensions" rel="next" title="Extensions">
<link href="Thread_002dsafety-of-the-runtime-library.html#Thread_002dsafety-of-the-runtime-library" rel="prev" title="Thread-safety of the runtime library">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
</head>
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Data-consistency-and-durability"></a>
<div class="header">
<p>
Previous: <a href="Thread_002dsafety-of-the-runtime-library.html#Thread_002dsafety-of-the-runtime-library" accesskey="p" rel="prev">Thread-safety of the runtime library</a>, Up: <a href="Compiler-Characteristics.html#Compiler-Characteristics" accesskey="u" rel="up">Compiler Characteristics</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Data-consistency-and-durability-1"></a>
<h3 class="section">5.4 Data consistency and durability</h3>
<a name="index-consistency_002c-durability"></a>
<p>This section contains a brief overview of data and metadata
consistency and durability issues when doing I/O.
</p>
<p>With respect to durability, GNU Fortran makes no effort to ensure that
data is committed to stable storage. If this is required, the GNU
Fortran programmer can use the intrinsic <code>FNUM</code> to retrieve the
low level file descriptor corresponding to an open Fortran unit. Then,
using e.g. the <code>ISO_C_BINDING</code> feature, one can call the
underlying system call to flush dirty data to stable storage, such as
<code>fsync</code> on POSIX, <code>_commit</code> on MingW, or <code>fcntl(fd,
F_FULLSYNC, 0)</code> on Mac OS X. The following example shows how to call
fsync:
</p>
<div class="smallexample">
<pre class="smallexample"> ! Declare the interface for POSIX fsync function
interface
function fsync (fd) bind(c,name=&quot;fsync&quot;)
use iso_c_binding, only: c_int
integer(c_int), value :: fd
integer(c_int) :: fsync
end function fsync
end interface
! Variable declaration
integer :: ret
! Opening unit 10
open (10,file=&quot;foo&quot;)
! ...
! Perform I/O on unit 10
! ...
! Flush and sync
flush(10)
ret = fsync(fnum(10))
! Handle possible error
if (ret /= 0) stop &quot;Error calling FSYNC&quot;
</pre></div>
<p>With respect to consistency, for regular files GNU Fortran uses
buffered I/O in order to improve performance. This buffer is flushed
automatically when full and in some other situations, e.g. when
closing a unit. It can also be explicitly flushed with the
<code>FLUSH</code> statement. Also, the buffering can be turned off with the
<code>GFORTRAN_UNBUFFERED_ALL</code> and
<code>GFORTRAN_UNBUFFERED_PRECONNECTED</code> environment variables. Special
files, such as terminals and pipes, are always unbuffered. Sometimes,
however, further things may need to be done in order to allow other
processes to see data that GNU Fortran has written, as follows.
</p>
<p>The Windows platform supports a relaxed metadata consistency model,
where file metadata is written to the directory lazily. This means
that, for instance, the <code>dir</code> command can show a stale size for a
file. One can force a directory metadata update by closing the unit,
or by calling <code>_commit</code> on the file descriptor. Note, though,
that <code>_commit</code> will force all dirty data to stable storage, which
is often a very slow operation.
</p>
<p>The Network File System (NFS) implements a relaxed consistency model
called open-to-close consistency. Closing a file forces dirty data and
metadata to be flushed to the server, and opening a file forces the
client to contact the server in order to revalidate cached
data. <code>fsync</code> will also force a flush of dirty data and metadata
to the server. Similar to <code>open</code> and <code>close</code>, acquiring and
releasing <code>fcntl</code> file locks, if the server supports them, will
also force cache validation and flushing dirty data and metadata.
</p>
<hr>
<div class="header">
<p>
Previous: <a href="Thread_002dsafety-of-the-runtime-library.html#Thread_002dsafety-of-the-runtime-library" accesskey="p" rel="prev">Thread-safety of the runtime library</a>, Up: <a href="Compiler-Characteristics.html#Compiler-Characteristics" accesskey="u" rel="up">Compiler Characteristics</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>