null+****@clear*****
null+****@clear*****
2011年 11月 22日 (火) 10:11:21 JST
Daijiro MORI 2011-11-22 01:11:21 +0000 (Tue, 22 Nov 2011) New Revision: 5f520ab18c2b20509ef063227029ecaa07a9fac0 Log: put lock around grn_dat_update_by_id() Modified files: lib/db.c Modified: lib/db.c (+11 -1) =================================================================== --- lib/db.c 2011-11-21 21:08:01 +0000 (9855a40) +++ lib/db.c 2011-11-22 01:11:21 +0000 (67ccd6c) @@ -6136,7 +6136,17 @@ grn_table_update_by_id(grn_ctx *ctx, grn_obj *table, grn_id id, grn_rc rc = GRN_OPERATION_NOT_SUPPORTED; GRN_API_ENTER; if (table->header.type == GRN_TABLE_DAT_KEY) { - rc = grn_dat_update_by_id(ctx, (grn_dat *)table, id, dest_key, dest_key_size); + grn_dat *dat = (grn_dat *)table; + if (dat->io && !(dat->io->flags & GRN_IO_TEMPORARY)) { + if (grn_io_lock(ctx, dat->io, 10000000)) { + rc = ctx->rc; + } else { + rc = grn_dat_update_by_id(ctx, dat, id, dest_key, dest_key_size); + grn_io_unlock(dat->io); + } + } else { + rc = grn_dat_update_by_id(ctx, dat, id, dest_key, dest_key_size); + } } GRN_API_RETURN(rc); }