diff flang/runtime/file.h @ 173:0572611fdcc8 llvm10 llvm12

reorgnization done
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 11:55:54 +0900
parents
children 2e18cbf3894f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flang/runtime/file.h	Mon May 25 11:55:54 2020 +0900
@@ -0,0 +1,98 @@
+//===-- runtime/file.h ------------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Raw system I/O wrappers
+
+#ifndef FORTRAN_RUNTIME_FILE_H_
+#define FORTRAN_RUNTIME_FILE_H_
+
+#include "io-error.h"
+#include "memory.h"
+#include <cinttypes>
+#include <optional>
+
+namespace Fortran::runtime::io {
+
+enum class OpenStatus { Old, New, Scratch, Replace, Unknown };
+enum class CloseStatus { Keep, Delete };
+enum class Position { AsIs, Rewind, Append };
+
+class OpenFile {
+public:
+  using FileOffset = std::int64_t;
+
+  const char *path() const { return path_.get(); }
+  void set_path(OwningPtr<char> &&, std::size_t bytes);
+  std::size_t pathLength() const { return pathLength_; }
+  bool mayRead() const { return mayRead_; }
+  void set_mayRead(bool yes) { mayRead_ = yes; }
+  bool mayWrite() const { return mayWrite_; }
+  void set_mayWrite(bool yes) { mayWrite_ = yes; }
+  bool mayAsynchronous() const { return mayAsynchronous_; }
+  void set_mayAsynchronous(bool yes) { mayAsynchronous_ = yes; }
+  bool mayPosition() const { return mayPosition_; }
+  void set_mayPosition(bool yes) { mayPosition_ = yes; }
+  FileOffset position() const { return position_; }
+  bool isTerminal() const { return isTerminal_; }
+
+  bool IsOpen() const { return fd_ >= 0; }
+  void Open(OpenStatus, Position, IoErrorHandler &);
+  void Predefine(int fd);
+  void Close(CloseStatus, IoErrorHandler &);
+
+  // Reads data into memory; returns amount acquired.  Synchronous.
+  // Partial reads (less than minBytes) signify end-of-file.  If the
+  // buffer is larger than minBytes, and extra returned data will be
+  // preserved for future consumption, set maxBytes larger than minBytes
+  // to reduce system calls  This routine handles EAGAIN/EWOULDBLOCK and EINTR.
+  std::size_t Read(FileOffset, char *, std::size_t minBytes,
+      std::size_t maxBytes, IoErrorHandler &);
+
+  // Writes data.  Synchronous.  Partial writes indicate program-handled
+  // error conditions.
+  std::size_t Write(FileOffset, const char *, std::size_t, IoErrorHandler &);
+
+  // Truncates the file
+  void Truncate(FileOffset, IoErrorHandler &);
+
+  // Asynchronous transfers
+  int ReadAsynchronously(FileOffset, char *, std::size_t, IoErrorHandler &);
+  int WriteAsynchronously(
+      FileOffset, const char *, std::size_t, IoErrorHandler &);
+  void Wait(int id, IoErrorHandler &);
+  void WaitAll(IoErrorHandler &);
+
+private:
+  struct Pending {
+    int id;
+    int ioStat{0};
+    OwningPtr<Pending> next;
+  };
+
+  void CheckOpen(const Terminator &);
+  bool Seek(FileOffset, IoErrorHandler &);
+  bool RawSeek(FileOffset);
+  bool RawSeekToEnd();
+  int PendingResult(const Terminator &, int);
+
+  int fd_{-1};
+  OwningPtr<char> path_;
+  std::size_t pathLength_;
+  bool mayRead_{false};
+  bool mayWrite_{false};
+  bool mayPosition_{false};
+  bool mayAsynchronous_{false};
+  FileOffset position_{0};
+  std::optional<FileOffset> knownSize_;
+  bool isTerminal_{false};
+
+  int nextId_;
+  OwningPtr<Pending> pending_;
+};
+} // namespace Fortran::runtime::io
+#endif // FORTRAN_RUNTIME_FILE_H_