[Groonga-commit] groonga/grnxx at 0ebf0bc [master] Add a unified header (grnxx::ArrayHeader).

Back to archive index

susumu.yata null+****@clear*****
Tue Jun 4 22:25:43 JST 2013


susumu.yata	2013-06-04 22:25:43 +0900 (Tue, 04 Jun 2013)

  New Revision: 0ebf0bc8f9f6f2390ad84699d15247f24f8490dd
  https://github.com/groonga/grnxx/commit/0ebf0bc8f9f6f2390ad84699d15247f24f8490dd

  Message:
    Add a unified header (grnxx::ArrayHeader).

  Modified files:
    lib/grnxx/array_impl.cpp
    lib/grnxx/array_impl.hpp

  Modified: lib/grnxx/array_impl.cpp (+45 -66)
===================================================================
--- lib/grnxx/array_impl.cpp    2013-06-04 21:33:45 +0900 (bb04e0f)
+++ lib/grnxx/array_impl.cpp    2013-06-04 22:25:43 +0900 (91690bf)
@@ -26,65 +26,33 @@
 
 namespace grnxx {
 
-struct Array1DHeader {
-  uint64_t value_size;
-  uint64_t page_size;
-  uint32_t page_storage_node_id;
-
-  Array1DHeader(uint64_t value_size, uint64_t page_size);
-};
-
-Array1DHeader::Array1DHeader(uint64_t value_size, uint64_t page_size)
-    : value_size(value_size),
-      page_size(page_size),
-      page_storage_node_id(STORAGE_INVALID_NODE_ID) {}
-
-struct Array2DHeader {
-  uint64_t value_size;
-  uint64_t page_size;
-  uint64_t table_size;
-  uint32_t has_default_value;
-  uint32_t table_storage_node_id;
-  Mutex mutex;
-
-  Array2DHeader(uint64_t value_size, uint64_t page_size,
-                uint64_t table_size, bool has_default_value);
-};
-
-Array2DHeader::Array2DHeader(uint64_t value_size, uint64_t page_size,
-                             uint64_t table_size, bool has_default_value)
-    : value_size(value_size),
-      page_size(page_size),
-      table_size(table_size),
-      has_default_value(has_default_value ? 1 : 0),
-      table_storage_node_id(STORAGE_INVALID_NODE_ID),
-      mutex(MUTEX_UNLOCKED) {}
-
-struct Array3DHeader {
+struct ArrayHeader {
   uint64_t value_size;
   uint64_t page_size;
   uint64_t table_size;
   uint64_t secondary_table_size;
   uint32_t has_default_value;
+  uint32_t page_storage_node_id;
+  uint32_t table_storage_node_id;
   uint32_t secondary_table_storage_node_id;
+  uint32_t reserved;
   Mutex page_mutex;
   Mutex table_mutex;
   Mutex secondary_table_mutex;
 
-  Array3DHeader(uint64_t value_size, uint64_t page_size,
-                uint64_t table_size, uint64_t secondary_table_size,
-                bool has_default_value);
+  ArrayHeader();
 };
 
-Array3DHeader::Array3DHeader(uint64_t value_size, uint64_t page_size,
-                             uint64_t table_size, uint64_t secondary_table_size,
-                             bool has_default_value)
-    : value_size(value_size),
-      page_size(page_size),
-      table_size(table_size),
-      secondary_table_size(secondary_table_size),
-      has_default_value(has_default_value ? 1 : 0),
+ArrayHeader::ArrayHeader()
+    : value_size(1),
+      page_size(1),
+      table_size(1),
+      secondary_table_size(1),
+      has_default_value(false),
+      page_storage_node_id(STORAGE_INVALID_NODE_ID),
+      table_storage_node_id(STORAGE_INVALID_NODE_ID),
       secondary_table_storage_node_id(STORAGE_INVALID_NODE_ID),
+      reserved(0),
       page_mutex(MUTEX_UNLOCKED),
       table_mutex(MUTEX_UNLOCKED),
       secondary_table_mutex(MUTEX_UNLOCKED) {}
@@ -104,13 +72,15 @@ bool Array1D::create(Storage *storage, uint32_t storage_node_id,
     return false;
   }
   StorageNode storage_node =
-      storage->create_node(storage_node_id, sizeof(Array1DHeader));
+      storage->create_node(storage_node_id, sizeof(ArrayHeader));
   if (!storage_node) {
     return false;
   }
   storage_node_id_ = storage_node.id();
-  header_ = static_cast<Array1DHeader *>(storage_node.body());
-  *header_ = Array1DHeader(value_size, page_size);
+  header_ = static_cast<ArrayHeader *>(storage_node.body());
+  *header_ = ArrayHeader();
+  header_->value_size = value_size;
+  header_->page_size = page_size;
   StorageNode page_node =
       storage->create_node(storage_node_id_, value_size * page_size);
   if (!page_node) {
@@ -120,6 +90,7 @@ bool Array1D::create(Storage *storage, uint32_t storage_node_id,
   header_->page_storage_node_id = page_node.id();
   page_ = page_node.body();
   if (default_value) {
+    header_->has_default_value = true;
     fill_page(page_, default_value);
   }
   return true;
@@ -135,13 +106,13 @@ bool Array1D::open(Storage *storage, uint32_t storage_node_id,
   if (!storage_node) {
     return false;
   }
-  if (storage_node.size() < sizeof(Array1DHeader)) {
+  if (storage_node.size() < sizeof(ArrayHeader)) {
     GRNXX_ERROR() << "invalid format: node_size = " << storage_node.size()
-                  << ", header_size = " << sizeof(Array1DHeader);
+                  << ", header_size = " << sizeof(ArrayHeader);
     return false;
   }
   storage_node_id_ = storage_node.id();
-  header_ = static_cast<Array1DHeader *>(storage_node.body());
+  header_ = static_cast<ArrayHeader *>(storage_node.body());
   if (header_->value_size != value_size) {
     GRNXX_ERROR() << "parameter conflict: value_size = " << value_size
                   << ", stored_value_size = " << header_->value_size;
@@ -190,7 +161,7 @@ bool Array2D::create(Storage *storage, uint32_t storage_node_id,
     return nullptr;
   }
   storage_ = storage;
-  uint64_t storage_node_size = sizeof(Array2DHeader);
+  uint64_t storage_node_size = sizeof(ArrayHeader);
   if (default_value) {
     storage_node_size += value_size;
   }
@@ -200,9 +171,13 @@ bool Array2D::create(Storage *storage, uint32_t storage_node_id,
     return false;
   }
   storage_node_id_ = storage_node.id();
-  header_ = static_cast<Array2DHeader *>(storage_node.body());
-  *header_ = Array2DHeader(value_size, page_size, table_size, default_value);
+  header_ = static_cast<ArrayHeader *>(storage_node.body());
+  *header_ = ArrayHeader();
+  header_->value_size = value_size;
+  header_->page_size = page_size;
+  header_->table_size = table_size;
   if (default_value) {
+    header_->has_default_value = true;
     default_value_ = header_ + 1;
     std::memcpy(default_value_, default_value, value_size);
     fill_page_ = fill_page;
@@ -242,13 +217,13 @@ bool Array2D::open(Storage *storage, uint32_t storage_node_id,
   if (!storage_node) {
     return false;
   }
-  if (storage_node.size() < sizeof(Array2DHeader)) {
+  if (storage_node.size() < sizeof(ArrayHeader)) {
     GRNXX_ERROR() << "invalid format: node_size = " << storage_node.size()
-                  << ", header_size = " << sizeof(Array2DHeader);
+                  << ", header_size = " << sizeof(ArrayHeader);
     return false;
   }
   storage_node_id_ = storage_node.id();
-  header_ = static_cast<Array2DHeader *>(storage_node.body());
+  header_ = static_cast<ArrayHeader *>(storage_node.body());
   if (header_->value_size != value_size) {
     GRNXX_ERROR() << "parameter conflict: value_size = " << value_size
                   << ", stored_value_size = " << header_->value_size;
@@ -298,7 +273,7 @@ bool Array2D::initialize_page(uint64_t page_id) {
   if (!table_cache_[page_id]) {
     StorageNode page_node;
     if (table_[page_id] == STORAGE_INVALID_NODE_ID) {
-      Lock inter_process_lock(&header_->mutex);
+      Lock inter_process_lock(&header_->table_mutex);
       if (table_[page_id] == STORAGE_INVALID_NODE_ID) {
         page_node =
             storage_->create_node(header_->table_storage_node_id,
@@ -346,7 +321,7 @@ bool Array3D::create(Storage *storage, uint32_t storage_node_id,
     return nullptr;
   }
   storage_ = storage;
-  uint64_t storage_node_size = sizeof(Array3DHeader);
+  uint64_t storage_node_size = sizeof(ArrayHeader);
   if (default_value) {
     storage_node_size += value_size;
   }
@@ -356,10 +331,14 @@ bool Array3D::create(Storage *storage, uint32_t storage_node_id,
     return false;
   }
   storage_node_id_ = storage_node.id();
-  header_ = static_cast<Array3DHeader *>(storage_node.body());
-  *header_ = Array3DHeader(value_size, page_size, table_size,
-                           secondary_table_size, default_value);
+  header_ = static_cast<ArrayHeader *>(storage_node.body());
+  *header_ = ArrayHeader();
+  header_->value_size = value_size;
+  header_->page_size = page_size;
+  header_->table_size = table_size;
+  header_->secondary_table_size = secondary_table_size;
   if (default_value) {
+    header_->has_default_value = true;
     default_value_ = header_ + 1;
     std::memcpy(default_value_, default_value, value_size);
     fill_page_ = fill_page;
@@ -388,13 +367,13 @@ bool Array3D::open(Storage *storage, uint32_t storage_node_id,
   if (!storage_node) {
     return false;
   }
-  if (storage_node.size() < sizeof(Array3DHeader)) {
+  if (storage_node.size() < sizeof(ArrayHeader)) {
     GRNXX_ERROR() << "invalid format: node_size = " << storage_node.size()
-                  << ", header_size = " << sizeof(Array3DHeader);
+                  << ", header_size = " << sizeof(ArrayHeader);
     return false;
   }
   storage_node_id_ = storage_node.id();
-  header_ = static_cast<Array3DHeader *>(storage_node.body());
+  header_ = static_cast<ArrayHeader *>(storage_node.body());
   if (header_->value_size != value_size) {
     GRNXX_ERROR() << "parameter conflict: value_size = " << value_size
                   << ", stored_value_size = " << header_->value_size;

  Modified: lib/grnxx/array_impl.hpp (+4 -6)
===================================================================
--- lib/grnxx/array_impl.hpp    2013-06-04 21:33:45 +0900 (b972d99)
+++ lib/grnxx/array_impl.hpp    2013-06-04 22:25:43 +0900 (b1fee0f)
@@ -31,9 +31,7 @@ namespace grnxx {
 
 class Storage;
 
-struct Array1DHeader;
-struct Array2DHeader;
-struct Array3DHeader;
+struct ArrayHeader;
 
 class Array1D {
   using FillPage = void (*)(void *page, const void *value);
@@ -63,7 +61,7 @@ class Array1D {
 
  private:
   uint32_t storage_node_id_;
-  Array1DHeader *header_;
+  ArrayHeader *header_;
   void *page_;
 };
 
@@ -104,7 +102,7 @@ class Array2D {
  private:
   Storage *storage_;
   uint32_t storage_node_id_;
-  Array2DHeader *header_;
+  ArrayHeader *header_;
   void *default_value_;
   FillPage fill_page_;
   uint32_t *table_;
@@ -155,7 +153,7 @@ class Array3D {
  private:
   Storage *storage_;
   uint32_t storage_node_id_;
-  Array3DHeader *header_;
+  ArrayHeader *header_;
   void *default_value_;
   FillPage fill_page_;
   uint32_t *secondary_table_;
-------------- next part --------------
HTML����������������������������...
Download 



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