susumu.yata
null+****@clear*****
Fri Jul 26 11:16:32 JST 2013
susumu.yata 2013-07-26 11:16:32 +0900 (Fri, 26 Jul 2013) New Revision: c34fc62889afabfaea47feaa874321a6f68e97bc https://github.com/groonga/grnxx/commit/c34fc62889afabfaea47feaa874321a6f68e97bc Message: Keep a copy of parameters in a header. For destruct an instance without accessing a header. Modified files: lib/grnxx/array_impl.cpp lib/grnxx/array_impl.hpp Modified: lib/grnxx/array_impl.cpp (+12 -5) =================================================================== --- lib/grnxx/array_impl.cpp 2013-07-25 18:36:50 +0900 (c5314ee) +++ lib/grnxx/array_impl.cpp 2013-07-26 11:16:32 +0900 (be98765) @@ -378,6 +378,8 @@ void Array2D::reserve_page(uint64_t page_id) { Array3D::Array3D() : tables_(), size_(0), + table_size_(0), + secondary_table_size_(0), storage_(nullptr), storage_node_id_(STORAGE_INVALID_NODE_ID), header_(nullptr), @@ -388,17 +390,18 @@ Array3D::Array3D() table_mutex_() {} Array3D::~Array3D() { + // A destructor must not access a header because it may be already lost. if (tables_) { uint64_t offset = 0; - for (uint64_t i = 0; i < header_->secondary_table_size; ++i) { + for (uint64_t i = 0; i < secondary_table_size_; ++i) { if (tables_[i] != (dummy_table_ - offset)) { delete [] (tables_[i] + offset); } - offset += header_->table_size; + offset += table_size_; } } if (dummy_table_) { - DummyTableManager::get().free_dummy_table(header_->table_size); + DummyTableManager::get().free_dummy_table(table_size_); } } @@ -448,8 +451,10 @@ void Array3D::create(Storage *storage, uint32_t storage_node_id, for (uint64_t i = 0; i < header_->secondary_table_size; ++i) { secondary_table_[i] = STORAGE_INVALID_NODE_ID; } + size_ = header_->size; + table_size_ = header_->table_size; + secondary_table_size_ = header_->secondary_table_size; reserve_tables(); - size_ = size; } catch (...) { storage->unlink_node(storage_node_id_); throw; @@ -497,8 +502,10 @@ void Array3D::open(Storage *storage, uint32_t storage_node_id, StorageNode secondary_table_node = storage->open_node(header_->secondary_table_storage_node_id); secondary_table_ = static_cast<uint32_t *>(secondary_table_node.body()); - reserve_tables(); size_ = header_->size; + table_size_ = header_->table_size; + secondary_table_size_ = header_->secondary_table_size; + reserve_tables(); } void Array3D::unlink(Storage *storage, uint32_t storage_node_id, Modified: lib/grnxx/array_impl.hpp (+2 -0) =================================================================== --- lib/grnxx/array_impl.hpp 2013-07-25 18:36:50 +0900 (9634fc9) +++ lib/grnxx/array_impl.hpp 2013-07-26 11:16:32 +0900 (b407bb4) @@ -187,6 +187,8 @@ class Array3D { private: std::unique_ptr<void **[]> tables_; uint64_t size_; + uint64_t table_size_; + uint64_t secondary_table_size_; Storage *storage_; uint32_t storage_node_id_; ArrayHeader *header_; -------------- next part -------------- HTML����������������������������...Download