null+****@clear*****
null+****@clear*****
2012年 4月 5日 (木) 13:56:43 JST
Susumu Yata 2012-04-05 13:56:43 +0900 (Thu, 05 Apr 2012)
New Revision: cd995333a5092435a7945618b53a6b7fd630c410
Log:
Divide grn_hash_add_entry() to grn_io/tiny_hash_add().
Modified files:
lib/hash.c
Modified: lib/hash.c (+69 -39)
===================================================================
--- lib/hash.c 2012-04-05 12:12:39 +0900 (73fe0fc)
+++ lib/hash.c 2012-04-05 13:56:43 +0900 (7eee4c6)
@@ -1775,43 +1775,78 @@ grn_hash_clear_lock(grn_ctx *ctx, grn_hash *hash)
}
inline static grn_id
-grn_hash_add_entry(grn_ctx *ctx, grn_hash *hash, uint32_t key_size)
+grn_io_hash_add(grn_ctx *ctx, grn_hash *hash, uint32_t hash_value,
+ const void *key, unsigned int key_size, void **value)
{
grn_id entry_id;
- if (grn_hash_is_io_hash(hash)) {
- struct grn_hash_header * const header = hash->header;
- key_size -= 1;
- entry_id = header->garbages[key_size];
- if (entry_id) {
- grn_hash_entry * const entry =
- grn_io_hash_entry_at(ctx, hash, entry_id, GRN_TABLE_ADD);
- if (!entry) {
- return GRN_ID_NIL;
- }
- header->garbages[key_size] = *(grn_id *)entry;
- if (hash->obj.header.flags & GRN_OBJ_KEY_VAR_SIZE) {
- /* keep entry->io_entry's hash_value, flag, key_size and key. */
- memset(entry->io_entry.value, 0, header->value_size);
- } else {
- memset(entry, 0, header->entry_size);
- }
+ grn_hash_entry *entry;
+ struct grn_hash_header * const header = hash->header;
+
+ entry_id = header->garbages[key_size - 1];
+ if (entry_id) {
+ entry = grn_io_hash_entry_at(ctx, hash, entry_id, GRN_TABLE_ADD);
+ if (!entry) {
+ return GRN_ID_NIL;
+ }
+ header->garbages[key_size - 1] = *(grn_id *)entry;
+ if (hash->obj.header.flags & GRN_OBJ_KEY_VAR_SIZE) {
+ /* keep entry->io_entry's hash_value, flag, key_size and key. */
+ memset(entry->io_entry.value, 0, header->value_size);
} else {
- entry_id = ++header->curr_rec;
+ memset(entry, 0, header->entry_size);
+ }
+ } else {
+ entry_id = header->curr_rec + 1;
+ entry = grn_hash_entry_at(ctx, hash, entry_id, GRN_TABLE_ADD);
+ if (!entry) {
+ return GRN_ID_NIL;
}
+ header->curr_rec = entry_id;
+ }
+
+ if (!grn_io_array_bit_on(ctx, hash->io, GRN_HASH_BITMAP_SEGMENT, entry_id)) {
+ /* TODO: error handling. */
+ }
+
+ if (grn_hash_entry_put_key(ctx, hash, entry, hash_value, key, key_size)) {
/* TODO: error handling. */
- grn_io_array_bit_on(ctx, hash->io, GRN_HASH_BITMAP_SEGMENT, entry_id);
+ }
+
+ if (value) {
+ *value = grn_hash_entry_get_value(hash, entry);
+ }
+ return entry_id;
+}
+
+inline static grn_id
+grn_tiny_hash_add(grn_ctx *ctx, grn_hash *hash, uint32_t hash_value,
+ const void *key, unsigned int key_size, void **value)
+{
+ grn_id entry_id;
+ grn_hash_entry *entry;
+ if (hash->garbages) {
+ entry_id = hash->garbages;
+ entry = (grn_hash_entry *)grn_tiny_array_at_inline(&hash->a, entry_id);
+ hash->garbages = *(grn_id *)entry;
+ memset(entry, 0, hash->entry_size);
} else {
- if (hash->garbages) {
- grn_hash_entry *entry;
- entry_id = hash->garbages;
- entry = (grn_hash_entry *)grn_tiny_array_at_inline(&hash->a, entry_id);
- hash->garbages = *(grn_id *)entry;
- memset(entry, 0, hash->entry_size);
- } else {
- entry_id = hash->a.max + 1;
+ entry_id = hash->a.max + 1;
+ entry = (grn_hash_entry *)grn_tiny_array_at_inline(&hash->a, entry_id);
+ if (!entry) {
+ return GRN_ID_NIL;
}
+ }
+
+ if (!grn_tiny_array_bit_on(&hash->bitmap, entry_id)) {
/* TODO: error handling. */
- grn_tiny_array_bit_on(&hash->bitmap, entry_id);
+ }
+
+ if (grn_hash_entry_put_key(ctx, hash, entry, hash_value, key, key_size)) {
+ /* TODO: error handling. */
+ }
+
+ if (value) {
+ *value = grn_hash_entry_get_value(hash, entry);
}
return entry_id;
}
@@ -1885,16 +1920,14 @@ grn_hash_add(grn_ctx *ctx, grn_hash *hash, const void *key,
}
}
- id = grn_hash_add_entry(ctx, hash, key_size);
- if (!id) {
- return GRN_ID_NIL;
+ if (grn_hash_is_io_hash(hash)) {
+ id = grn_io_hash_add(ctx, hash, hash_value, key, key_size, value);
+ } else {
+ id = grn_tiny_hash_add(ctx, hash, hash_value, key, key_size, value);
}
- /* TODO: error handling. */
- entry = grn_hash_entry_at(ctx, hash, id, GRN_TABLE_ADD);
- if (!entry) {
+ if (!id) {
return GRN_ID_NIL;
}
- grn_hash_entry_put_key(ctx, hash, entry, hash_value, key, key_size);
if (garbage_index) {
(*hash->n_garbages)--;
index = garbage_index;
@@ -1903,9 +1936,6 @@ grn_hash_add(grn_ctx *ctx, grn_hash *hash, const void *key,
(*hash->n_entries)++;
/* unlock */
- if (value) {
- *value = grn_hash_entry_get_value(hash, entry);
- }
if (added) {
*added = 1;
}