diff -Naru ../senna-1.1.3.orig/lib/index.c ./lib/index.c --- ../senna-1.1.3.orig/lib/index.c 2008-05-21 18:26:19.000000000 +0900 +++ ./lib/index.c 2008-11-04 07:34:05.000000000 +0900 @@ -585,6 +585,12 @@ return r; } +void +sen_index_set_abort_callback(sen_index *i, int (*cb)(void*), void *arg) +{ + sen_inv_set_abort_callback(i->inv, cb, arg); +} + /* sen_records_heap class */ struct _sen_records_heap { diff -Naru ../senna-1.1.3.orig/lib/inv.c ./lib/inv.c --- ../senna-1.1.3.orig/lib/inv.c 2008-05-21 18:26:19.000000000 +0900 +++ ./lib/inv.c 2008-11-04 07:36:28.000000000 +0900 @@ -51,6 +51,8 @@ sen_io *chunk; sen_sym *lexicon; struct sen_inv_header *header; + int (*check_abort)(void*); + void *check_abort_arg; }; struct sen_inv_header { @@ -1302,6 +1304,8 @@ inv->chunk = chunk; inv->header = header; inv->lexicon = lexicon; + inv->check_abort = NULL; + inv->check_abort_arg = NULL; inv->header->total_chunk_size = 0; SEN_GET(path,inv); return inv; @@ -1408,6 +1412,13 @@ } } +void +sen_inv_set_abort_callback(sen_inv *inv, int (*cb)(void*), void *arg) +{ + inv->check_abort = cb; + inv->check_abort_arg = arg; +} + sen_rc sen_inv_update_one(sen_inv *inv, uint32_t key, sen_inv_updspec *u, sen_set *h, int hint) { @@ -2249,12 +2260,16 @@ uint32_t *offset2; sen_set_cursor *c; sen_id *tp, *tq; + int check_abort_cnt = 0; if ((h = sen_sym_prefix_search(lexicon, key))) { // sen_log("key=%s h->n=%d", key, h->n_entries); if ((ti->cursors = cursor_heap_open(h->n_entries + 256))) { if ((c = sen_set_cursor_open(h))) { while (sen_set_cursor_next(c, (void **) &tp, NULL)) { const char *key2 = _sen_sym_key(lexicon, *tp); + if (inv->check_abort != NULL && (++check_abort_cnt & 0x3f) == 0 + && (*inv->check_abort)(inv->check_abort_arg)) + break; if (!key2) { break; } // sen_log("key2=%s", key2); if (sen_str_len(key2, lexicon->encoding, NULL) == 1) { // todo: diff -Naru ../senna-1.1.3.orig/lib/inv.h ./lib/inv.h --- ../senna-1.1.3.orig/lib/inv.h 2008-05-21 18:26:19.000000000 +0900 +++ ./lib/inv.h 2008-11-04 07:36:49.000000000 +0900 @@ -80,6 +80,8 @@ void sen_inv_seg_expire(sen_inv *inv, int32_t threshold); void sen_inv_expire(void); +void sen_inv_set_abort_callback(sen_inv *inv, int (*cb)(void*), void *arg); + typedef struct { sen_id rid; uint32_t sid; diff -Naru ../senna-1.1.3.orig/lib/inv08.c ./lib/inv08.c --- ../senna-1.1.3.orig/lib/inv08.c 2008-05-21 18:26:19.000000000 +0900 +++ ./lib/inv08.c 2008-11-04 07:37:19.000000000 +0900 @@ -29,6 +29,8 @@ sen_io *chunk; sen_sym *lexicon; struct sen_inv_header *header; + int (*check_abort)(void*); + void *check_abort_arg; uint32_t total_chunk_size; uint16_t ainfo[SEN_INV_MAX_SEGMENT]; uint16_t binfo[SEN_INV_MAX_SEGMENT]; @@ -1066,6 +1068,8 @@ inv->chunk = chunk; inv->header = header; inv->lexicon = lexicon; + inv->check_abort = NULL; + inv->check_abort_arg = NULL; inv->total_chunk_size = 0; load_all_segments(inv); return inv; diff -Naru ../senna-1.1.3.orig/senna.h ./senna.h --- ../senna-1.1.3.orig/senna.h 2008-06-12 14:18:12.000000000 +0900 +++ ./senna.h 2008-11-04 07:38:05.000000000 +0900 @@ -310,6 +310,7 @@ const char *newvalue, unsigned int newvalue_len); sen_records *sen_index_sel(sen_index *i, const char *string, unsigned int string_len); +void sen_index_set_abort_callback(sen_index *i, int (*cb)(void*), void *arg); int sen_records_next(sen_records *r, void *keybuf, int buf_size, int *score); sen_rc sen_records_rewind(sen_records *r); int sen_records_curr_score(sen_records *r);