Susumu Yata
null+****@clear*****
Wed Dec 9 14:48:49 JST 2015
Susumu Yata 2015-12-09 14:48:49 +0900 (Wed, 09 Dec 2015) New Revision: 96427b0f5f9ad13d68a9bb048e4b63db79d2c0ba https://github.com/groonga/groonga/commit/96427b0f5f9ad13d68a9bb048e4b63db79d2c0ba Message: grn_expr: dynamically resize a buffer for constants GitHub: #444 Modified files: lib/expr.c lib/grn_db.h Modified: lib/expr.c (+35 -15) =================================================================== --- lib/expr.c 2015-12-09 14:51:37 +0900 (a4bbca0) +++ lib/expr.c 2015-12-09 14:48:49 +0900 (0e00466) @@ -201,19 +201,26 @@ grn_obj * grn_expr_alloc_const(grn_ctx *ctx, grn_obj *expr) { grn_expr *e = (grn_expr *)expr; - - if (!e->consts) { - if (!(e->consts = GRN_MALLOCN(grn_obj, GRN_STACK_SIZE))) { + uint32_t id = e->nconsts % GRN_EXPR_CONST_BLK_SIZE; + uint32_t blk_id = e->nconsts / GRN_EXPR_CONST_BLK_SIZE; + + if (id == 0) { + uint32_t nblks = blk_id + 1; + grn_obj **blks = (grn_obj **)GRN_REALLOC(e->const_blks, + sizeof(grn_obj *) * nblks); + if (!blks) { + ERR(GRN_NO_MEMORY_AVAILABLE, "realloc failed"); + return NULL; + } + e->const_blks = blks; + blks[blk_id] = GRN_MALLOCN(grn_obj, GRN_EXPR_CONST_BLK_SIZE); + if (!blks[blk_id]) { ERR(GRN_NO_MEMORY_AVAILABLE, "malloc failed"); return NULL; } } - if (e->nconsts < GRN_STACK_SIZE) { - return e->consts + e->nconsts++; - } else { - ERR(GRN_STACK_OVER_FLOW, "too many constants."); - return NULL; - } + e->nconsts++; + return &e->const_blks[blk_id][id]; } void @@ -359,7 +366,7 @@ grn_expr_open(grn_ctx *ctx, grn_obj_spec *spec, const uint8_t *p, const uint8_t grn_expr *expr = NULL; if ((expr = GRN_MALLOCN(grn_expr, 1))) { int size = GRN_STACK_SIZE; - expr->consts = NULL; + expr->const_blks = NULL; expr->nconsts = 0; GRN_TEXT_INIT(&expr->name_buf, 0); GRN_TEXT_INIT(&expr->dfi, 0); @@ -458,7 +465,7 @@ grn_expr_create(grn_ctx *ctx, const char *name, unsigned int name_size) id = grn_obj_register(ctx, db, name, name_size); if (id && (expr = GRN_MALLOCN(grn_expr, 1))) { int size = GRN_STACK_SIZE; - expr->consts = NULL; + expr->const_blks = NULL; expr->nconsts = 0; GRN_TEXT_INIT(&expr->name_buf, 0); GRN_TEXT_INIT(&expr->dfi, 0); @@ -507,7 +514,7 @@ exit : grn_rc grn_expr_close(grn_ctx *ctx, grn_obj *expr) { - uint32_t i; + uint32_t i, j; grn_expr *e = (grn_expr *)expr; GRN_API_ENTER; /* @@ -516,10 +523,23 @@ grn_expr_close(grn_ctx *ctx, grn_obj *expr) } */ grn_expr_clear_vars(ctx, expr); - for (i = 0; i < e->nconsts; i++) { - grn_obj_close(ctx, &e->consts[i]); + if (e->const_blks) { + uint32_t nblks = e->nconsts + GRN_EXPR_CONST_BLK_SIZE - 1; + nblks /= GRN_EXPR_CONST_BLK_SIZE; + for (i = 0; i < nblks; i++) { + uint32_t end; + if (i < nblks - 1) { + end = GRN_EXPR_CONST_BLK_SIZE; + } else { + end = ((e->nconsts - 1) % GRN_EXPR_CONST_BLK_SIZE) + 1; + } + for (j = 0; j < end; j++) { + grn_obj_close(ctx, &e->const_blks[i][j]); + } + GRN_FREE(e->const_blks[i]); + } + GRN_FREE(e->const_blks); } - if (e->consts) { GRN_FREE(e->consts); } grn_obj_close(ctx, &e->name_buf); grn_obj_close(ctx, &e->dfi); for (;;) { Modified: lib/grn_db.h (+3 -1) =================================================================== --- lib/grn_db.h 2015-12-09 14:51:37 +0900 (5aad617) +++ lib/grn_db.h 2015-12-09 14:48:49 +0900 (b26989a) @@ -298,6 +298,8 @@ typedef struct { int32_t modify; } grn_expr_code; +#define GRN_EXPR_CONST_BLK_SIZE GRN_STACK_SIZE + struct _grn_expr { grn_db_obj obj; grn_obj name_buf; @@ -307,7 +309,7 @@ struct _grn_expr { uint16_t cacheable; uint16_t taintable; - grn_obj *consts; + grn_obj **const_blks; grn_obj *values; grn_expr_code *codes; uint32_t nconsts; -------------- next part -------------- HTML����������������������������...Download