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 ****/