susumu.yata
null+****@clear*****
Thu Dec 6 20:37:22 JST 2012
susumu.yata 2012-12-06 20:37:22 +0900 (Thu, 06 Dec 2012) New Revision: ea87f1d5e62a6596285b69ec4e4b8ff77688ad36 https://github.com/groonga/grnxx/commit/ea87f1d5e62a6596285b69ec4e4b8ff77688ad36 Log: Update the interface of grnxx::io::Pool. Removed files: lib/io/flags.cpp lib/io/flags.hpp Modified files: lib/io/Makefile.am lib/io/file.hpp lib/io/pool-impl.cpp lib/io/pool-impl.hpp lib/io/pool.cpp lib/io/pool.hpp lib/io/view.hpp test/test_alpha_blob_vector.cpp test/test_alpha_vector.cpp test/test_db_array.cpp test/test_db_blob_vector.cpp test/test_db_vector.cpp test/test_io_pool.cpp Modified: lib/io/Makefile.am (+0 -2) =================================================================== --- lib/io/Makefile.am 2012-12-06 20:04:32 +0900 (8aae1d7) +++ lib/io/Makefile.am 2012-12-06 20:37:22 +0900 (209a5e1) @@ -8,7 +8,6 @@ libgrnxx_io_la_SOURCES = \ file.cpp \ file_info.cpp \ file_info-impl.cpp \ - flags.cpp \ path.cpp \ pool.cpp \ pool-impl.cpp \ @@ -25,7 +24,6 @@ libgrnxx_io_include_HEADERS = \ file.hpp \ file_info.hpp \ file_info-impl.hpp \ - flags.hpp \ path.hpp \ pool.hpp \ pool-impl.hpp \ Modified: lib/io/file.hpp (+3 -3) =================================================================== --- lib/io/file.hpp 2012-12-06 20:04:32 +0900 (030791d) +++ lib/io/file.hpp 2012-12-06 20:37:22 +0900 (b400976) @@ -15,8 +15,8 @@ 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 FILE_FILE_HPP -#define FILE_FILE_HPP +#ifndef GRNXX_IO_FILE_HPP +#define GRNXX_IO_FILE_HPP #include "../duration.hpp" @@ -162,4 +162,4 @@ inline StringBuilder &operator<<(StringBuilder &builder, const File &file) { } // namespace io } // namespace grnxx -#endif // FILE_FILE_HPP +#endif // GRNXX_IO_FILE_HPP Deleted: lib/io/flags.cpp (+0 -63) 100644 =================================================================== --- lib/io/flags.cpp 2012-12-06 20:04:32 +0900 (13b2930) +++ /dev/null @@ -1,63 +0,0 @@ -/* - Copyright (C) 2012 Brazil, Inc. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ -#include "flags.hpp" - -#include <ostream> - -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, Flags flags) { - if (flags) { - bool is_first = true; - GRNXX_FLAGS_WRITE(GRNXX_IO_READ_ONLY); - GRNXX_FLAGS_WRITE(GRNXX_IO_WRITE_ONLY); - GRNXX_FLAGS_WRITE(GRNXX_IO_ANONYMOUS); - GRNXX_FLAGS_WRITE(GRNXX_IO_APPEND); - GRNXX_FLAGS_WRITE(GRNXX_IO_CREATE); - GRNXX_FLAGS_WRITE(GRNXX_IO_HUGE_TLB); - GRNXX_FLAGS_WRITE(GRNXX_IO_OPEN); - GRNXX_FLAGS_WRITE(GRNXX_IO_TEMPORARY); - GRNXX_FLAGS_WRITE(GRNXX_IO_TRUNCATE); - GRNXX_FLAGS_WRITE(GRNXX_IO_PRIVATE); - GRNXX_FLAGS_WRITE(GRNXX_IO_SHARED); - return builder; - } else { - return builder << "0"; - } -} - -std::ostream &operator<<(std::ostream &stream, Flags flags) { - char buf[256]; - StringBuilder builder(buf); - builder << flags; - return stream.write(builder.c_str(), builder.length()); -} - -} // namespace io -} // namespace grnxx Deleted: lib/io/flags.hpp (+0 -83) 100644 =================================================================== --- lib/io/flags.hpp 2012-12-06 20:04:32 +0900 (146f390) +++ /dev/null @@ -1,83 +0,0 @@ -/* - Copyright (C) 2012 Brazil, Inc. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - 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_FLAGS_HPP -#define GRNXX_IO_FLAGS_HPP - -#include "../string_builder.hpp" - -namespace grnxx { -namespace io { - -class FlagsIdentifier {}; -typedef FlagsImpl<FlagsIdentifier> Flags; - -// GRNXX_IO_WRITE_ONLY is ignored if GRNXX_IO_READ_ONLY is enabled. -// GRNXX_IO_READ_ONLY is disabled if GRNXX_IO_CREATE is specified. -// If both flags are not set, and object is created/opened/mapped in -// read-write mode. - -// Read-only mode. -const Flags GRNXX_IO_READ_ONLY = Flags::define(0x0001); -// Write-only mode. -const Flags GRNXX_IO_WRITE_ONLY = Flags::define(0x0002); - -// GRNXX_IO_ANONYMOUS disables all the flags other than GRNXX_HUGE_TLB and -// enables GRNXX_IO_PRIVATE. -// GRNXX_IO_APPEND is ignored if GRNXX_IO_READ_ONLY is enabled. -// GRNXX_IO_CREATE disables GRNXX_IO_READ_ONLY. -// GRNXX_IO_OPEN is enabled if GRNXX_IO_CREATE is not specified. -// If both GRNXX_IO_CREATE and GRNXX_IO_OPEN are set, it first tries to create -// an object and, if already exists, then tries to open the existing object. -// GRNXX_IO_TEMPORARY disables other flags. - -// Anonymous (non-file-backed) mode. -const Flags GRNXX_IO_ANONYMOUS = Flags::define(0x0010); -// Append mode. -const Flags GRNXX_IO_APPEND = Flags::define(0x0020); -// Create an object if it does not exist. -const Flags GRNXX_IO_CREATE = Flags::define(0x0040); -// Try to use huge pages. -const Flags GRNXX_IO_HUGE_TLB = Flags::define(0x0080); -// Open an existing object. -const Flags GRNXX_IO_OPEN = Flags::define(0x0100); -// Create a temporary object. -const Flags GRNXX_IO_TEMPORARY = Flags::define(0x0200); -// Truncate an existing object. -const Flags GRNXX_IO_TRUNCATE = Flags::define(0x0400); - -// GRNXX_IO_PRIVATE is ignored if GRNXX_IO_SHARED is enabled. - -// Private mode. -const Flags GRNXX_IO_PRIVATE = Flags::define(0x1000); -// Shared mode. -const Flags GRNXX_IO_SHARED = Flags::define(0x2000); - -StringBuilder &operator<<(StringBuilder &builder, Flags flags); - -std::ostream &operator<<(std::ostream &stream, Flags flags); - -// One of these modes must be specified. -enum LockMode { - GRNXX_IO_EXCLUSIVE_LOCK = 0x10000, // Create an exclusive lock. - GRNXX_IO_SHARED_LOCK = 0x20000 // Create a shared lock. -}; - -} // namespace io -} // namespace grnxx - -#endif // GRNXX_IO_FLAGS_HPP Modified: lib/io/pool-impl.cpp (+31 -30) =================================================================== --- lib/io/pool-impl.cpp 2012-12-06 20:04:32 +0900 (06823c0) +++ lib/io/pool-impl.cpp 2012-12-06 20:37:22 +0900 (a29646c) @@ -32,7 +32,7 @@ namespace io { PoolImpl::~PoolImpl() {} -std::unique_ptr<PoolImpl> PoolImpl::open(const char *path, Flags flags, +std::unique_ptr<PoolImpl> PoolImpl::open(PoolFlags flags, const char *path, const PoolOptions &options) { std::unique_ptr<PoolImpl> pool(new (std::nothrow) PoolImpl); if (!pool) { @@ -40,19 +40,19 @@ std::unique_ptr<PoolImpl> PoolImpl::open(const char *path, Flags flags, GRNXX_THROW(); } - if (flags & GRNXX_IO_ANONYMOUS) { + if (flags & POOL_ANONYMOUS) { pool->open_anonymous_pool(flags, options); - } else if (flags & GRNXX_IO_TEMPORARY) { - pool->open_temporary_pool(path, flags, options); + } else if (flags & POOL_TEMPORARY) { + pool->open_temporary_pool(flags, path, options); } else { - pool->open_regular_pool(path, flags, options); + pool->open_regular_pool(flags, path, options); } return pool; } BlockInfo *PoolImpl::create_block(uint64_t size) { - if (flags_ & GRNXX_IO_READ_ONLY) { + if (flags_ & POOL_READ_ONLY) { GRNXX_ERROR() << "invalid operation: flags = " << flags_; GRNXX_THROW(); } @@ -112,7 +112,7 @@ BlockInfo *PoolImpl::get_block_info(uint32_t block_id) { } void PoolImpl::free_block(BlockInfo *block_info) { - if (flags_ & GRNXX_IO_READ_ONLY) { + if (flags_ & POOL_READ_ONLY) { GRNXX_ERROR() << "invalid operation: flags = " << flags_; GRNXX_THROW(); } @@ -234,7 +234,7 @@ void PoolImpl::unlink(const char *path) { std::vector<String> paths; try { - std::unique_ptr<PoolImpl> pool = PoolImpl::open(path, GRNXX_IO_READ_ONLY); + std::unique_ptr<PoolImpl> pool = PoolImpl::open(POOL_READ_ONLY, path); const PoolOptions &options = pool->options(); const PoolHeader &header = pool->header(); const uint16_t max_file_id = static_cast<uint16_t>( @@ -268,7 +268,7 @@ bool PoolImpl::unlink_if_exists(const char *path) { PoolImpl::PoolImpl() : path_(), - flags_(Flags::none()), + flags_(PoolFlags::none()), header_(nullptr), files_(), header_chunk_(), @@ -276,23 +276,24 @@ PoolImpl::PoolImpl() block_info_chunks_(), inter_thread_chunk_mutex_(MUTEX_UNLOCKED) {} -void PoolImpl::open_anonymous_pool(Flags flags, const PoolOptions &options) { - flags_ = GRNXX_IO_ANONYMOUS; - if (flags & GRNXX_IO_HUGE_TLB) { - flags_ |= GRNXX_IO_HUGE_TLB; +void PoolImpl::open_anonymous_pool(PoolFlags flags, + const PoolOptions &options) { + flags_ = POOL_ANONYMOUS; + if (flags & POOL_HUGE_TLB) { + flags_ |= POOL_HUGE_TLB; } setup_header(options); } -void PoolImpl::open_temporary_pool(const char *path, Flags, +void PoolImpl::open_temporary_pool(PoolFlags, const char *path, const PoolOptions &options) { path_ = Path::full_path(path); - flags_ = GRNXX_IO_TEMPORARY; + flags_ = POOL_TEMPORARY; files_[0].open(FILE_TEMPORARY, path_.c_str()); setup_header(options); } -void PoolImpl::open_regular_pool(const char *path, Flags flags, +void PoolImpl::open_regular_pool(PoolFlags flags, const char *path, const PoolOptions &options) { if (!path) { GRNXX_ERROR() << "invalid argument: path = " << path; @@ -301,22 +302,22 @@ void PoolImpl::open_regular_pool(const char *path, Flags flags, path_ = Path::full_path(path); FileFlags file_flags = FileFlags::none(); - if ((~flags & GRNXX_IO_CREATE) && (flags & GRNXX_IO_READ_ONLY)) { - flags_ |= GRNXX_IO_READ_ONLY; + if ((~flags & POOL_CREATE) && (flags & POOL_READ_ONLY)) { + flags_ |= POOL_READ_ONLY; file_flags |= FILE_READ_ONLY; } - if (flags & GRNXX_IO_CREATE) { - flags_ |= GRNXX_IO_CREATE; + if (flags & POOL_CREATE) { + flags_ |= POOL_CREATE; file_flags |= FILE_CREATE; } - if ((~flags & GRNXX_IO_CREATE) || flags & GRNXX_IO_OPEN) { - flags_ |= GRNXX_IO_OPEN; + if ((~flags & POOL_CREATE) || flags & POOL_OPEN) { + flags_ |= POOL_OPEN; file_flags |= FILE_OPEN; } files_[0].open(file_flags, path_.c_str()); files_[0].set_unlink_at_close(true); - if (flags & GRNXX_IO_CREATE) { + if (flags & POOL_CREATE) { if (files_[0].size() == 0) { if (files_[0].lock(FILE_LOCK_EXCLUSIVE, Duration::seconds(10))) { if (files_[0].size() == 0) { @@ -336,7 +337,7 @@ void PoolImpl::open_regular_pool(const char *path, Flags flags, } if (!header_) { - if ((flags & GRNXX_IO_OPEN) || (~flags & GRNXX_IO_CREATE)) { + if ((flags & POOL_OPEN) || (~flags & POOL_CREATE)) { const Time start_time = Time::now(); while ((Time::now() - start_time) < Duration::seconds(10)) { if (files_[0].size() != 0) { @@ -420,15 +421,15 @@ void PoolImpl::mmap_block_info_chunk(uint16_t chunk_id) { } View PoolImpl::mmap_chunk(const ChunkInfo &chunk_info) { - if (flags_ & GRNXX_IO_ANONYMOUS) { + if (flags_ & POOL_ANONYMOUS) { return View(get_view_flags(), chunk_info.size()); } else { File &file = files_[chunk_info.file_id()]; if (!file) { FileFlags file_flags = FILE_CREATE_OR_OPEN; - if (flags_ & GRNXX_IO_TEMPORARY) { + if (flags_ & POOL_TEMPORARY) { file_flags = FILE_TEMPORARY; - } else if (flags_ & GRNXX_IO_READ_ONLY) { + } else if (flags_ & POOL_READ_ONLY) { file_flags = FILE_READ_ONLY; } const String &path = generate_path(chunk_info.file_id()); @@ -453,11 +454,11 @@ View PoolImpl::mmap_chunk(const ChunkInfo &chunk_info) { } ViewFlags PoolImpl::get_view_flags() const { - if (flags_ & GRNXX_IO_ANONYMOUS) { - return (flags_ & GRNXX_IO_HUGE_TLB) ? VIEW_HUGE_TLB : ViewFlags::none(); + if (flags_ & POOL_ANONYMOUS) { + return (flags_ & POOL_HUGE_TLB) ? VIEW_HUGE_TLB : ViewFlags::none(); } else { ViewFlags view_flags = VIEW_SHARED; - if (flags_ & GRNXX_IO_READ_ONLY) { + if (flags_ & POOL_READ_ONLY) { view_flags |= VIEW_READ_ONLY; } return view_flags; Modified: lib/io/pool-impl.hpp (+6 -6) =================================================================== --- lib/io/pool-impl.hpp 2012-12-06 20:04:32 +0900 (ec28c32) +++ lib/io/pool-impl.hpp 2012-12-06 20:37:22 +0900 (ba4bce1) @@ -28,7 +28,7 @@ class PoolImpl { ~PoolImpl(); static std::unique_ptr<PoolImpl> open( - const char *path, Flags flags, + PoolFlags flags, const char *path, const PoolOptions &options = PoolOptions()); BlockInfo *create_block(uint64_t size); @@ -57,7 +57,7 @@ class PoolImpl { String path() const { return path_; } - Flags flags() const { + PoolFlags flags() const { return flags_; } const PoolOptions &options() const { @@ -78,7 +78,7 @@ class PoolImpl { private: String path_; - Flags flags_; + PoolFlags flags_; PoolHeader *header_; File files_[POOL_MAX_NUM_FILES]; Chunk header_chunk_; @@ -88,10 +88,10 @@ class PoolImpl { PoolImpl(); - void open_anonymous_pool(Flags flags, const PoolOptions &options); - void open_temporary_pool(const char *path, Flags flags, + void open_anonymous_pool(PoolFlags flags, const PoolOptions &options); + void open_temporary_pool(PoolFlags flags, const char *path, const PoolOptions &options); - void open_regular_pool(const char *path, Flags flags, + void open_regular_pool(PoolFlags flags, const char *path, const PoolOptions &options); void setup_header(const PoolOptions &options); Modified: lib/io/pool.cpp (+41 -16) =================================================================== --- lib/io/pool.cpp 2012-12-06 20:04:32 +0900 (d6bddcb) +++ lib/io/pool.cpp 2012-12-06 20:37:22 +0900 (80fe107) @@ -23,6 +23,31 @@ 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, PoolFlags flags) { + if (flags) { + bool is_first = true; + GRNXX_FLAGS_WRITE(POOL_READ_ONLY); + GRNXX_FLAGS_WRITE(POOL_ANONYMOUS); + GRNXX_FLAGS_WRITE(POOL_CREATE); + GRNXX_FLAGS_WRITE(POOL_HUGE_TLB); + GRNXX_FLAGS_WRITE(POOL_OPEN); + GRNXX_FLAGS_WRITE(POOL_TEMPORARY); + return builder; + } else { + return builder << "0"; + } +} + PoolOptions::PoolOptions() : max_block_size_(0), min_block_chunk_size_(0), @@ -227,8 +252,8 @@ StringBuilder &PoolHeader::write_to(StringBuilder &builder) const { Pool::Pool() : impl_() {} -Pool::Pool(const char *path, Flags flags, const PoolOptions &options) - : impl_(PoolImpl::open(path, flags, options)) {} +Pool::Pool(PoolFlags flags, const char *path, const PoolOptions &options) + : impl_(PoolImpl::open(flags, path, options)) {} Pool::~Pool() {} @@ -246,7 +271,7 @@ Pool &Pool::operator=(Pool &&pool) { return *this; } -#define GRNXX_IO_POOL_THROW_IF_IMPL_IS_INVALID() do {\ +#define POOL_POOL_THROW_IF_IMPL_IS_INVALID() do {\ if (!impl_) {\ GRNXX_ERROR() << "invalid instance: pool = " << *this;\ GRNXX_THROW();\ @@ -254,61 +279,61 @@ Pool &Pool::operator=(Pool &&pool) { } while (false) const BlockInfo *Pool::create_block(uint64_t size) { - GRNXX_IO_POOL_THROW_IF_IMPL_IS_INVALID(); + POOL_POOL_THROW_IF_IMPL_IS_INVALID(); return impl_->create_block(size); } const BlockInfo *Pool::get_block_info(uint32_t block_id) { - GRNXX_IO_POOL_THROW_IF_IMPL_IS_INVALID(); + POOL_POOL_THROW_IF_IMPL_IS_INVALID(); return impl_->get_block_info(block_id); } void *Pool::get_block_address(uint32_t block_id) { - GRNXX_IO_POOL_THROW_IF_IMPL_IS_INVALID(); + POOL_POOL_THROW_IF_IMPL_IS_INVALID(); return impl_->get_block_address(block_id); } void *Pool::get_block_address(const BlockInfo &block_info) { - GRNXX_IO_POOL_THROW_IF_IMPL_IS_INVALID(); + POOL_POOL_THROW_IF_IMPL_IS_INVALID(); return impl_->get_block_address(block_info); } void Pool::free_block(uint32_t block_id) { - GRNXX_IO_POOL_THROW_IF_IMPL_IS_INVALID(); + POOL_POOL_THROW_IF_IMPL_IS_INVALID(); return impl_->free_block(block_id); } void Pool::free_block(const BlockInfo &block_info) { - GRNXX_IO_POOL_THROW_IF_IMPL_IS_INVALID(); + POOL_POOL_THROW_IF_IMPL_IS_INVALID(); return impl_->free_block(block_info); } String Pool::path() const { - GRNXX_IO_POOL_THROW_IF_IMPL_IS_INVALID(); + POOL_POOL_THROW_IF_IMPL_IS_INVALID(); return impl_->path(); } -Flags Pool::flags() const { - GRNXX_IO_POOL_THROW_IF_IMPL_IS_INVALID(); +PoolFlags Pool::flags() const { + POOL_POOL_THROW_IF_IMPL_IS_INVALID(); return impl_->flags(); } const PoolOptions &Pool::options() const { - GRNXX_IO_POOL_THROW_IF_IMPL_IS_INVALID(); + POOL_POOL_THROW_IF_IMPL_IS_INVALID(); return impl_->options(); } const PoolHeader &Pool::header() const { - GRNXX_IO_POOL_THROW_IF_IMPL_IS_INVALID(); + POOL_POOL_THROW_IF_IMPL_IS_INVALID(); return impl_->header(); } Recycler *Pool::mutable_recycler() { - GRNXX_IO_POOL_THROW_IF_IMPL_IS_INVALID(); + POOL_POOL_THROW_IF_IMPL_IS_INVALID(); return impl_->mutable_recycler(); } -#undef GRNXX_IO_POOL_THROW_IF_IMPL_IS_INVALID +#undef POOL_POOL_THROW_IF_IMPL_IS_INVALID void Pool::swap(Pool &rhs) { impl_.swap(rhs.impl_); Modified: lib/io/pool.hpp (+40 -6) =================================================================== --- lib/io/pool.hpp 2012-12-06 20:04:32 +0900 (dce25f3) +++ lib/io/pool.hpp 2012-12-06 20:37:22 +0900 (d0877c5) @@ -21,7 +21,6 @@ #include "../mutex.hpp" #include "../recycler.hpp" #include "chunk.hpp" -#include "flags.hpp" namespace grnxx { namespace io { @@ -61,6 +60,36 @@ const uint64_t POOL_HEADER_CHUNK_SIZE = CHUNK_UNIT_SIZE; const char POOL_HEADER_FORMAT_STRING[64] = "grnxx::io::Pool"; const char POOL_HEADER_VERSION_STRING[64] = "0.0.0"; +class PoolFlagsIdentifier {}; +typedef FlagsImpl<PoolFlagsIdentifier> PoolFlags; + +// If POOL_READ_ONLY is not specified, a pool is created/opened in +// read-write mode. + +// Read-only mode. +const PoolFlags POOL_READ_ONLY = PoolFlags::define(0x0001); + +// POOL_ANONYMOUS disables all the flags other than GRNXX_HUGE_TLB and +// enables POOL_PRIVATE. +// POOL_CREATE disables POOL_READ_ONLY. +// POOL_OPEN is enabled if POOL_CREATE is not specified. +// POOL_TEMPORARY disables other flags. + +// Anonymous (non-file-backed) mode. +const PoolFlags POOL_ANONYMOUS = PoolFlags::define(0x0010); +// Create a pool if it does not exist. +const PoolFlags POOL_CREATE = PoolFlags::define(0x0040); +// Try to use huge pages. +const PoolFlags POOL_HUGE_TLB = PoolFlags::define(0x0080); +// Open an existing pool. +const PoolFlags POOL_OPEN = PoolFlags::define(0x0100); +// Create a pool, if it does not exist, or open an existing pool. +const PoolFlags POOL_CREATE_OR_OPEN = PoolFlags::define(0x0040); +// Create a temporary pool. +const PoolFlags POOL_TEMPORARY = PoolFlags::define(0x0200); + +StringBuilder &operator<<(StringBuilder &builder, PoolFlags flags); + class PoolOptions { public: PoolOptions(); @@ -242,10 +271,7 @@ class PoolImpl; class Pool { public: Pool(); - // Available flags are as follows: - // GRNXX_IO_READ_ONLY, GRNXX_IO_ANONYMOUS, GRNXX_IO_CREATE, - // GRNXX_IO_OPEN, GRNXX_IO_TEMPORARY. - Pool(const char *path, Flags flags = Flags::none(), + Pool(PoolFlags flags, const char *path = nullptr, const PoolOptions &options = PoolOptions()); ~Pool(); @@ -266,6 +292,14 @@ class Pool { return impl_ != rhs.impl_; } + void open(PoolFlags flags, const char *path = nullptr, + const PoolOptions &options = PoolOptions()) { + *this = Pool(flags, path, options); + } + void close() { + *this = Pool(); + } + const BlockInfo *create_block(uint64_t size); const BlockInfo *get_block_info(uint32_t block_id); @@ -277,7 +311,7 @@ class Pool { void free_block(const BlockInfo &block_info); String path() const; - Flags flags() const; + PoolFlags flags() const; const PoolOptions &options() const; const PoolHeader &header() const; Recycler *mutable_recycler(); Modified: lib/io/view.hpp (+3 -3) =================================================================== --- lib/io/view.hpp 2012-12-06 20:04:32 +0900 (2d012a5) +++ lib/io/view.hpp 2012-12-06 20:37:22 +0900 (33cb8e2) @@ -15,8 +15,8 @@ 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 VIEW_VIEW_HPP -#define VIEW_VIEW_HPP +#ifndef GRNXX_IO_VIEW_HPP +#define GRNXX_IO_VIEW_HPP #include "file.hpp" @@ -120,4 +120,4 @@ inline StringBuilder &operator<<(StringBuilder &builder, const View &view) { } // namespace io } // namespace grnxx -#endif // VIEW_VIEW_HPP +#endif // GRNXX_IO_VIEW_HPP Modified: test/test_alpha_blob_vector.cpp (+8 -8) =================================================================== --- test/test_alpha_blob_vector.cpp 2012-12-06 20:04:32 +0900 (cc93126) +++ test/test_alpha_blob_vector.cpp 2012-12-06 20:37:22 +0900 (75cc538) @@ -27,7 +27,7 @@ void test_basics() { grnxx::io::Pool::unlink_if_exists("temp.grn"); - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_CREATE); + grnxx::io::Pool pool(grnxx::io::POOL_CREATE, "temp.grn"); grnxx::alpha::BlobVector vector(grnxx::alpha::BLOB_VECTOR_CREATE, pool); @@ -77,9 +77,9 @@ void test_basics() { std::uint32_t block_id = vector.block_id(); vector.close(); - pool = grnxx::io::Pool(); + pool.close(); - pool = grnxx::io::Pool("temp.grn", grnxx::io::GRNXX_IO_OPEN); + pool.open(grnxx::io::POOL_OPEN, "temp.grn"); vector.open(pool, block_id); GRNXX_NOTICE() << "blob_vector = " << vector; @@ -104,7 +104,7 @@ void test_basics() { assert(!vector.get_value(0)); vector.close(); - pool = grnxx::io::Pool(); + pool.close(); grnxx::io::Pool::unlink_if_exists("temp.grn"); } @@ -117,7 +117,7 @@ void test_sequential_access(int num_loops, grnxx::io::PoolOptions options; options.set_frozen_duration(grnxx::Duration(0)); - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY, options); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn", options); grnxx::alpha::BlobVector vector(grnxx::alpha::BLOB_VECTOR_CREATE, pool); for (int loop_id = 0; loop_id < num_loops; ++loop_id) { @@ -163,7 +163,7 @@ void test_random_access(int num_loops, grnxx::io::PoolOptions options; options.set_frozen_duration(grnxx::Duration(0)); - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY, options); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn", options); grnxx::alpha::BlobVector vector(grnxx::alpha::BLOB_VECTOR_CREATE, pool); std::vector<std::uint32_t> ids(num_values); @@ -255,7 +255,7 @@ void test_reuse(bool enable_reuse) { grnxx::io::PoolOptions options; options.set_frozen_duration( enable_reuse ? grnxx::Duration(0) : grnxx::Duration::days(1)); - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY, options); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn", options); grnxx::alpha::BlobVector vector(grnxx::alpha::BLOB_VECTOR_CREATE, pool); std::string value(MAX_LENGTH, 'X'); @@ -275,7 +275,7 @@ void test_mixed() { std::mt19937 random; - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn"); grnxx::alpha::BlobVector vector(grnxx::alpha::BLOB_VECTOR_CREATE, pool); std::string value(grnxx::alpha::BLOB_VECTOR_LARGE_VALUE_MIN_LENGTH, 'X'); Modified: test/test_alpha_vector.cpp (+5 -5) =================================================================== --- test/test_alpha_vector.cpp 2012-12-06 20:04:32 +0900 (9c3f956) +++ test/test_alpha_vector.cpp 2012-12-06 20:37:22 +0900 (cd0cc07) @@ -32,7 +32,7 @@ struct Point { void test_basics() { grnxx::io::Pool::unlink_if_exists("temp.grn"); - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_CREATE); + grnxx::io::Pool pool(grnxx::io::POOL_CREATE, "temp.grn"); grnxx::alpha::Vector<std::uint32_t> vector( grnxx::alpha::VECTOR_CREATE, pool); @@ -70,9 +70,9 @@ void test_basics() { const std::uint32_t block_id = vector.block_id(); vector.close(); - pool = grnxx::io::Pool(); + pool.close(); - pool = grnxx::io::Pool("temp.grn", grnxx::io::GRNXX_IO_OPEN); + pool.open(grnxx::io::POOL_OPEN, "temp.grn"); vector.open(pool, block_id); @@ -143,7 +143,7 @@ void test_basics() { point_vector.close(); - pool = grnxx::io::Pool(); + pool.close(); grnxx::io::Pool::unlink_if_exists("temp.grn"); } @@ -151,7 +151,7 @@ template <typename T> void test_times() { enum { VECTOR_SIZE = 1 << 20 }; - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn"); grnxx::alpha::Vector<T> vector(grnxx::alpha::VECTOR_CREATE, pool); Modified: test/test_db_array.cpp (+2 -2) =================================================================== --- test/test_db_array.cpp 2012-12-06 20:04:32 +0900 (fc5ded0) +++ test/test_db_array.cpp 2012-12-06 20:37:22 +0900 (277f3d0) @@ -38,7 +38,7 @@ void test_array_1() { vector[i] = random(); } - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_CREATE); + grnxx::io::Pool pool(grnxx::io::POOL_CREATE, "temp.grn"); grnxx::db::Array<std::uint32_t> array; array.create(&pool, VECTOR_SIZE); @@ -74,7 +74,7 @@ void test_array_1() { void test_array_2() { enum { VECTOR_SIZE = 1 << 24 }; - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn"); grnxx::db::Array<std::uint8_t[3]> array; array.create(&pool, VECTOR_SIZE); Modified: test/test_db_blob_vector.cpp (+7 -7) =================================================================== --- test/test_db_blob_vector.cpp 2012-12-06 20:04:32 +0900 (36a2f58) +++ test/test_db_blob_vector.cpp 2012-12-06 20:37:22 +0900 (5939cd1) @@ -28,7 +28,7 @@ void test_basics() { grnxx::io::Pool::unlink_if_exists("temp.grn"); - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_CREATE); + grnxx::io::Pool pool(grnxx::io::POOL_CREATE, "temp.grn"); grnxx::db::BlobVector vector; vector.create(pool); @@ -78,9 +78,9 @@ void test_basics() { std::uint32_t block_id = vector.block_id(); vector.close(); - pool = grnxx::io::Pool(); + pool.close(); - pool = grnxx::io::Pool("temp.grn", grnxx::io::GRNXX_IO_OPEN); + pool.open(grnxx::io::POOL_OPEN, "temp.grn"); vector.open(pool, block_id); GRNXX_NOTICE() << "blob_vector = " << vector; @@ -102,7 +102,7 @@ void test_basics() { assert(length == values[4].length()); vector.close(); - pool = grnxx::io::Pool(); + pool.close(); grnxx::io::Pool::unlink_if_exists("temp.grn"); } @@ -122,7 +122,7 @@ void test_random_values(std::size_t num_values, } } - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn"); grnxx::db::BlobVector vector; vector.create(pool); @@ -183,7 +183,7 @@ void test_random_updates(grnxx::Duration frozen_duration) { grnxx::io::PoolOptions options; options.set_frozen_duration(frozen_duration); - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY, options); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn", options); grnxx::db::BlobVector vector; vector.create(pool); @@ -258,7 +258,7 @@ void test_random() { } } - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn"); grnxx::db::BlobVector vector; vector.create(pool); Modified: test/test_db_vector.cpp (+5 -5) =================================================================== --- test/test_db_vector.cpp 2012-12-06 20:04:32 +0900 (1e1894a) +++ test/test_db_vector.cpp 2012-12-06 20:37:22 +0900 (b9945d9) @@ -32,7 +32,7 @@ struct Point { void test_basics() { grnxx::io::Pool::unlink_if_exists("temp.grn"); - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_CREATE); + grnxx::io::Pool pool(grnxx::io::POOL_CREATE, "temp.grn"); grnxx::db::Vector<std::uint32_t> vector; vector.create(&pool); @@ -69,9 +69,9 @@ void test_basics() { const std::uint32_t block_id = vector.block_id(); vector.close(); - pool = grnxx::io::Pool(); + pool.close(); - pool = grnxx::io::Pool("temp.grn", grnxx::io::GRNXX_IO_OPEN); + pool.open(grnxx::io::POOL_OPEN, "temp.grn"); vector.open(&pool, block_id); @@ -141,8 +141,8 @@ void test_basics() { assert(point_vector[1 << 30].y == 654); point_vector.close(); + pool.close(); - pool = grnxx::io::Pool(); grnxx::io::Pool::unlink_if_exists("temp.grn"); } @@ -150,7 +150,7 @@ template <typename T> void test_times() { enum { VECTOR_SIZE = 1 << 20 }; - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn"); grnxx::db::Vector<T> vector; vector.create(&pool); Modified: test/test_io_pool.cpp (+28 -28) =================================================================== --- test/test_io_pool.cpp 2012-12-06 20:04:32 +0900 (35989fe) +++ test/test_io_pool.cpp 2012-12-06 20:37:22 +0900 (5beb7ee) @@ -30,21 +30,21 @@ void test_constructor() { grnxx::io::Pool pool; assert(!pool); - pool = grnxx::io::Pool("temp.grn", grnxx::io::GRNXX_IO_CREATE); + pool.open(grnxx::io::POOL_CREATE, "temp.grn"); assert(pool); - assert(pool.flags() & grnxx::io::GRNXX_IO_CREATE); + assert(pool.flags() & grnxx::io::POOL_CREATE); - pool = grnxx::io::Pool("temp.grn"); + pool.open(grnxx::io::PoolFlags::none(), "temp.grn"); assert(pool); - assert(pool.flags() & grnxx::io::GRNXX_IO_OPEN); + assert(pool.flags() & grnxx::io::POOL_OPEN); - pool = grnxx::io::Pool("temp.grn", grnxx::io::GRNXX_IO_ANONYMOUS); + pool.open(grnxx::io::POOL_ANONYMOUS, "temp.grn"); assert(pool); - assert(pool.flags() & grnxx::io::GRNXX_IO_ANONYMOUS); + assert(pool.flags() & grnxx::io::POOL_ANONYMOUS); - pool = grnxx::io::Pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + pool.open(grnxx::io::POOL_TEMPORARY, "temp.grn"); assert(pool); - assert(pool.flags() & grnxx::io::GRNXX_IO_TEMPORARY); + assert(pool.flags() & grnxx::io::POOL_TEMPORARY); grnxx::io::Pool::unlink_if_exists("temp.grn"); } @@ -53,18 +53,18 @@ void test_compare() { grnxx::io::Pool pool; assert(pool == pool); - grnxx::io::Pool pool2("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + grnxx::io::Pool pool2(grnxx::io::POOL_TEMPORARY, "temp.grn"); assert(pool != pool2); assert(pool2 == pool2); - grnxx::io::Pool pool3("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + grnxx::io::Pool pool3(grnxx::io::POOL_TEMPORARY, "temp.grn"); assert(pool != pool3); assert(pool2 != pool3); assert(pool3 == pool3); } void test_copy() { - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn"); grnxx::io::Pool pool2(pool); assert(pool == pool2); @@ -75,7 +75,7 @@ void test_copy() { } void test_move() { - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn"); grnxx::io::Pool pool_copy(pool); grnxx::io::Pool pool2(std::move(pool)); @@ -87,8 +87,8 @@ void test_move() { } void test_swap() { - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); - grnxx::io::Pool pool2("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn"); + grnxx::io::Pool pool2(grnxx::io::POOL_TEMPORARY, "temp.grn"); grnxx::io::Pool pool_copy(pool); grnxx::io::Pool pool2_copy(pool2); @@ -107,7 +107,7 @@ void test_exists() { assert(!grnxx::io::Pool::exists("temp.grn")); - grnxx::io::Pool("temp.grn", grnxx::io::GRNXX_IO_CREATE); + grnxx::io::Pool(grnxx::io::POOL_CREATE, "temp.grn"); assert(grnxx::io::Pool::exists("temp.grn")); @@ -117,7 +117,7 @@ void test_exists() { void test_unlink() { grnxx::io::Pool::unlink_if_exists("temp.grn"); - grnxx::io::Pool("temp.grn", grnxx::io::GRNXX_IO_CREATE); + grnxx::io::Pool(grnxx::io::POOL_CREATE, "temp.grn"); grnxx::io::Pool::unlink("temp.grn"); } @@ -125,19 +125,19 @@ void test_unlink() { void test_unlink_if_exists() { grnxx::io::Pool::unlink_if_exists("temp.grn"); - grnxx::io::Pool("temp.grn", grnxx::io::GRNXX_IO_CREATE); + grnxx::io::Pool(grnxx::io::POOL_CREATE, "temp.grn"); assert(grnxx::io::Pool::unlink_if_exists("temp.grn")); } void test_write_to() { - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn"); GRNXX_NOTICE() << "pool = " << pool; } void test_create_block() { - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_ANONYMOUS); + grnxx::io::Pool pool(grnxx::io::POOL_ANONYMOUS, "temp.grn"); // Create a minimum-size block. const grnxx::io::BlockInfo *block_info = pool.create_block(0); @@ -148,7 +148,7 @@ void test_create_block() { assert(block_info->offset() == 0); assert(block_info->size() == grnxx::io::BLOCK_UNIT_SIZE); - pool = grnxx::io::Pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + pool.open(grnxx::io::POOL_TEMPORARY, "temp.grn"); // Create a maximum-size block. block_info = pool.create_block(pool.options().max_block_chunk_size()); @@ -163,7 +163,7 @@ void test_create_block() { std::mt19937 random; - pool = grnxx::io::Pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + pool.open(grnxx::io::POOL_TEMPORARY, "temp.grn"); // Create small blocks. const std::uint64_t SMALL_MAX_SIZE = std::uint64_t(1) << 16; @@ -185,7 +185,7 @@ void test_create_block() { } void test_get_block_info() { - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_ANONYMOUS); + grnxx::io::Pool pool(grnxx::io::POOL_ANONYMOUS, "temp.grn"); const grnxx::io::BlockInfo *block_info; @@ -203,7 +203,7 @@ void test_get_block_info() { } void test_get_block_address() { - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_ANONYMOUS); + grnxx::io::Pool pool(grnxx::io::POOL_ANONYMOUS, "temp.grn"); const int NUM_BLOCKS = 1 << 10; const std::uint32_t MAX_SIZE = 1 << 16; @@ -233,7 +233,7 @@ void test_get_block_address() { } void test_free_block() { - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_ANONYMOUS); + grnxx::io::Pool pool(grnxx::io::POOL_ANONYMOUS, "temp.grn"); const grnxx::io::BlockInfo *block_info = pool.create_block(0); pool.free_block(block_info->id()); @@ -248,7 +248,7 @@ void test_free_block() { std::mt19937 random; std::vector<const grnxx::io::BlockInfo *> block_infos; - pool = grnxx::io::Pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + pool.open(grnxx::io::POOL_TEMPORARY, "temp.grn"); // Create small blocks. const std::uint64_t SMALL_MAX_SIZE = std::uint64_t(1) << 16; @@ -280,7 +280,7 @@ void test_unfreeze_block() { grnxx::io::PoolOptions options; options.set_frozen_duration(grnxx::Duration(0)); - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY, options); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn", options); assert(pool.options().frozen_duration() == grnxx::Duration(0)); const grnxx::io::BlockInfo *block_info = pool.create_block(0); @@ -315,7 +315,7 @@ void test_random_queries() { grnxx::io::PoolOptions options; options.set_frozen_duration(grnxx::Duration(0)); - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_ANONYMOUS, options); + grnxx::io::Pool pool(grnxx::io::POOL_ANONYMOUS, "temp.grn", options); const int OPERATION_COUNT = 1 << 18; @@ -358,7 +358,7 @@ void benchmark() { std::vector<const grnxx::io::BlockInfo *> block_infos; block_infos.resize(OPERATION_COUNT); - grnxx::io::Pool pool("temp.grn", grnxx::io::GRNXX_IO_TEMPORARY); + grnxx::io::Pool pool(grnxx::io::POOL_TEMPORARY, "temp.grn"); // Measure the speed of create_block(). grnxx::Time start_time = grnxx::Time::now(); -------------- next part -------------- HTML����������������������������... Download