[Groonga-commit] groonga/groonga [master] Fix a bug of grn_tiny_array_id() and use more descriptive names.

Back to archive index

null+****@clear***** null+****@clear*****
2012年 3月 27日 (火) 17:56:54 JST


Susumu Yata	2012-03-27 17:56:54 +0900 (Tue, 27 Mar 2012)

  New Revision: cfcd0e45ca711696891b91ed3f7c48dc32cda5f5

  Log:
    Fix a bug of grn_tiny_array_id() and use more descriptive names.
    
    - grn_tiny_array_id() is currently not used.
    - Add GRN_API to grn_tiny_array_*() declared in hash.h.

  Modified files:
    lib/hash.c
    lib/hash.h

  Modified: lib/hash.c (+23 -19)
===================================================================
--- lib/hash.c    2012-03-27 17:53:34 +0900 (785efdd)
+++ lib/hash.c    2012-03-27 17:56:54 +0900 (591ef5d)
@@ -127,24 +127,26 @@ grn_tiny_array_init(grn_ctx *ctx, grn_tiny_array *array,
   array->element_size = element_size;
   array->flags = flags;
   array->max = 0;
-  if (flags & GRN_TINY_ARRAY_THREADSAFE) { CRITICAL_SECTION_INIT(array->lock); }
+  if (flags & GRN_TINY_ARRAY_THREADSAFE) {
+    CRITICAL_SECTION_INIT(array->lock);
+  }
   memset(array->elements, 0, sizeof(array->elements));
 }
 
 void
 grn_tiny_array_fin(grn_tiny_array *array)
 {
-  int i;
-  grn_ctx *ctx = array->ctx;
-  for (i = 0; i < GRN_TINY_ARRAY_N; i++) {
-    void **e = &array->elements[i];
-    if (*e) {
+  int block_id;
+  grn_ctx * const ctx = array->ctx;
+  for (block_id = 0; block_id < GRN_TINY_ARRAY_N; block_id++) {
+    void ** const block = &array->elements[block_id];
+    if (*block) {
       if (array->flags & GRN_TINY_ARRAY_USE_MALLOC) {
-        GRN_FREE(*e);
+        GRN_FREE(*block);
       } else {
-        GRN_CTX_FREE(ctx, *e);
+        GRN_CTX_FREE(ctx, *block);
       }
-      *e = NULL;
+      *block = NULL;
     }
   }
 }
@@ -156,16 +158,18 @@ grn_tiny_array_at(grn_tiny_array *array, grn_id id)
 }
 
 grn_id
-grn_tiny_array_id(grn_tiny_array *array, void *p)
-{
-  uint32_t i, s, n;
-  uintptr_t o, p_ = (uintptr_t) p;
-  for (i = 0, s = 0; i < GRN_TINY_ARRAY_N; i++, s += n) {
-    n = GRN_TINY_ARRAY_S * GRN_TINY_ARRAY_R(i);
-    o = (uintptr_t) array->elements[i];
-    if (o <= p_ && p_ < o + n * array->element_size) {
-      return s + ((p_ - o) / array->element_size);
-    }
+grn_tiny_array_id(grn_tiny_array *array, const void *element_address)
+{
+  const byte * const ptr = (const byte *)element_address;
+  uint32_t block_id, offset = 1;
+  for (block_id = 0; block_id < GRN_TINY_ARRAY_N; block_id++) {
+    const uint32_t block_size = GRN_TINY_ARRAY_S * GRN_TINY_ARRAY_R(block_id);
+    const byte * const block = (const byte *)array->elements[block_id];
+    if (block && block <= ptr &&
+        ptr < (block + block_size * array->element_size)) {
+      return offset + ((ptr - block) / array->element_size);
+    }
+    offset += block_size;
   }
   return GRN_ID_NIL;
 }

  Modified: lib/hash.h (+19 -14)
===================================================================
--- lib/hash.h    2012-03-27 17:53:34 +0900 (7ebce64)
+++ lib/hash.h    2012-03-27 17:56:54 +0900 (ce87fbd)
@@ -51,25 +51,30 @@ struct _grn_tiny_array {
   void *elements[GRN_TINY_ARRAY_N];
 };
 
-#define GRN_TINY_ARRAY_EACH(a,head,tail,key,val,block) do {\
-  int _ei;\
-  const grn_id h = (head);\
-  const grn_id t = (tail);\
-  for (_ei = 0, (key) = (h); _ei < GRN_TINY_ARRAY_N && (key) <= (t); _ei++) {\
-    int _ej = GRN_TINY_ARRAY_S * GRN_TINY_ARRAY_R(_ei);\
-    if (((val) = (a)->elements[_ei])) {\
-      for (; _ej-- && (key) <= (t); (key)++, (val) = (void *)((byte *)(val) + (a)->element_size)) block\
+#define GRN_TINY_ARRAY_EACH(array, head, tail, key, value, block) do {\
+  int _block_id;\
+  const grn_id _head = (head);\
+  const grn_id _tail = (tail);\
+  for (_block_id = 0, (key) = (_head);\
+       _block_id < GRN_TINY_ARRAY_N && (key) <= (_tail); _block_id++) {\
+    int _id = GRN_TINY_ARRAY_S * GRN_TINY_ARRAY_R(_block_id);\
+    if (((value) = (array)->elements[_block_id])) {\
+      for (; _id-- && (key) <= (_tail);\
+           (key)++, (value) = (void *)((byte *)(value) + (array)->element_size)) {\
+        block\
+      }\
     } else {\
-      (key) += _ej;\
+      (key) += _id;\
     }\
   }\
 } while (0)
 
-void grn_tiny_array_init(grn_ctx *ctx, grn_tiny_array *array,
-                         uint16_t element_size, uint16_t flags);
-void grn_tiny_array_fin(grn_tiny_array *array);
-void *grn_tiny_array_at(grn_tiny_array *array, grn_id id);
-grn_id grn_tiny_array_id(grn_tiny_array *array, void *p);
+GRN_API void grn_tiny_array_init(grn_ctx *ctx, grn_tiny_array *array,
+                                 uint16_t element_size, uint16_t flags);
+GRN_API void grn_tiny_array_fin(grn_tiny_array *array);
+GRN_API void *grn_tiny_array_at(grn_tiny_array *array, grn_id id);
+GRN_API grn_id grn_tiny_array_id(grn_tiny_array *array,
+                                 const void *element_address);
 
 /**** grn_array ****/
 




Groonga-commit メーリングリストの案内
Back to archive index