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

Back to archive index

susumu.yata null+****@clear*****
Fri Feb 22 13:57:56 JST 2013


susumu.yata	2013-02-22 13:57:56 +0900 (Fri, 22 Feb 2013)

  New Revision: 73da3835d2911b1d6213d1ffc53e03390ac24b56
  https://github.com/groonga/grnxx/commit/73da3835d2911b1d6213d1ffc53e03390ac24b56

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

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

  Modified: lib/io/chunk.hpp (+6 -6)
===================================================================
--- lib/io/chunk.hpp    2013-02-22 13:46:29 +0900 (73eee9e)
+++ lib/io/chunk.hpp    2013-02-22 13:57:56 +0900 (8777677)
@@ -41,9 +41,9 @@ class Chunk {
  public:
   Chunk() : view_(), address_(nullptr) {}
 
-  Chunk &operator=(View &&view) {
-    view_ = std::move(view);
-    address_ = std::move(view_.address());
+  Chunk &operator=(View *view) {
+    view_.reset(view);
+    address_ = view->address();
     return *this;
   }
 
@@ -54,7 +54,7 @@ class Chunk {
 
   // Return the associated view of the chunk.
   const View &view() const {
-    return view_;
+    return *view_;
   }
   // Return the address of the chunk.
   void *address() const {
@@ -62,11 +62,11 @@ class Chunk {
   }
 
   StringBuilder &write_to(StringBuilder &builder) const {
-    return builder << view_;
+    return builder << *view_;
   }
 
  private:
-  View view_;
+  std::unique_ptr<View> view_;
   void *address_;
 
   Chunk(const Chunk &);

  Modified: lib/io/pool-impl.cpp (+9 -8)
===================================================================
--- lib/io/pool-impl.cpp    2013-02-22 13:46:29 +0900 (a29646c)
+++ lib/io/pool-impl.cpp    2013-02-22 13:57:56 +0900 (e975663)
@@ -363,10 +363,10 @@ void PoolImpl::open_regular_pool(PoolFlags flags, const char *path,
 void PoolImpl::setup_header(const PoolOptions &options) {
   if (files_[0]) {
     files_[0].resize(POOL_HEADER_CHUNK_SIZE);
-    header_chunk_ = View(get_view_flags(), files_[0],
-                         0, POOL_HEADER_CHUNK_SIZE);
+    header_chunk_ = View::open(get_view_flags(), files_[0],
+                               0, POOL_HEADER_CHUNK_SIZE);
   } else {
-    header_chunk_ = View(get_view_flags(), POOL_HEADER_CHUNK_SIZE);
+    header_chunk_ = View::open(get_view_flags(), POOL_HEADER_CHUNK_SIZE);
   }
   std::memset(header_chunk_.address(), 0, POOL_HEADER_CHUNK_SIZE);
   header_ = static_cast<PoolHeader *>(header_chunk_.address());
@@ -374,7 +374,8 @@ void PoolImpl::setup_header(const PoolOptions &options) {
 }
 
 void PoolImpl::check_header() {
-  header_chunk_ = View(get_view_flags(), files_[0], 0, POOL_HEADER_CHUNK_SIZE);
+  header_chunk_ = View::open(get_view_flags(), files_[0],
+                             0, POOL_HEADER_CHUNK_SIZE);
   header_ = static_cast<PoolHeader *>(header_chunk_.address());
 
   // TODO: Check the header.
@@ -420,9 +421,9 @@ void PoolImpl::mmap_block_info_chunk(uint16_t chunk_id) {
   block_info_chunks_[chunk_id] = mmap_chunk(chunk_info);
 }
 
-View PoolImpl::mmap_chunk(const ChunkInfo &chunk_info) {
+View *PoolImpl::mmap_chunk(const ChunkInfo &chunk_info) {
   if (flags_ & POOL_ANONYMOUS) {
-    return View(get_view_flags(), chunk_info.size());
+    return View::open(get_view_flags(), chunk_info.size());
   } else {
     File &file = files_[chunk_info.file_id()];
     if (!file) {
@@ -448,8 +449,8 @@ View PoolImpl::mmap_chunk(const ChunkInfo &chunk_info) {
       }
     }
 
-    return View(get_view_flags(), file,
-                chunk_info.offset(), chunk_info.size());
+    return View::open(get_view_flags(), file,
+                      chunk_info.offset(), chunk_info.size());
   }
 }
 

  Modified: lib/io/pool-impl.hpp (+2 -1)
===================================================================
--- lib/io/pool-impl.hpp    2013-02-22 13:46:29 +0900 (ba4bce1)
+++ lib/io/pool-impl.hpp    2013-02-22 13:57:56 +0900 (a70d3d9)
@@ -18,6 +18,7 @@
 #ifndef GRNXX_IO_POOL_IMPL_HPP
 #define GRNXX_IO_POOL_IMPL_HPP
 
+#include "file.hpp"
 #include "pool.hpp"
 
 namespace grnxx {
@@ -99,7 +100,7 @@ class PoolImpl {
 
   void mmap_block_chunk(uint16_t chunk_id);
   void mmap_block_info_chunk(uint16_t chunk_id);
-  View mmap_chunk(const ChunkInfo &chunk_info);
+  View *mmap_chunk(const ChunkInfo &chunk_info);
 
   ViewFlags get_view_flags() const;
 

  Modified: lib/io/view-posix.cpp (+17 -25)
===================================================================
--- lib/io/view-posix.cpp    2013-02-22 13:46:29 +0900 (4b4bd68)
+++ lib/io/view-posix.cpp    2013-02-22 13:57:56 +0900 (a90bd47)
@@ -25,6 +25,7 @@
 #include "../error.hpp"
 #include "../exception.hpp"
 #include "../logger.hpp"
+#include "file.hpp"
 
 #ifndef MAP_ANONYMOUS
 # ifdef MAP_ANON
@@ -44,35 +45,35 @@ ViewImpl::~ViewImpl() {
   }
 }
 
-std::unique_ptr<ViewImpl> ViewImpl::map(ViewFlags flags, uint64_t size) {
+ViewImpl *ViewImpl::open(ViewFlags flags, 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_memory(flags, size);
-  return view;
+  view->open_view(flags, size);
+  return view.release();
 }
 
-std::unique_ptr<ViewImpl> ViewImpl::map(ViewFlags flags, const File &file) {
+ViewImpl *ViewImpl::open(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(flags, file, 0, file.size());
-  return view;
+  view->open_view(flags, file, 0, file.size());
+  return view.release();
 }
 
-std::unique_ptr<ViewImpl> ViewImpl::map(ViewFlags flags, const File &file,
-                                        uint64_t offset, uint64_t size) {
+ViewImpl *ViewImpl::open(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(flags, file, offset, size);
-  return view;
+  view->open_view(flags, file, offset, size);
+  return view.release();
 }
 
 void ViewImpl::sync() {
@@ -97,13 +98,12 @@ void ViewImpl::sync(uint64_t offset, uint64_t size) {
 }
 
 ViewImpl::ViewImpl()
-  : file_(), flags_(ViewFlags::none()),
-    address_(MAP_FAILED), offset_(0), size_(0) {}
+  : flags_(ViewFlags::none()), address_(MAP_FAILED), size_(0) {}
 
 #ifdef MAP_HUGETLB
-void ViewImpl::map_on_memory(ViewFlags flags, uint64_t size) {
+void ViewImpl::open_view(ViewFlags flags, uint64_t size) {
 #else  // MAP_HUGETLB
-void ViewImpl::map_on_memory(ViewFlags, uint64_t size) {
+void ViewImpl::open_view(ViewFlags, uint64_t size) {
 #endif  // MAP_HUGETLB
   if ((size == 0) || (size > std::numeric_limits<size_t>::max())) {
     GRNXX_ERROR() << "invalid argument: size = " << size << ": (0, "
@@ -135,8 +135,8 @@ void ViewImpl::map_on_memory(ViewFlags, uint64_t size) {
   }
 }
 
-void ViewImpl::map_on_file(ViewFlags flags, const File &file,
-                           uint64_t offset, uint64_t size) {
+void ViewImpl::open_view(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() << ']';
@@ -148,8 +148,6 @@ void ViewImpl::map_on_file(ViewFlags flags, const File &file,
     GRNXX_THROW();
   }
 
-  file_ = file;
-  offset_ = offset;
   size_ = size;
 
   int protection_flags = PROT_READ | PROT_WRITE;
@@ -187,14 +185,8 @@ StringBuilder &ViewImpl::write_to(StringBuilder &builder) const {
     return builder;
   }
 
-  if (file_) {
-    builder << "{ file = " << file_.path();
-  } else {
-    builder << "{ file = n/a";
-  }
-  return builder << ", flags = " << flags_
+  return builder << "{ flags = " << flags_
                  << ", address = " << address_
-                 << ", offset = " << offset_
                  << ", size = " << size_ << " }";
 }
 

  Modified: lib/io/view-posix.hpp (+8 -16)
===================================================================
--- lib/io/view-posix.hpp    2013-02-22 13:46:29 +0900 (afcc126)
+++ lib/io/view-posix.hpp    2013-02-22 13:57:56 +0900 (89e55df)
@@ -25,30 +25,24 @@
 namespace grnxx {
 namespace io {
 
-class ViewImpl {
+class ViewImpl : public View {
  public:
   ~ViewImpl();
 
-  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);
+  static ViewImpl *open(ViewFlags flags, uint64_t size);
+  static ViewImpl *open(ViewFlags flags, const File &file);
+  static ViewImpl *open(ViewFlags flags, const File &file,
+                        uint64_t offset, uint64_t size);
 
   void sync();
   void sync(uint64_t offset, uint64_t size);
 
-  File file() const {
-    return file_;
-  }
   ViewFlags flags() const {
     return flags_;
   }
   void *address() const {
     return address_;
   }
-  uint64_t offset() const {
-    return offset_;
-  }
   uint64_t size() const {
     return size_;
   }
@@ -56,17 +50,15 @@ class ViewImpl {
   StringBuilder &write_to(StringBuilder &builder) const;
 
  private:
-  File file_;
   ViewFlags flags_;
   void *address_;
-  uint64_t offset_;
   uint64_t size_;
 
   ViewImpl();
 
-  void map_on_memory(ViewFlags flags, uint64_t size);
-  void map_on_file(ViewFlags flags, const File &file,
-                   uint64_t offset, uint64_t size);
+  void open_view(ViewFlags flags, uint64_t size);
+  void open_view(ViewFlags flags, const File &file,
+                 uint64_t offset, uint64_t size);
 
   ViewImpl(const ViewImpl &);
   ViewImpl &operator=(const ViewImpl &);

  Modified: lib/io/view.cpp (+8 -60)
===================================================================
--- lib/io/view.cpp    2013-02-22 13:46:29 +0900 (1e49e30)
+++ lib/io/view.cpp    2013-02-22 13:57:56 +0900 (85abad0)
@@ -59,72 +59,20 @@ std::ostream &operator<<(std::ostream &stream, ViewFlags flags) {
   return stream.write(builder.c_str(), builder.length());
 }
 
-View::View() : impl_() {}
-
-View::View(ViewFlags flags, uint64_t size)
-  : impl_(ViewImpl::map(flags, size)) {}
-
-View::View(ViewFlags flags, const File &file)
-  : impl_(ViewImpl::map(flags, file)) {}
-
-View::View(ViewFlags flags, const File &file, uint64_t offset, uint64_t size)
-  : impl_(ViewImpl::map(flags, file, offset, size)) {}
-
+View::View() {}
 View::~View() {}
 
-View::View(const View &view) : impl_(view.impl_) {}
-
-View &View::operator=(const View &view) {
-  impl_ = view.impl_;
-  return *this;
-}
-
-View::View(View &&view)
-  : impl_(std::move(view.impl_)) {}
-
-View &View::operator=(View &&view) {
-  impl_ = std::move(view.impl_);
-  return *this;
-}
-
-void View::sync() {
-  if (impl_) {
-    impl_->sync();
-  }
-}
-
-void View::sync(uint64_t offset, uint64_t size) {
-  if (impl_) {
-    impl_->sync(offset, size);
-  }
-}
-
-File View::file() const {
-  return impl_ ? impl_->file() : File();
-}
-
-ViewFlags View::flags() const {
-  return impl_ ? impl_->flags() : ViewFlags::none();
-}
-
-void *View::address() const {
-  return impl_ ? impl_->address() : nullptr;
-}
-
-uint64_t View::offset() const {
-  return impl_ ? impl_->offset() : 0;
-}
-
-uint64_t View::size() const {
-  return impl_ ? impl_->size() : 0;
+View *View::open(ViewFlags flags, uint64_t size) {
+  return ViewImpl::open(flags, size);
 }
 
-void View::swap(View &view) {
-  impl_.swap(view.impl_);
+View *View::open(ViewFlags flags, const File &file) {
+  return ViewImpl::open(flags, file);
 }
 
-StringBuilder &View::write_to(StringBuilder &builder) const {
-  return impl_ ? impl_->write_to(builder) : (builder << "n/a");
+View *View::open(ViewFlags flags, const File &file,
+                 uint64_t offset, uint64_t size) {
+  return ViewImpl::open(flags, file, offset, size);
 }
 
 }  // namespace io

  Modified: lib/io/view.hpp (+18 -50)
===================================================================
--- lib/io/view.hpp    2013-02-22 13:46:29 +0900 (0f76f66)
+++ lib/io/view.hpp    2013-02-22 13:57:56 +0900 (636b844)
@@ -18,7 +18,8 @@
 #ifndef GRNXX_IO_VIEW_HPP
 #define GRNXX_IO_VIEW_HPP
 
-#include "file.hpp"
+#include "../basic.hpp"
+#include "../string_builder.hpp"
 
 namespace grnxx {
 namespace io {
@@ -54,65 +55,32 @@ constexpr ViewFlags VIEW_SHARED     = ViewFlags::define(0x2000);
 StringBuilder &operator<<(StringBuilder &builder, ViewFlags flags);
 std::ostream &operator<<(std::ostream &builder, ViewFlags flags);
 
-class ViewImpl;
+class File;
 
 class View {
  public:
   View();
+  virtual ~View();
+
   // Create an anonymous memory mapping.
   // Available flags are VIEW_HUGE_TLB only.
-  explicit View(ViewFlags flags, uint64_t size);
+  static View *open(ViewFlags flags, uint64_t size);
   // Create a file-backed memory mapping.
   // Available flags are as follows:
   //  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);
-  View &operator=(const View &view);
-
-  View(View &&view);
-  View &operator=(View &&view);
-
-  explicit operator bool() const {
-    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;
-  ViewFlags flags() const;
-  void *address() const;
-  uint64_t offset() const;
-  uint64_t size() const;
-
-  void swap(View &view);
-
-  StringBuilder &write_to(StringBuilder &builder) const;
-
- private:
-  std::shared_ptr<ViewImpl> impl_;
-};
+  static View *open(ViewFlags flags, const File &file);
+  static View *open(ViewFlags flags, const File &file,
+                    uint64_t offset, uint64_t size);
 
-inline void swap(View &lhs, View &rhs) {
-  lhs.swap(rhs);
-}
+  virtual void sync() = 0;
+  virtual void sync(uint64_t offset, uint64_t size) = 0;
+
+  virtual ViewFlags flags() const = 0;
+  virtual void *address() const = 0;
+  virtual uint64_t size() const = 0;
+
+  virtual StringBuilder &write_to(StringBuilder &builder) const = 0;
+};
 
 inline StringBuilder &operator<<(StringBuilder &builder, const View &view) {
   return view.write_to(builder);

  Modified: test/test_io_view.cpp (+43 -41)
===================================================================
--- test/test_io_view.cpp    2013-02-22 13:46:29 +0900 (dcf9f20)
+++ test/test_io_view.cpp    2013-02-22 13:57:56 +0900 (b7cd474)
@@ -18,26 +18,27 @@
 #include <cassert>
 
 #include "logger.hpp"
+#include "io/file.hpp"
 #include "io/view.hpp"
 
 void test_anonymous_mmap() {
   const std::uint64_t MMAP_SIZE = 1 << 20;
 
-  grnxx::io::View view;
-  assert(!view);
-
-  view.open(grnxx::io::ViewFlags::none(), MMAP_SIZE);
+  // Create an anonymous memory mapping.
+  std::unique_ptr<grnxx::io::View> view(
+      grnxx::io::View::open(grnxx::io::ViewFlags::none(), MMAP_SIZE));
+  assert(view);
 
-  GRNXX_NOTICE() << "view = " << view;
+  GRNXX_NOTICE() << "view = " << *view;
 
-  assert(view);
-  assert(view.flags() == (grnxx::io::VIEW_ANONYMOUS |
+  // Check members of the view.
+  assert(view->flags() == (grnxx::io::VIEW_ANONYMOUS |
                           grnxx::io::VIEW_PRIVATE));
-  assert(view.address() != nullptr);
-  assert(view.offset() == 0);
-  assert(view.size() == MMAP_SIZE);
+  assert(view->address() != nullptr);
+  assert(view->size() == MMAP_SIZE);
 
-  std::memset(view.address(), 0, view.size());
+  // Fill the mapping with 0.
+  std::memset(view->address(), 0, view->size());
 }
 
 void test_file_backed_mmap() {
@@ -45,54 +46,55 @@ void test_file_backed_mmap() {
   const std::uint64_t FILE_SIZE = 1 << 24;
   const std::uint64_t MMAP_SIZE = 1 << 20;
 
+  // Create a file of "FILE_SIZE" bytes.
   grnxx::io::File file(grnxx::io::FILE_TEMPORARY, FILE_PATH);
-
   file.resize(FILE_SIZE);
   assert(file.size() == FILE_SIZE);
 
-  // Create a memory mapping.
-  grnxx::io::View view(grnxx::io::VIEW_SHARED, file);
-
-  GRNXX_NOTICE() << "view = " << view;
-
+  // Create a memory mapping on "file".
+  std::unique_ptr<grnxx::io::View> view(
+      grnxx::io::View::open(grnxx::io::VIEW_SHARED, file));
   assert(view);
-  assert(view.flags() == grnxx::io::VIEW_SHARED);
-  assert(view.address() != nullptr);
-  assert(view.offset() == 0);
-  assert(view.size() == FILE_SIZE);
 
-  std::memset(view.address(), 'x', view.size());
+  GRNXX_NOTICE() << "view = " << *view;
 
-  // Create a memory mapping.
-  view.open(grnxx::io::VIEW_PRIVATE, file);
+  assert(view->flags() == grnxx::io::VIEW_SHARED);
+  assert(view->address() != nullptr);
+  assert(view->size() == FILE_SIZE);
 
-  GRNXX_NOTICE() << "view = " << view;
+  std::memset(view->address(), 'x', view->size());
 
+  // Recreate a memory mapping on "file".
+  view.reset();
+  view.reset(grnxx::io::View::open(grnxx::io::VIEW_PRIVATE, file));
   assert(view);
-  assert(view.flags() == grnxx::io::VIEW_PRIVATE);
-  assert(view.address() != nullptr);
-  assert(view.offset() == 0);
-  assert(view.size() == FILE_SIZE);
+
+  GRNXX_NOTICE() << "view = " << *view;
+
+  assert(view->flags() == grnxx::io::VIEW_PRIVATE);
+  assert(view->address() != nullptr);
+  assert(view->size() == FILE_SIZE);
 
   for (std::uint64_t i = 0; i < FILE_SIZE; ++i) {
-    assert(static_cast<const char *>(view.address())[i] == 'x');
+    assert(static_cast<const char *>(view->address())[i] == 'x');
   }
-  std::memset(view.address(), 'z', view.size());
+  std::memset(view->address(), 'z', view->size());
 
-  // Create a memory mapping.
-  view.open(grnxx::io::VIEW_SHARED | grnxx::io::VIEW_PRIVATE,
-            file, FILE_SIZE / 2, MMAP_SIZE);
+  // Create a memory mapping on a part of "file".
+  view.reset();
+  view.reset(grnxx::io::View::open(grnxx::io::VIEW_SHARED |
+                                   grnxx::io::VIEW_PRIVATE,
+                                   file, FILE_SIZE / 2, MMAP_SIZE));
+  assert(view);
 
-  GRNXX_NOTICE() << "view = " << view;
+  GRNXX_NOTICE() << "view = " << *view;
 
-  assert(view);
-  assert(view.flags() == grnxx::io::VIEW_SHARED);
-  assert(view.address() != nullptr);
-  assert(view.offset() == (FILE_SIZE / 2));
-  assert(view.size() == MMAP_SIZE);
+  assert(view->flags() == grnxx::io::VIEW_SHARED);
+  assert(view->address() != nullptr);
+  assert(view->size() == MMAP_SIZE);
 
   for (std::uint64_t i = 0; i < MMAP_SIZE; ++i) {
-    assert(static_cast<const char *>(view.address())[i] == 'x');
+    assert(static_cast<const char *>(view->address())[i] == 'x');
   }
 }
 
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index