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