[Groonga-commit] groonga/grnxx [master] Update the interface of grnxx::io::View.

アーカイブの一覧に戻る

susumu.yata null+****@clear*****
Thu Dec 6 18:43:19 JST 2012


susumu.yata	2012-12-06 18:43:19 +0900 (Thu, 06 Dec 2012)

  New Revision: 7dcd1d9683c047c9eb1284db5af73c88eed3c44f
  https://github.com/groonga/grnxx/commit/7dcd1d9683c047c9eb1284db5af73c88eed3c44f

  Log:
    Update the interface of grnxx::io::View.

  Modified files:
    lib/io/pool-impl.cpp
    lib/io/pool-impl.hpp
    lib/io/pool.hpp
    lib/io/view-posix.cpp
    lib/io/view-posix.hpp
    lib/io/view-windows.cpp
    lib/io/view-windows.hpp
    lib/io/view.cpp
    lib/io/view.hpp
    test/test_io_view.cpp

  Modified: lib/io/pool-impl.cpp (+7 -7)
===================================================================
--- lib/io/pool-impl.cpp    2012-12-06 18:19:24 +0900 (38fa4e5)
+++ lib/io/pool-impl.cpp    2012-12-06 18:43:19 +0900 (06823c0)
@@ -362,7 +362,7 @@ void PoolImpl::open_regular_pool(const char *path, Flags flags,
 void PoolImpl::setup_header(const PoolOptions &options) {
   if (files_[0]) {
     files_[0].resize(POOL_HEADER_CHUNK_SIZE);
-    header_chunk_ = View(files_[0], get_view_flags(),
+    header_chunk_ = View(get_view_flags(), files_[0],
                          0, POOL_HEADER_CHUNK_SIZE);
   } else {
     header_chunk_ = View(get_view_flags(), POOL_HEADER_CHUNK_SIZE);
@@ -373,7 +373,7 @@ void PoolImpl::setup_header(const PoolOptions &options) {
 }
 
 void PoolImpl::check_header() {
-  header_chunk_ = View(files_[0], get_view_flags(), 0, POOL_HEADER_CHUNK_SIZE);
+  header_chunk_ = View(get_view_flags(), files_[0], 0, POOL_HEADER_CHUNK_SIZE);
   header_ = static_cast<PoolHeader *>(header_chunk_.address());
 
   // TODO: Check the header.
@@ -447,18 +447,18 @@ View PoolImpl::mmap_chunk(const ChunkInfo &chunk_info) {
       }
     }
 
-    return View(file, get_view_flags(),
+    return View(get_view_flags(), file,
                 chunk_info.offset(), chunk_info.size());
   }
 }
 
-Flags PoolImpl::get_view_flags() const {
+ViewFlags PoolImpl::get_view_flags() const {
   if (flags_ & GRNXX_IO_ANONYMOUS) {
-    return (flags_ & GRNXX_IO_HUGE_TLB) ? GRNXX_IO_HUGE_TLB : Flags::none();
+    return (flags_ & GRNXX_IO_HUGE_TLB) ? VIEW_HUGE_TLB : ViewFlags::none();
   } else {
-    Flags view_flags = GRNXX_IO_SHARED;
+    ViewFlags view_flags = VIEW_SHARED;
     if (flags_ & GRNXX_IO_READ_ONLY) {
-      view_flags |= GRNXX_IO_READ_ONLY;
+      view_flags |= VIEW_READ_ONLY;
     }
     return view_flags;
   }

  Modified: lib/io/pool-impl.hpp (+1 -1)
===================================================================
--- lib/io/pool-impl.hpp    2012-12-06 18:19:24 +0900 (557ae5a)
+++ lib/io/pool-impl.hpp    2012-12-06 18:43:19 +0900 (ec28c32)
@@ -101,7 +101,7 @@ class PoolImpl {
   void mmap_block_info_chunk(uint16_t chunk_id);
   View mmap_chunk(const ChunkInfo &chunk_info);
 
-  Flags get_view_flags() const;
+  ViewFlags get_view_flags() const;
 
   String generate_path(uint16_t file_id) const;
 

  Modified: lib/io/pool.hpp (+1 -0)
===================================================================
--- lib/io/pool.hpp    2012-12-06 18:19:24 +0900 (da1367f)
+++ lib/io/pool.hpp    2012-12-06 18:43:19 +0900 (dce25f3)
@@ -21,6 +21,7 @@
 #include "../mutex.hpp"
 #include "../recycler.hpp"
 #include "chunk.hpp"
+#include "flags.hpp"
 
 namespace grnxx {
 namespace io {

  Modified: lib/io/view-posix.cpp (+20 -20)
===================================================================
--- lib/io/view-posix.cpp    2012-12-06 18:19:24 +0900 (4aa7031)
+++ lib/io/view-posix.cpp    2012-12-06 18:43:19 +0900 (4b4bd68)
@@ -44,7 +44,7 @@ ViewImpl::~ViewImpl() {
   }
 }
 
-std::unique_ptr<ViewImpl> ViewImpl::map(Flags flags, uint64_t size) {
+std::unique_ptr<ViewImpl> ViewImpl::map(ViewFlags flags, uint64_t size) {
   std::unique_ptr<ViewImpl> view(new (std::nothrow) ViewImpl);
   if (!view) {
     GRNXX_ERROR() << "new grnxx::io::ViewImpl failed";
@@ -54,24 +54,24 @@ std::unique_ptr<ViewImpl> ViewImpl::map(Flags flags, uint64_t size) {
   return view;
 }
 
-std::unique_ptr<ViewImpl> ViewImpl::map(const File &file, Flags flags) {
+std::unique_ptr<ViewImpl> ViewImpl::map(ViewFlags flags, const File &file) {
   std::unique_ptr<ViewImpl> view(new (std::nothrow) ViewImpl);
   if (!view) {
     GRNXX_ERROR() << "new grnxx::io::ViewImpl failed";
     GRNXX_THROW();
   }
-  view->map_on_file(file, flags, 0, file.size());
+  view->map_on_file(flags, file, 0, file.size());
   return view;
 }
 
-std::unique_ptr<ViewImpl> ViewImpl::map(const File &file, Flags flags,
+std::unique_ptr<ViewImpl> ViewImpl::map(ViewFlags flags, const File &file,
                                         uint64_t offset, uint64_t size) {
   std::unique_ptr<ViewImpl> view(new (std::nothrow) ViewImpl);
   if (!view) {
     GRNXX_ERROR() << "new grnxx::io::ViewImpl failed";
     GRNXX_THROW();
   }
-  view->map_on_file(file, flags, offset, size);
+  view->map_on_file(flags, file, offset, size);
   return view;
 }
 
@@ -97,13 +97,13 @@ void ViewImpl::sync(uint64_t offset, uint64_t size) {
 }
 
 ViewImpl::ViewImpl()
-  : file_(), flags_(Flags::none()),
+  : file_(), flags_(ViewFlags::none()),
     address_(MAP_FAILED), offset_(0), size_(0) {}
 
 #ifdef MAP_HUGETLB
-void ViewImpl::map_on_memory(Flags flags, uint64_t size) {
+void ViewImpl::map_on_memory(ViewFlags flags, uint64_t size) {
 #else  // MAP_HUGETLB
-void ViewImpl::map_on_memory(Flags, uint64_t size) {
+void ViewImpl::map_on_memory(ViewFlags, uint64_t size) {
 #endif  // MAP_HUGETLB
   if ((size == 0) || (size > std::numeric_limits<size_t>::max())) {
     GRNXX_ERROR() << "invalid argument: size = " << size << ": (0, "
@@ -111,16 +111,16 @@ void ViewImpl::map_on_memory(Flags, uint64_t size) {
     GRNXX_THROW();
   }
 
-  flags_ = GRNXX_IO_PRIVATE | GRNXX_IO_ANONYMOUS;
+  flags_ = VIEW_PRIVATE | VIEW_ANONYMOUS;
   size_ = size;
 
   int map_flags = MAP_PRIVATE | MAP_ANONYMOUS;
 #ifdef MAP_HUGETLB
-  if (flags & GRNXX_IO_HUGE_TLB) {
+  if (flags & VIEW_HUGE_TLB) {
     address_ = ::mmap(nullptr, size, PROT_READ | PROT_WRITE,
                       map_flags | MAP_HUGETLB, -1, 0);
     if (address_ != MAP_FAILED) {
-      flags_ |= GRNXX_IO_HUGE_TLB;
+      flags_ |= VIEW_HUGE_TLB;
     }
   }
 #endif  // MAP_HUGETLB
@@ -135,8 +135,8 @@ void ViewImpl::map_on_memory(Flags, uint64_t size) {
   }
 }
 
-void ViewImpl::map_on_file(const File &file, Flags flags, uint64_t offset,
-                           uint64_t size) {
+void ViewImpl::map_on_file(ViewFlags flags, const File &file,
+                           uint64_t offset, uint64_t size) {
   if ((size == 0) || (size > std::numeric_limits<size_t>::max())) {
     GRNXX_ERROR() << "invalid argument: size = " << size << ": (0, "
                   << std::numeric_limits<size_t>::max() << ']';
@@ -154,21 +154,21 @@ void ViewImpl::map_on_file(const File &file, Flags flags, uint64_t offset,
 
   int protection_flags = PROT_READ | PROT_WRITE;
   if ((file.flags() & FILE_READ_ONLY) ||
-      ((~file.flags() & FILE_WRITE_ONLY) && (flags & GRNXX_IO_READ_ONLY))) {
-    flags_ |= GRNXX_IO_READ_ONLY;
+      ((~file.flags() & FILE_WRITE_ONLY) && (flags & VIEW_READ_ONLY))) {
+    flags_ |= VIEW_READ_ONLY;
     protection_flags = PROT_READ;
   } else if ((file.flags() & FILE_WRITE_ONLY) ||
-             (flags & GRNXX_IO_WRITE_ONLY)) {
-    flags_ |= GRNXX_IO_WRITE_ONLY;
+             (flags & VIEW_WRITE_ONLY)) {
+    flags_ |= VIEW_WRITE_ONLY;
     protection_flags = PROT_WRITE;
   }
 
   int map_flags;
-  if ((flags & GRNXX_IO_SHARED) || (~flags & GRNXX_IO_PRIVATE)) {
-    flags_ |= GRNXX_IO_SHARED;
+  if ((flags & VIEW_SHARED) || (~flags & VIEW_PRIVATE)) {
+    flags_ |= VIEW_SHARED;
     map_flags = MAP_SHARED;
   } else {
-    flags_ |= GRNXX_IO_PRIVATE;
+    flags_ |= VIEW_PRIVATE;
     map_flags = MAP_PRIVATE;
   }
 

  Modified: lib/io/view-posix.hpp (+8 -8)
===================================================================
--- lib/io/view-posix.hpp    2012-12-06 18:19:24 +0900 (8bfac82)
+++ lib/io/view-posix.hpp    2012-12-06 18:43:19 +0900 (afcc126)
@@ -29,9 +29,9 @@ class ViewImpl {
  public:
   ~ViewImpl();
 
-  static std::unique_ptr<ViewImpl> map(Flags flags, uint64_t size);
-  static std::unique_ptr<ViewImpl> map(const File &file, Flags flags);
-  static std::unique_ptr<ViewImpl> map(const File &file, Flags flags,
+  static std::unique_ptr<ViewImpl> map(ViewFlags flags, uint64_t size);
+  static std::unique_ptr<ViewImpl> map(ViewFlags flags, const File &file);
+  static std::unique_ptr<ViewImpl> map(ViewFlags flags, const File &file,
                                        uint64_t offset, uint64_t size);
 
   void sync();
@@ -40,7 +40,7 @@ class ViewImpl {
   File file() const {
     return file_;
   }
-  Flags flags() const {
+  ViewFlags flags() const {
     return flags_;
   }
   void *address() const {
@@ -57,16 +57,16 @@ class ViewImpl {
 
  private:
   File file_;
-  Flags flags_;
+  ViewFlags flags_;
   void *address_;
   uint64_t offset_;
   uint64_t size_;
 
   ViewImpl();
 
-  void map_on_memory(Flags flags, uint64_t size);
-  void map_on_file(const File &file, Flags flags, uint64_t offset,
-                   uint64_t size);
+  void map_on_memory(ViewFlags flags, uint64_t size);
+  void map_on_file(ViewFlags flags, const File &file,
+                   uint64_t offset, uint64_t size);
 
   ViewImpl(const ViewImpl &);
   ViewImpl &operator=(const ViewImpl &);

  Modified: lib/io/view-windows.cpp (+18 -18)
===================================================================
--- lib/io/view-windows.cpp    2012-12-06 18:19:24 +0900 (4fe14b5)
+++ lib/io/view-windows.cpp    2012-12-06 18:43:19 +0900 (7519419)
@@ -42,7 +42,7 @@ ViewImpl::~ViewImpl() {
   }
 }
 
-std::unique_ptr<ViewImpl> ViewImpl::map(Flags flags, uint64_t size) {
+std::unique_ptr<ViewImpl> ViewImpl::map(ViewFlags flags, uint64_t size) {
   if (size == 0) {
     GRNXX_ERROR() << "invalid argument: size = " << size;
     GRNXX_THROW();
@@ -57,17 +57,17 @@ std::unique_ptr<ViewImpl> ViewImpl::map(Flags flags, uint64_t size) {
   return view;
 }
 
-std::unique_ptr<ViewImpl> ViewImpl::map(const File &file, Flags flags) {
+std::unique_ptr<ViewImpl> ViewImpl::map(ViewFlags flags, const File &file) {
   std::unique_ptr<ViewImpl> view(new (std::nothrow) ViewImpl);
   if (!view) {
     GRNXX_ERROR() << "new grnxx::io::ViewImpl failed";
     GRNXX_THROW();
   }
-  view->map_on_file(file, flags, 0, 0);
+  view->map_on_file(flags, file, 0, 0);
   return view;
 }
 
-std::unique_ptr<ViewImpl> ViewImpl::map(const File &file, Flags flags,
+std::unique_ptr<ViewImpl> ViewImpl::map(ViewFlags flags, const File &file,
                                         uint64_t offset, uint64_t size) {
   if (size == 0) {
     GRNXX_ERROR() << "invalid argument: size = " << size;
@@ -79,7 +79,7 @@ std::unique_ptr<ViewImpl> ViewImpl::map(const File &file, Flags flags,
     GRNXX_ERROR() << "new grnxx::io::ViewImpl failed";
     GRNXX_THROW();
   }
-  view->map_on_file(file, flags, offset, size);
+  view->map_on_file(flags, file, offset, size);
   return view;
 }
 
@@ -109,11 +109,11 @@ void ViewImpl::sync(uint64_t offset, uint64_t size) {
 }
 
 ViewImpl::ViewImpl()
-  : file_(), flags_(Flags::none()), handle_(nullptr),
+  : file_(), flags_(ViewFlags::none()), handle_(nullptr),
     address_(nullptr), offset_(0), size_(0) {}
 
-void ViewImpl::map_on_memory(Flags, uint64_t size) {
-  flags_ = GRNXX_IO_PRIVATE | GRNXX_IO_ANONYMOUS;
+void ViewImpl::map_on_memory(ViewFlags, uint64_t size) {
+  flags_ = VIEW_PRIVATE | VIEW_ANONYMOUS;
   size_ = size;
 
   const DWORD size_high = static_cast<DWORD>(size >> 32);
@@ -135,14 +135,14 @@ void ViewImpl::map_on_memory(Flags, uint64_t size) {
   }
 }
 
-void ViewImpl::map_on_file(const File &file, Flags flags, uint64_t offset,
-                           uint64_t size) {
+void ViewImpl::map_on_file(ViewFlags flags, const File &file,
+                           uint64_t offset, uint64_t size) {
   const uint64_t file_size = file.size();
   if (file_size == 0) {
     GRNXX_ERROR() << "invalid argument: file = " << file;
     GRNXX_THROW();
   }
-  if (flags & (GRNXX_IO_ANONYMOUS | GRNXX_IO_HUGE_TLB)) {
+  if (flags & (VIEW_ANONYMOUS | VIEW_HUGE_TLB)) {
     GRNXX_ERROR() << "invalid argument: flags = " << flags;
     GRNXX_THROW();
   }
@@ -164,8 +164,8 @@ void ViewImpl::map_on_file(const File &file, Flags flags, uint64_t offset,
   int protection_mode = PAGE_READWRITE;
   DWORD desired_access = FILE_MAP_WRITE;
   if ((file.flags() & FILE_READ_ONLY) ||
-      ((~file.flags() & FILE_WRITE_ONLY) && (flags & GRNXX_IO_READ_ONLY))) {
-    flags_ |= GRNXX_IO_READ_ONLY;
+      ((~file.flags() & FILE_WRITE_ONLY) && (flags & VIEW_READ_ONLY))) {
+    flags_ |= VIEW_READ_ONLY;
     protection_mode = PAGE_READONLY;
     desired_access = FILE_MAP_READ;
   } else if (file.flags() & FILE_WRITE_ONLY) {
@@ -173,19 +173,19 @@ void ViewImpl::map_on_file(const File &file, Flags flags, uint64_t offset,
     GRNXX_ERROR() << "mapping file is write-only: file = " << file;
     GRNXX_THROW();
   } else {
-    // GRNXX_IO_WRITE_ONLY is ignored because write-only memory mapping is not
+    // VIEW_WRITE_ONLY is ignored because write-only memory mapping is not
     // supported on Windows.
     protection_mode = PAGE_READWRITE;
-    if (flags & GRNXX_IO_PRIVATE) {
+    if (flags & VIEW_PRIVATE) {
       protection_mode = PAGE_WRITECOPY;
       desired_access = FILE_MAP_COPY;
     }
   }
 
-  if ((flags & GRNXX_IO_SHARED) || (~flags & GRNXX_IO_PRIVATE)) {
-    flags_ |= GRNXX_IO_SHARED;
+  if ((flags & VIEW_SHARED) || (~flags & VIEW_PRIVATE)) {
+    flags_ |= VIEW_SHARED;
   } else {
-    flags_ |= GRNXX_IO_PRIVATE;
+    flags_ |= VIEW_PRIVATE;
   }
 
   const DWORD size_high = static_cast<DWORD>((offset + size) >> 32);

  Modified: lib/io/view-windows.hpp (+8 -8)
===================================================================
--- lib/io/view-windows.hpp    2012-12-06 18:19:24 +0900 (ccd67d0)
+++ lib/io/view-windows.hpp    2012-12-06 18:43:19 +0900 (9979249)
@@ -38,9 +38,9 @@ class ViewImpl {
  public:
   ~ViewImpl();
 
-  static std::unique_ptr<ViewImpl> map(Flags flags, uint64_t size);
-  static std::unique_ptr<ViewImpl> map(const File &file, Flags flags);
-  static std::unique_ptr<ViewImpl> map(const File &file, Flags flags,
+  static std::unique_ptr<ViewImpl> map(ViewFlags flags, uint64_t size);
+  static std::unique_ptr<ViewImpl> map(ViewFlags flags, const File &file);
+  static std::unique_ptr<ViewImpl> map(ViewFlags flags, const File &file,
                                        uint64_t offset, uint64_t size);
 
   void sync();
@@ -49,7 +49,7 @@ class ViewImpl {
   File file() const {
     return file_;
   }
-  Flags flags() const {
+  ViewFlags flags() const {
     return flags_;
   }
   void *address() const {
@@ -66,7 +66,7 @@ class ViewImpl {
 
  private:
   File file_;
-  Flags flags_;
+  ViewFlags flags_;
   HANDLE handle_;
   void *address_;
   uint64_t offset_;
@@ -74,9 +74,9 @@ class ViewImpl {
 
   ViewImpl();
 
-  void map_on_memory(Flags flags, uint64_t size);
-  void map_on_file(const File &file, Flags flags, uint64_t offset,
-                   uint64_t size);
+  void map_on_memory(ViewFlags flags, uint64_t size);
+  void map_on_file(ViewFlags flags, const File &file,
+                   uint64_t offset, uint64_t size);
 
   ViewImpl(const ViewImpl &);
   ViewImpl &operator=(const ViewImpl &);

  Modified: lib/io/view.cpp (+32 -7)
===================================================================
--- lib/io/view.cpp    2012-12-06 18:19:24 +0900 (12e2258)
+++ lib/io/view.cpp    2012-12-06 18:43:19 +0900 (eec0fa1)
@@ -25,16 +25,41 @@
 namespace grnxx {
 namespace io {
 
+#define GRNXX_FLAGS_WRITE(flag) do { \
+  if (flags & flag) { \
+    if (!is_first) { \
+      builder << " | "; \
+    } \
+    builder << #flag; \
+    is_first = false; \
+  } \
+} while (false)
+
+StringBuilder &operator<<(StringBuilder &builder, ViewFlags flags) {
+  if (flags) {
+    bool is_first = true;
+    GRNXX_FLAGS_WRITE(VIEW_READ_ONLY);
+    GRNXX_FLAGS_WRITE(VIEW_WRITE_ONLY);
+    GRNXX_FLAGS_WRITE(VIEW_ANONYMOUS);
+    GRNXX_FLAGS_WRITE(VIEW_HUGE_TLB);
+    GRNXX_FLAGS_WRITE(VIEW_PRIVATE);
+    GRNXX_FLAGS_WRITE(VIEW_SHARED);
+    return builder;
+  } else {
+    return builder << "0";
+  }
+}
+
 View::View() : impl_() {}
 
-View::View(Flags flags, uint64_t size)
+View::View(ViewFlags flags, uint64_t size)
   : impl_(ViewImpl::map(flags, size)) {}
 
-View::View(const File &file, Flags flags)
-  : impl_(ViewImpl::map(file, flags)) {}
+View::View(ViewFlags flags, const File &file)
+  : impl_(ViewImpl::map(flags, file)) {}
 
-View::View(const File &file, Flags flags, uint64_t offset, uint64_t size)
-  : impl_(ViewImpl::map(file, flags, offset, size)) {}
+View::View(ViewFlags flags, const File &file, uint64_t offset, uint64_t size)
+  : impl_(ViewImpl::map(flags, file, offset, size)) {}
 
 View::~View() {}
 
@@ -69,8 +94,8 @@ File View::file() const {
   return impl_ ? impl_->file() : File();
 }
 
-Flags View::flags() const {
-  return impl_ ? impl_->flags() : Flags::none();
+ViewFlags View::flags() const {
+  return impl_ ? impl_->flags() : ViewFlags::none();
 }
 
 void *View::address() const {

  Modified: lib/io/view.hpp (+59 -12)
===================================================================
--- lib/io/view.hpp    2012-12-06 18:19:24 +0900 (f865cb2)
+++ lib/io/view.hpp    2012-12-06 18:43:19 +0900 (3c79758)
@@ -15,29 +15,62 @@
   License along with this library; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
-#ifndef GRNXX_IO_VIEW_HPP
-#define GRNXX_IO_VIEW_HPP
+#ifndef VIEW_VIEW_HPP
+#define VIEW_VIEW_HPP
 
 #include "file.hpp"
-#include "flags.hpp"
 
 namespace grnxx {
 namespace io {
 
+class ViewFlagsIdentifier {};
+typedef FlagsImpl<ViewFlagsIdentifier> ViewFlags;
+
+// VIEW_WRITE_ONLY is ignored if VIEW_READ_ONLY is enabled.
+// VIEW_READ_ONLY is disabled if VIEW_CREATE is specified.
+// If both flags are not set, and object is created/opened/mapped in
+// read-write mode.
+
+// Read-only mode.
+const ViewFlags VIEW_READ_ONLY  = ViewFlags::define(0x0001);
+// Write-only mode.
+const ViewFlags VIEW_WRITE_ONLY = ViewFlags::define(0x0002);
+
+// VIEW_ANONYMOUS disables all the flags other than GRNXX_HUGE_TLB and
+// enables VIEW_PRIVATE.
+// VIEW_CREATE disables VIEW_READ_ONLY.
+// VIEW_OPEN is enabled if VIEW_CREATE is not specified.
+// If both VIEW_CREATE and VIEW_OPEN are set, it first tries to create
+// an object and, if already exists, then tries to open the existing object.
+// VIEW_TEMPORARY disables other flags.
+
+// Anonymous mode.
+const ViewFlags VIEW_ANONYMOUS  = ViewFlags::define(0x0010);
+// Try to use huge pages.
+const ViewFlags VIEW_HUGE_TLB   = ViewFlags::define(0x0080);
+
+// VIEW_PRIVATE is ignored if VIEW_SHARED is enabled.
+
+// Private mode.
+const ViewFlags VIEW_PRIVATE    = ViewFlags::define(0x1000);
+// Shared mode.
+const ViewFlags VIEW_SHARED     = ViewFlags::define(0x2000);
+
+StringBuilder &operator<<(StringBuilder &builder, ViewFlags flags);
+
 class ViewImpl;
 
 class View {
  public:
   View();
-  // Create an anonymou memory mapping.
-  // Available flags are GRNXX_IO_HUGE_TLB only.
-  explicit View(Flags flags, uint64_t size);
+  // Create an anonymous memory mapping.
+  // Available flags are VIEW_HUGE_TLB only.
+  explicit View(ViewFlags flags, uint64_t size);
   // Create a file-backed memory mapping.
   // Available flags are as follows:
-  //  GRNXX_IO_READ_ONLY, GRNXX_IO_WRITE_ONLY, GRNXX_IO_SHARED,
-  //  GRNXX_IO_PRIVATE.
-  View(const File &file, Flags flags);
-  View(const File &file, Flags flags, uint64_t offset, uint64_t size);
+  //  VIEW_READ_ONLY, VIEW_WRITE_ONLY, VIEW_SHARED, VIEW_PRIVATE.
+  View(ViewFlags flags, const File &file);
+  View(ViewFlags flags, const File &file, uint64_t offset, uint64_t size);
   ~View();
 
   View(const View &view);
@@ -50,11 +83,25 @@ class View {
     return static_cast<bool>(impl_);
   }
 
+  void open(ViewFlags flags, uint64_t size) {
+    *this = View(flags, size);
+  }
+  void open(ViewFlags flags, const File &file) {
+    *this = View(flags, file);
+  }
+  void open(ViewFlags flags, const File &file,
+            uint64_t offset, uint64_t size) {
+    *this = View(flags, file, offset, size);
+  }
+  void close() {
+    *this = View();
+  }
+
   void sync();
   void sync(uint64_t offset, uint64_t size);
 
   File file() const;
-  Flags flags() const;
+  ViewFlags flags() const;
   void *address() const;
   uint64_t offset() const;
   uint64_t size() const;
@@ -78,4 +125,4 @@ inline StringBuilder &operator<<(StringBuilder &builder, const View &view) {
 }  // namespace io
 }  // namespace grnxx
 
-#endif  // GRNXX_IO_VIEW_HPP
+#endif  // VIEW_VIEW_HPP

  Modified: test/test_io_view.cpp (+10 -11)
===================================================================
--- test/test_io_view.cpp    2012-12-06 18:19:24 +0900 (741cdcc)
+++ test/test_io_view.cpp    2012-12-06 18:43:19 +0900 (dcf9f20)
@@ -26,13 +26,13 @@ void test_anonymous_mmap() {
   grnxx::io::View view;
   assert(!view);
 
-  view = grnxx::io::View(grnxx::io::Flags(), MMAP_SIZE);
+  view.open(grnxx::io::ViewFlags::none(), MMAP_SIZE);
 
   GRNXX_NOTICE() << "view = " << view;
 
   assert(view);
-  assert(view.flags() == (grnxx::io::GRNXX_IO_ANONYMOUS |
-                          grnxx::io::GRNXX_IO_PRIVATE));
+  assert(view.flags() == (grnxx::io::VIEW_ANONYMOUS |
+                          grnxx::io::VIEW_PRIVATE));
   assert(view.address() != nullptr);
   assert(view.offset() == 0);
   assert(view.size() == MMAP_SIZE);
@@ -51,12 +51,12 @@ void test_file_backed_mmap() {
   assert(file.size() == FILE_SIZE);
 
   // Create a memory mapping.
-  grnxx::io::View view(file, grnxx::io::GRNXX_IO_SHARED);
+  grnxx::io::View view(grnxx::io::VIEW_SHARED, file);
 
   GRNXX_NOTICE() << "view = " << view;
 
   assert(view);
-  assert(view.flags() == grnxx::io::GRNXX_IO_SHARED);
+  assert(view.flags() == grnxx::io::VIEW_SHARED);
   assert(view.address() != nullptr);
   assert(view.offset() == 0);
   assert(view.size() == FILE_SIZE);
@@ -64,12 +64,12 @@ void test_file_backed_mmap() {
   std::memset(view.address(), 'x', view.size());
 
   // Create a memory mapping.
-  view = grnxx::io::View(file, grnxx::io::GRNXX_IO_PRIVATE);
+  view.open(grnxx::io::VIEW_PRIVATE, file);
 
   GRNXX_NOTICE() << "view = " << view;
 
   assert(view);
-  assert(view.flags() == grnxx::io::GRNXX_IO_PRIVATE);
+  assert(view.flags() == grnxx::io::VIEW_PRIVATE);
   assert(view.address() != nullptr);
   assert(view.offset() == 0);
   assert(view.size() == FILE_SIZE);
@@ -80,14 +80,13 @@ void test_file_backed_mmap() {
   std::memset(view.address(), 'z', view.size());
 
   // Create a memory mapping.
-  view = grnxx::io::View(file, grnxx::io::GRNXX_IO_SHARED |
-                               grnxx::io::GRNXX_IO_PRIVATE,
-                         FILE_SIZE / 2, MMAP_SIZE);
+  view.open(grnxx::io::VIEW_SHARED | grnxx::io::VIEW_PRIVATE,
+            file, FILE_SIZE / 2, MMAP_SIZE);
 
   GRNXX_NOTICE() << "view = " << view;
 
   assert(view);
-  assert(view.flags() == grnxx::io::GRNXX_IO_SHARED);
+  assert(view.flags() == grnxx::io::VIEW_SHARED);
   assert(view.address() != nullptr);
   assert(view.offset() == (FILE_SIZE / 2));
   assert(view.size() == MMAP_SIZE);
-------------- next part --------------
HTML����������������������������...
ダウンロード 



More information about the Groonga-commit mailing list
アーカイブの一覧に戻る