isomorfeus-ferret 0.13.8 → 0.13.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/isomorfeus_ferret_ext/bm_store.c +3 -3
- data/ext/isomorfeus_ferret_ext/bzlib.h +83 -82
- data/ext/isomorfeus_ferret_ext/frb_index.c +17 -23
- data/ext/isomorfeus_ferret_ext/frb_search.c +1 -4
- data/ext/isomorfeus_ferret_ext/frb_store.c +32 -34
- data/ext/isomorfeus_ferret_ext/frt_analysis.c +4 -4
- data/ext/isomorfeus_ferret_ext/frt_analysis.h +9 -9
- data/ext/isomorfeus_ferret_ext/frt_bitvector.c +1 -1
- data/ext/isomorfeus_ferret_ext/frt_bitvector.h +1 -1
- data/ext/isomorfeus_ferret_ext/frt_compound_io.c +41 -66
- data/ext/isomorfeus_ferret_ext/frt_config.h +8 -0
- data/ext/isomorfeus_ferret_ext/frt_except.c +1 -0
- data/ext/isomorfeus_ferret_ext/frt_filter.c +2 -4
- data/ext/isomorfeus_ferret_ext/frt_fs_store.c +24 -19
- data/ext/isomorfeus_ferret_ext/frt_global.c +6 -4
- data/ext/isomorfeus_ferret_ext/frt_global.h +1 -1
- data/ext/isomorfeus_ferret_ext/frt_hash.c +40 -48
- data/ext/isomorfeus_ferret_ext/frt_hash.h +14 -16
- data/ext/isomorfeus_ferret_ext/frt_hashset.c +5 -5
- data/ext/isomorfeus_ferret_ext/frt_ind.c +2 -3
- data/ext/isomorfeus_ferret_ext/frt_index.c +148 -219
- data/ext/isomorfeus_ferret_ext/frt_index.h +31 -31
- data/ext/isomorfeus_ferret_ext/frt_lang.c +1 -4
- data/ext/isomorfeus_ferret_ext/frt_multimapper.c +8 -9
- data/ext/isomorfeus_ferret_ext/frt_multimapper.h +1 -1
- data/ext/isomorfeus_ferret_ext/frt_q_boolean.c +6 -6
- data/ext/isomorfeus_ferret_ext/frt_q_match_all.c +8 -3
- data/ext/isomorfeus_ferret_ext/frt_q_parser.c +1743 -1742
- data/ext/isomorfeus_ferret_ext/frt_q_phrase.c +1 -2
- data/ext/isomorfeus_ferret_ext/frt_q_span.c +11 -10
- data/ext/isomorfeus_ferret_ext/frt_ram_store.c +24 -40
- data/ext/isomorfeus_ferret_ext/frt_search.c +29 -28
- data/ext/isomorfeus_ferret_ext/frt_search.h +18 -19
- data/ext/isomorfeus_ferret_ext/frt_store.c +47 -40
- data/ext/isomorfeus_ferret_ext/frt_store.h +46 -48
- data/ext/isomorfeus_ferret_ext/frt_threading.h +12 -5
- data/ext/isomorfeus_ferret_ext/isomorfeus_ferret.c +4 -3
- data/ext/isomorfeus_ferret_ext/test_1710.c +1 -2
- data/ext/isomorfeus_ferret_ext/test_compound_io.c +8 -8
- data/ext/isomorfeus_ferret_ext/test_fields.c +7 -7
- data/ext/isomorfeus_ferret_ext/test_file_deleter.c +1 -1
- data/ext/isomorfeus_ferret_ext/test_filter.c +4 -3
- data/ext/isomorfeus_ferret_ext/test_fs_store.c +1 -1
- data/ext/isomorfeus_ferret_ext/test_highlighter.c +3 -1
- data/ext/isomorfeus_ferret_ext/test_index.c +61 -61
- data/ext/isomorfeus_ferret_ext/test_q_const_score.c +2 -1
- data/ext/isomorfeus_ferret_ext/test_q_filtered.c +3 -2
- data/ext/isomorfeus_ferret_ext/test_q_fuzzy.c +3 -1
- data/ext/isomorfeus_ferret_ext/test_q_span.c +8 -1
- data/ext/isomorfeus_ferret_ext/test_ram_store.c +4 -4
- data/ext/isomorfeus_ferret_ext/test_search.c +9 -4
- data/ext/isomorfeus_ferret_ext/test_segments.c +4 -3
- data/ext/isomorfeus_ferret_ext/test_sort.c +17 -9
- data/ext/isomorfeus_ferret_ext/test_term.c +4 -2
- data/ext/isomorfeus_ferret_ext/test_term_vectors.c +2 -2
- data/ext/isomorfeus_ferret_ext/test_threading.c +5 -4
- data/lib/isomorfeus/ferret/index/index.rb +8 -3
- data/lib/isomorfeus/ferret/version.rb +1 -1
- metadata +16 -2
@@ -116,7 +116,7 @@ char *frt_fn_for_generation(char *buf, const char *base, const char *ext, frt_i6
|
|
116
116
|
} else {
|
117
117
|
char b[FRT_SEGMENT_NAME_MAX_LENGTH];
|
118
118
|
char *u = u64_to_str36(b, FRT_SEGMENT_NAME_MAX_LENGTH, (frt_u64)gen);
|
119
|
-
if (ext == NULL) {
|
119
|
+
if (ext == NULL || (strcmp(ext, "") == 0)) {
|
120
120
|
sprintf(buf, "%s_%s", base, u);
|
121
121
|
} else {
|
122
122
|
sprintf(buf, "%s_%s.%s", base, u, ext);
|
@@ -303,6 +303,7 @@ FrtFieldInfo *frt_fi_init(FrtFieldInfo *fi, ID name, FrtStoreValue store, FrtCom
|
|
303
303
|
fi_set_compression(fi, compression);
|
304
304
|
fi_set_index(fi, index);
|
305
305
|
fi_set_term_vector(fi, term_vector);
|
306
|
+
fi->number = 0;
|
306
307
|
fi->ref_cnt = 1;
|
307
308
|
fi->rfi = Qnil;
|
308
309
|
return fi;
|
@@ -313,11 +314,8 @@ FrtFieldInfo *frt_fi_new(ID name, FrtStoreValue store, FrtCompressionType compre
|
|
313
314
|
return frt_fi_init(fi, name, store, compression, index, term_vector);
|
314
315
|
}
|
315
316
|
|
316
|
-
void frt_fi_deref(FrtFieldInfo *fi)
|
317
|
-
|
318
|
-
if (0 == --(fi->ref_cnt)) {
|
319
|
-
free(fi);
|
320
|
-
}
|
317
|
+
void frt_fi_deref(FrtFieldInfo *fi) {
|
318
|
+
if (FRT_DEREF(fi) == 0) free(fi);
|
321
319
|
}
|
322
320
|
|
323
321
|
FrtCompressionType frt_fi_get_compression(FrtFieldInfo *fi) {
|
@@ -369,13 +367,13 @@ FrtFieldInfos *frt_fis_alloc(void) {
|
|
369
367
|
return FRT_ALLOC(FrtFieldInfos);
|
370
368
|
}
|
371
369
|
|
372
|
-
FrtFieldInfos *frt_fis_init(FrtFieldInfos *fis, FrtStoreValue
|
373
|
-
fi_check_params(
|
370
|
+
FrtFieldInfos *frt_fis_init(FrtFieldInfos *fis, FrtStoreValue store_val, FrtCompressionType compression, FrtIndexValue index, FrtTermVectorValue term_vector) {
|
371
|
+
fi_check_params(store_val, compression, index, term_vector);
|
374
372
|
fis->field_dict = frt_h_new_ptr((frt_free_ft)&frt_fi_deref);
|
375
373
|
fis->size = 0;
|
376
374
|
fis->capa = FIELD_INFOS_INIT_CAPA;
|
377
375
|
fis->fields = FRT_ALLOC_N(FrtFieldInfo *, fis->capa);
|
378
|
-
fis->
|
376
|
+
fis->store_val = store_val;
|
379
377
|
fis->compression = compression;
|
380
378
|
fis->index = index;
|
381
379
|
fis->term_vector = term_vector;
|
@@ -397,6 +395,7 @@ FrtFieldInfo *frt_fis_add_field(FrtFieldInfos *fis, FrtFieldInfo *fi) {
|
|
397
395
|
if (!frt_h_set_safe(fis->field_dict, (void *)fi->name, fi)) {
|
398
396
|
FRT_RAISE(FRT_ARG_ERROR, "Field :%s already exists", rb_id2name(fi->name));
|
399
397
|
}
|
398
|
+
FRT_REF(fi);
|
400
399
|
fi->number = fis->size;
|
401
400
|
fis->fields[fis->size] = fi;
|
402
401
|
fis->size++;
|
@@ -416,7 +415,7 @@ int frt_fis_get_field_num(FrtFieldInfos *fis, ID name) {
|
|
416
415
|
FrtFieldInfo *frt_fis_get_or_add_field(FrtFieldInfos *fis, ID name) {
|
417
416
|
FrtFieldInfo *fi = (FrtFieldInfo *)frt_h_get(fis->field_dict, (void *)name);
|
418
417
|
if (!fi) {
|
419
|
-
fi = (FrtFieldInfo*)frt_fi_new(name, fis->
|
418
|
+
fi = (FrtFieldInfo*)frt_fi_new(name, fis->store_val, fis->compression, fis->index, fis->term_vector);
|
420
419
|
frt_fis_add_field(fis, fi);
|
421
420
|
}
|
422
421
|
return fi;
|
@@ -465,7 +464,7 @@ void frt_fis_write(FrtFieldInfos *fis, FrtOutStream *os)
|
|
465
464
|
FrtFieldInfo *fi;
|
466
465
|
const int fis_size = fis->size;
|
467
466
|
|
468
|
-
frt_os_write_vint(os, fis->
|
467
|
+
frt_os_write_vint(os, fis->store_val);
|
469
468
|
frt_os_write_vint(os, fis->index);
|
470
469
|
frt_os_write_vint(os, fis->term_vector);
|
471
470
|
frt_os_write_vint(os, fis->size);
|
@@ -537,7 +536,7 @@ char *frt_fis_to_s(FrtFieldInfos *fis)
|
|
537
536
|
" index: %s\n"
|
538
537
|
" term_vector: %s\n"
|
539
538
|
"fields:\n",
|
540
|
-
store_str[fis->
|
539
|
+
store_str[fis->store_val],
|
541
540
|
index_str[fis->index],
|
542
541
|
term_vector_str[fis->term_vector]);
|
543
542
|
for (i = 0; i < fis_size; i++) {
|
@@ -555,9 +554,8 @@ char *frt_fis_to_s(FrtFieldInfos *fis)
|
|
555
554
|
return buf;
|
556
555
|
}
|
557
556
|
|
558
|
-
void frt_fis_deref(FrtFieldInfos *fis)
|
559
|
-
{
|
560
|
-
if (0 == --(fis->ref_cnt)) {
|
557
|
+
void frt_fis_deref(FrtFieldInfos *fis) {
|
558
|
+
if (FRT_DEREF(fis) == 0) {
|
561
559
|
frt_h_destroy(fis->field_dict);
|
562
560
|
free(fis->fields);
|
563
561
|
free(fis);
|
@@ -589,6 +587,7 @@ FrtSegmentInfo *frt_si_new(char *name, int doc_cnt, FrtStore *store)
|
|
589
587
|
si->name = name;
|
590
588
|
si->doc_cnt = doc_cnt;
|
591
589
|
si->store = store;
|
590
|
+
FRT_REF(store);
|
592
591
|
si->del_gen = -1;
|
593
592
|
si->norm_gens = NULL;
|
594
593
|
si->norm_gens_size = 0;
|
@@ -602,6 +601,7 @@ static FrtSegmentInfo *si_read(FrtStore *store, FrtInStream *is)
|
|
602
601
|
FrtSegmentInfo *volatile si = FRT_ALLOC_AND_ZERO(FrtSegmentInfo);
|
603
602
|
FRT_TRY
|
604
603
|
si->store = store;
|
604
|
+
FRT_REF(store);
|
605
605
|
si->name = frt_is_read_string_safe(is);
|
606
606
|
si->doc_cnt = frt_is_read_vint(is);
|
607
607
|
si->del_gen = frt_is_read_vint(is);
|
@@ -616,6 +616,7 @@ static FrtSegmentInfo *si_read(FrtStore *store, FrtInStream *is)
|
|
616
616
|
}
|
617
617
|
si->use_compound_file = (bool)frt_is_read_byte(is);
|
618
618
|
FRT_XCATCHALL
|
619
|
+
frt_store_close(si->store);
|
619
620
|
free(si->name);
|
620
621
|
free(si);
|
621
622
|
FRT_XENDTRY
|
@@ -637,9 +638,9 @@ static void si_write(FrtSegmentInfo *si, FrtOutStream *os)
|
|
637
638
|
frt_os_write_byte(os, (frt_uchar)si->use_compound_file);
|
638
639
|
}
|
639
640
|
|
640
|
-
void
|
641
|
-
{
|
642
|
-
|
641
|
+
void frt_si_close(FrtSegmentInfo *si) {
|
642
|
+
if (FRT_DEREF(si) == 0) {
|
643
|
+
frt_store_close(si->store);
|
643
644
|
free(si->name);
|
644
645
|
free(si->norm_gens);
|
645
646
|
free(si);
|
@@ -760,8 +761,7 @@ static void which_gen_i(const char *file_name, void *arg)
|
|
760
761
|
}
|
761
762
|
}
|
762
763
|
|
763
|
-
static void si_put(FrtSegmentInfo *si, FILE *stream)
|
764
|
-
{
|
764
|
+
static void si_put(FrtSegmentInfo *si, FILE *stream) {
|
765
765
|
int i;
|
766
766
|
fprintf(stream, "\tSegmentInfo {\n");
|
767
767
|
fprintf(stream, "\t\tname = %s\n", si->name);
|
@@ -777,8 +777,7 @@ static void si_put(FrtSegmentInfo *si, FILE *stream)
|
|
777
777
|
fprintf(stream, "\t}\n");
|
778
778
|
}
|
779
779
|
|
780
|
-
void frt_sis_put(FrtSegmentInfos *sis, FILE *stream)
|
781
|
-
{
|
780
|
+
void frt_sis_put(FrtSegmentInfos *sis, FILE *stream) {
|
782
781
|
int i;
|
783
782
|
fprintf(stream, "SegmentInfos {\n");
|
784
783
|
fprintf(stream, "\tcounter = %"POSH_I64_PRINTF_PREFIX"d\n", sis->counter);
|
@@ -860,7 +859,6 @@ static void sis_find_segments_file(FrtStore *store, FindSegmentsFile *fsf, void
|
|
860
859
|
if (0 == method) {
|
861
860
|
gen = frt_sis_current_segment_generation(store);
|
862
861
|
if (gen == -1) {
|
863
|
-
// fprintf(stderr, ">>\n%s\n>>\n", frt_store_to_s(store));
|
864
862
|
FRT_RAISE(FRT_FILE_NOT_FOUND_ERROR, "couldn't find segments file");
|
865
863
|
}
|
866
864
|
}
|
@@ -946,32 +944,6 @@ static void sis_find_segments_file(FrtStore *store, FindSegmentsFile *fsf, void
|
|
946
944
|
return;
|
947
945
|
case FRT_IO_ERROR: case FRT_FILE_NOT_FOUND_ERROR: case FRT_EOF_ERROR:
|
948
946
|
FRT_HANDLED();
|
949
|
-
/*
|
950
|
-
if (gen != frt_sis_current_segment_generation(store)) {
|
951
|
-
fprintf(stderr, "%lld != %lld\n",
|
952
|
-
gen, frt_sis_current_segment_generation(store));
|
953
|
-
fprintf(stderr, "%s\n", xcontext.msg);
|
954
|
-
}
|
955
|
-
else {
|
956
|
-
char *sl = frt_store_to_s(store);
|
957
|
-
bool done = false;
|
958
|
-
fprintf(stderr, "%s\n>>>\n%s", xcontext.msg, sl);
|
959
|
-
free(sl);
|
960
|
-
while (!done) {
|
961
|
-
FRT_TRY
|
962
|
-
frt_sis_put(frt_sis_read(store), stderr);
|
963
|
-
done = true;
|
964
|
-
FRT_XCATCHALL
|
965
|
-
FRT_HANDLED();
|
966
|
-
FRT_XENDTRY
|
967
|
-
}
|
968
|
-
}
|
969
|
-
|
970
|
-
char *sl = frt_store_to_s(store);
|
971
|
-
fprintf(stderr, "%s\n>>>\n%s", xcontext.msg, sl);
|
972
|
-
free(sl);
|
973
|
-
*/
|
974
|
-
|
975
947
|
/* Save the original root cause: */
|
976
948
|
/* TODO:LOG "primary Exception on '" + segmentFileName + "': " +
|
977
949
|
* err + "'; will retry: retry=" + retry + "; gen = " + gen */
|
@@ -1031,8 +1003,9 @@ void frt_sis_destroy(FrtSegmentInfos *sis)
|
|
1031
1003
|
int i;
|
1032
1004
|
const int sis_size = sis->size;
|
1033
1005
|
for (i = 0; i < sis_size; i++) {
|
1034
|
-
|
1006
|
+
frt_si_close(sis->segs[i]);
|
1035
1007
|
}
|
1008
|
+
if (sis->store) frt_store_close(sis->store);
|
1036
1009
|
if (sis->fis) frt_fis_deref(sis->fis);
|
1037
1010
|
free(sis->segs);
|
1038
1011
|
free(sis);
|
@@ -1052,7 +1025,7 @@ void frt_sis_del_at(FrtSegmentInfos *sis, int at)
|
|
1052
1025
|
{
|
1053
1026
|
int i;
|
1054
1027
|
const int sis_size = --(sis->size);
|
1055
|
-
|
1028
|
+
frt_si_close(sis->segs[at]);
|
1056
1029
|
for (i = at; i < sis_size; i++) {
|
1057
1030
|
sis->segs[i] = sis->segs[i+1];
|
1058
1031
|
}
|
@@ -1063,7 +1036,7 @@ void frt_sis_del_from_to(FrtSegmentInfos *sis, int from, int to)
|
|
1063
1036
|
int i, num_to_del = to - from;
|
1064
1037
|
const int sis_size = sis->size -= num_to_del;
|
1065
1038
|
for (i = from; i < to; i++) {
|
1066
|
-
|
1039
|
+
frt_si_close(sis->segs[i]);
|
1067
1040
|
}
|
1068
1041
|
for (i = from; i < sis_size; i++) {
|
1069
1042
|
sis->segs[i] = sis->segs[i+num_to_del];
|
@@ -1083,6 +1056,7 @@ static void frt_sis_read_i(FrtStore *store, FindSegmentsFile *fsf, FrtIndexReade
|
|
1083
1056
|
FRT_TRY
|
1084
1057
|
is = store->open_input(store, seg_file_name);
|
1085
1058
|
sis->store = store;
|
1059
|
+
FRT_REF(store);
|
1086
1060
|
sis->generation = fsf->generation;
|
1087
1061
|
sis->format = frt_is_read_u32(is); /* do nothing. it's the first version */
|
1088
1062
|
sis->version = frt_is_read_u64(is);
|
@@ -1530,7 +1504,6 @@ FrtLazyDocField *frt_lazy_doc_get(FrtLazyDoc *self, ID field) {
|
|
1530
1504
|
|
1531
1505
|
FrtFieldsReader *frt_fr_open(FrtStore *store, const char *segment, FrtFieldInfos *fis) {
|
1532
1506
|
FrtFieldsReader *fr = FRT_ALLOC(FrtFieldsReader);
|
1533
|
-
FrtInStream *fdx_in;
|
1534
1507
|
char file_name[FRT_SEGMENT_NAME_MAX_LENGTH];
|
1535
1508
|
size_t segment_len = strlen(segment);
|
1536
1509
|
|
@@ -1541,9 +1514,10 @@ FrtFieldsReader *frt_fr_open(FrtStore *store, const char *segment, FrtFieldInfos
|
|
1541
1514
|
strcpy(file_name + segment_len, ".fdt");
|
1542
1515
|
fr->fdt_in = store->open_input(store, file_name);
|
1543
1516
|
strcpy(file_name + segment_len, ".fdx");
|
1544
|
-
|
1545
|
-
fr->size = frt_is_length(fdx_in) / FIELDS_IDX_PTR_SIZE;
|
1517
|
+
fr->fdx_in = store->open_input(store, file_name);
|
1518
|
+
fr->size = frt_is_length(fr->fdx_in) / FIELDS_IDX_PTR_SIZE;
|
1546
1519
|
fr->store = store;
|
1520
|
+
FRT_REF(store);
|
1547
1521
|
|
1548
1522
|
return fr;
|
1549
1523
|
}
|
@@ -1552,6 +1526,7 @@ FrtFieldsReader *frt_fr_clone(FrtFieldsReader *orig) {
|
|
1552
1526
|
FrtFieldsReader *fr = FRT_ALLOC(FrtFieldsReader);
|
1553
1527
|
|
1554
1528
|
memcpy(fr, orig, sizeof(FrtFieldsReader));
|
1529
|
+
FRT_REF(fr->store);
|
1555
1530
|
fr->fdx_in = frt_is_clone(orig->fdx_in);
|
1556
1531
|
fr->fdt_in = frt_is_clone(orig->fdt_in);
|
1557
1532
|
|
@@ -1561,6 +1536,7 @@ FrtFieldsReader *frt_fr_clone(FrtFieldsReader *orig) {
|
|
1561
1536
|
void frt_fr_close(FrtFieldsReader *fr) {
|
1562
1537
|
frt_is_close(fr->fdt_in);
|
1563
1538
|
frt_is_close(fr->fdx_in);
|
1539
|
+
frt_store_close(fr->store);
|
1564
1540
|
free(fr);
|
1565
1541
|
}
|
1566
1542
|
|
@@ -1591,7 +1567,7 @@ static void frt_fr_read_compressed_fields(FrtFieldsReader *fr, FrtDocField *df,
|
|
1591
1567
|
FrtDocument *frt_fr_get_doc(FrtFieldsReader *fr, int doc_num)
|
1592
1568
|
{
|
1593
1569
|
int i, j;
|
1594
|
-
|
1570
|
+
frt_off_t pos;
|
1595
1571
|
int stored_cnt;
|
1596
1572
|
FrtDocument *doc = frt_doc_new();
|
1597
1573
|
FrtInStream *fdx_in = fr->fdx_in;
|
@@ -1638,7 +1614,7 @@ FrtLazyDoc *frt_fr_get_lazy_doc(FrtFieldsReader *fr, int doc_num)
|
|
1638
1614
|
{
|
1639
1615
|
int start = 0;
|
1640
1616
|
int i, j;
|
1641
|
-
|
1617
|
+
frt_off_t pos;
|
1642
1618
|
int stored_cnt;
|
1643
1619
|
FrtLazyDoc *lazy_doc;
|
1644
1620
|
FrtInStream *fdx_in = fr->fdx_in;
|
@@ -1668,7 +1644,7 @@ FrtLazyDoc *frt_fr_get_lazy_doc(FrtFieldsReader *fr, int doc_num)
|
|
1668
1644
|
lazy_doc_add_field(lazy_doc, lazy_df, i);
|
1669
1645
|
}
|
1670
1646
|
/* correct the starts to their correct absolute positions */
|
1671
|
-
const
|
1647
|
+
const frt_off_t abs_start = frt_is_pos(fdt_in);
|
1672
1648
|
for (i = 0; i < stored_cnt; i++) {
|
1673
1649
|
FrtLazyDocField *lazy_df = lazy_doc->fields[i];
|
1674
1650
|
const int df_size = lazy_df->size;
|
@@ -1745,7 +1721,7 @@ FrtHash *frt_fr_get_tv(FrtFieldsReader *fr, int doc_num)
|
|
1745
1721
|
int i;
|
1746
1722
|
FrtInStream *fdx_in = fr->fdx_in;
|
1747
1723
|
FrtInStream *fdt_in = fr->fdt_in;
|
1748
|
-
|
1724
|
+
frt_off_t data_ptr, field_index_ptr;
|
1749
1725
|
int field_cnt;
|
1750
1726
|
int *field_nums;
|
1751
1727
|
|
@@ -1778,13 +1754,12 @@ FrtHash *frt_fr_get_tv(FrtFieldsReader *fr, int doc_num)
|
|
1778
1754
|
return term_vectors;
|
1779
1755
|
}
|
1780
1756
|
|
1781
|
-
FrtTermVector *frt_fr_get_field_tv(FrtFieldsReader *fr, int doc_num, int field_num)
|
1782
|
-
{
|
1757
|
+
FrtTermVector *frt_fr_get_field_tv(FrtFieldsReader *fr, int doc_num, int field_num) {
|
1783
1758
|
FrtTermVector *tv = NULL;
|
1784
1759
|
|
1785
1760
|
if (doc_num >= 0 && doc_num < fr->size) {
|
1786
1761
|
int i, fnum = -1;
|
1787
|
-
|
1762
|
+
frt_off_t field_index_ptr;
|
1788
1763
|
int field_cnt;
|
1789
1764
|
int offset = 0;
|
1790
1765
|
FrtInStream *fdx_in = fr->fdx_in;
|
@@ -2065,7 +2040,7 @@ void frt_fw_add_postings(FrtFieldsWriter *fw,
|
|
2065
2040
|
int i, delta_start, delta_length;
|
2066
2041
|
const char *last_term = FRT_EMPTY_STRING;
|
2067
2042
|
FrtOutStream *fdt_out = fw->fdt_out;
|
2068
|
-
|
2043
|
+
frt_off_t fdt_start_pos = frt_os_pos(fdt_out);
|
2069
2044
|
FrtPostingList *plist;
|
2070
2045
|
FrtPosting *posting;
|
2071
2046
|
FrtOccurence *occ;
|
@@ -2175,13 +2150,11 @@ static void sti_destroy(FrtSegmentTermIndex *sti)
|
|
2175
2150
|
free(sti);
|
2176
2151
|
}
|
2177
2152
|
|
2178
|
-
static void sti_ensure_index_is_read(FrtSegmentTermIndex *sti,
|
2179
|
-
FrtTermEnum *index_te)
|
2180
|
-
{
|
2153
|
+
static void sti_ensure_index_is_read(FrtSegmentTermIndex *sti, FrtTermEnum *index_te) {
|
2181
2154
|
if (NULL == sti->index_terms) {
|
2182
2155
|
int i;
|
2183
2156
|
int index_cnt = sti->index_cnt;
|
2184
|
-
|
2157
|
+
frt_off_t index_ptr = 0;
|
2185
2158
|
ste_reset(index_te);
|
2186
2159
|
frt_is_seek(STE(index_te)->is, sti->index_ptr);
|
2187
2160
|
STE(index_te)->size = sti->index_cnt;
|
@@ -2241,8 +2214,7 @@ static int sti_get_index_offset(FrtSegmentTermIndex *sti, const char *term)
|
|
2241
2214
|
}\
|
2242
2215
|
} while (0)
|
2243
2216
|
|
2244
|
-
FrtSegmentFieldIndex *frt_sfi_open(FrtStore *store, const char *segment)
|
2245
|
-
{
|
2217
|
+
FrtSegmentFieldIndex *frt_sfi_open(FrtStore *store, const char *segment) {
|
2246
2218
|
int field_count;
|
2247
2219
|
FrtSegmentFieldIndex *sfi = FRT_ALLOC(FrtSegmentFieldIndex);
|
2248
2220
|
char file_name[FRT_SEGMENT_NAME_MAX_LENGTH];
|
@@ -2271,12 +2243,12 @@ FrtSegmentFieldIndex *frt_sfi_open(FrtStore *store, const char *segment)
|
|
2271
2243
|
|
2272
2244
|
sprintf(file_name, "%s.tix", segment);
|
2273
2245
|
is = store->open_input(store, file_name);
|
2246
|
+
FRT_DEREF(is);
|
2274
2247
|
sfi->index_te = frt_ste_new(is, sfi);
|
2275
2248
|
return sfi;
|
2276
2249
|
}
|
2277
2250
|
|
2278
|
-
void frt_sfi_close(FrtSegmentFieldIndex *sfi)
|
2279
|
-
{
|
2251
|
+
void frt_sfi_close(FrtSegmentFieldIndex *sfi) {
|
2280
2252
|
frt_mutex_destroy(&sfi->mutex);
|
2281
2253
|
frt_ste_close(sfi->index_te);
|
2282
2254
|
frt_h_destroy(sfi->field_dict);
|
@@ -2287,8 +2259,7 @@ void frt_sfi_close(FrtSegmentFieldIndex *sfi)
|
|
2287
2259
|
* SegmentTermEnum
|
2288
2260
|
****************************************************************************/
|
2289
2261
|
|
2290
|
-
static int term_read(char *buf, FrtInStream *is)
|
2291
|
-
{
|
2262
|
+
static int term_read(char *buf, FrtInStream *is) {
|
2292
2263
|
int start = (int)frt_is_read_vint(is);
|
2293
2264
|
int length = (int)frt_is_read_vint(is);
|
2294
2265
|
int total_length = start + length;
|
@@ -2297,8 +2268,7 @@ static int term_read(char *buf, FrtInStream *is)
|
|
2297
2268
|
return total_length;
|
2298
2269
|
}
|
2299
2270
|
|
2300
|
-
static char *ste_next(FrtTermEnum *te)
|
2301
|
-
{
|
2271
|
+
static char *ste_next(FrtTermEnum *te) {
|
2302
2272
|
FrtTermInfo *ti;
|
2303
2273
|
FrtInStream *is = STE(te)->is;
|
2304
2274
|
|
@@ -2323,32 +2293,27 @@ static char *ste_next(FrtTermEnum *te)
|
|
2323
2293
|
return te->curr_term;
|
2324
2294
|
}
|
2325
2295
|
|
2326
|
-
static void ste_reset(FrtTermEnum *te)
|
2327
|
-
{
|
2296
|
+
static void ste_reset(FrtTermEnum *te) {
|
2328
2297
|
STE(te)->pos = -1;
|
2329
2298
|
te->curr_term[0] = '\0';
|
2330
2299
|
te->curr_term_len = 0;
|
2331
2300
|
FRT_ZEROSET(&(te->curr_ti), FrtTermInfo);
|
2332
2301
|
}
|
2333
2302
|
|
2334
|
-
static FrtTermEnum *ste_set_field(FrtTermEnum *te, int field_num)
|
2335
|
-
|
2336
|
-
FrtSegmentTermIndex *sti
|
2337
|
-
= (FrtSegmentTermIndex *)frt_h_get_int(STE(te)->sfi->field_dict, field_num);
|
2303
|
+
static FrtTermEnum *ste_set_field(FrtTermEnum *te, int field_num) {
|
2304
|
+
FrtSegmentTermIndex *sti = (FrtSegmentTermIndex *)frt_h_get_int(STE(te)->sfi->field_dict, field_num);
|
2338
2305
|
ste_reset(te);
|
2339
2306
|
te->field_num = field_num;
|
2340
2307
|
if (sti) {
|
2341
2308
|
STE(te)->size = sti->size;
|
2342
2309
|
frt_is_seek(STE(te)->is, sti->ptr);
|
2343
|
-
}
|
2344
|
-
else {
|
2310
|
+
} else {
|
2345
2311
|
STE(te)->size = 0;
|
2346
2312
|
}
|
2347
2313
|
return te;
|
2348
2314
|
}
|
2349
2315
|
|
2350
|
-
static void frt_ste_index_seek(FrtTermEnum *te, FrtSegmentTermIndex *sti, int idx_offset)
|
2351
|
-
{
|
2316
|
+
static void frt_ste_index_seek(FrtTermEnum *te, FrtSegmentTermIndex *sti, int idx_offset) {
|
2352
2317
|
int term_len = sti->index_term_lens[idx_offset];
|
2353
2318
|
frt_is_seek(STE(te)->is, sti->index_ptrs[idx_offset]);
|
2354
2319
|
STE(te)->pos = STE(te)->sfi->index_interval * idx_offset - 1;
|
@@ -2359,11 +2324,9 @@ static void frt_ste_index_seek(FrtTermEnum *te, FrtSegmentTermIndex *sti, int id
|
|
2359
2324
|
te->curr_ti = sti->index_term_infos[idx_offset];
|
2360
2325
|
}
|
2361
2326
|
|
2362
|
-
static char *ste_scan_to(FrtTermEnum *te, const char *term)
|
2363
|
-
{
|
2327
|
+
static char *ste_scan_to(FrtTermEnum *te, const char *term) {
|
2364
2328
|
FrtSegmentFieldIndex *sfi = STE(te)->sfi;
|
2365
|
-
FrtSegmentTermIndex *sti
|
2366
|
-
= (FrtSegmentTermIndex *)frt_h_get_int(sfi->field_dict, te->field_num);
|
2329
|
+
FrtSegmentTermIndex *sti = (FrtSegmentTermIndex *)frt_h_get_int(sfi->field_dict, te->field_num);
|
2367
2330
|
if (sti && sti->size > 0) {
|
2368
2331
|
SFI_ENSURE_INDEX_IS_READ(sfi, sti);
|
2369
2332
|
if (term[0] == '\0') {
|
@@ -2383,9 +2346,7 @@ static char *ste_scan_to(FrtTermEnum *te, const char *term)
|
|
2383
2346
|
frt_ste_index_seek(te, sti, sti_get_index_offset(sti, term));
|
2384
2347
|
return te_skip_to(te, term);
|
2385
2348
|
}
|
2386
|
-
|
2387
|
-
return NULL;
|
2388
|
-
}
|
2349
|
+
return NULL;
|
2389
2350
|
}
|
2390
2351
|
|
2391
2352
|
static FrtSegmentTermEnum *ste_allocate(void) {
|
@@ -2398,8 +2359,7 @@ static FrtSegmentTermEnum *ste_allocate(void) {
|
|
2398
2359
|
return ste;
|
2399
2360
|
}
|
2400
2361
|
|
2401
|
-
FrtTermEnum *frt_ste_clone(FrtTermEnum *other_te)
|
2402
|
-
{
|
2362
|
+
FrtTermEnum *frt_ste_clone(FrtTermEnum *other_te) {
|
2403
2363
|
FrtSegmentTermEnum *ste = ste_allocate();
|
2404
2364
|
|
2405
2365
|
memcpy(ste, other_te, sizeof(FrtSegmentTermEnum));
|
@@ -2407,8 +2367,7 @@ FrtTermEnum *frt_ste_clone(FrtTermEnum *other_te)
|
|
2407
2367
|
return TE(ste);
|
2408
2368
|
}
|
2409
2369
|
|
2410
|
-
void frt_ste_close(FrtTermEnum *te)
|
2411
|
-
{
|
2370
|
+
void frt_ste_close(FrtTermEnum *te) {
|
2412
2371
|
frt_is_close(STE(te)->is);
|
2413
2372
|
free(te);
|
2414
2373
|
}
|
@@ -2422,8 +2381,7 @@ static char *frt_ste_get_term(FrtTermEnum *te, int pos)
|
|
2422
2381
|
else if (pos != ste->pos) {
|
2423
2382
|
int idx_int = ste->sfi->index_interval;
|
2424
2383
|
if ((pos < ste->pos) || pos > (1 + ste->pos / idx_int) * idx_int) {
|
2425
|
-
FrtSegmentTermIndex *sti = (FrtSegmentTermIndex *)frt_h_get_int(
|
2426
|
-
ste->sfi->field_dict, te->field_num);
|
2384
|
+
FrtSegmentTermIndex *sti = (FrtSegmentTermIndex *)frt_h_get_int(ste->sfi->field_dict, te->field_num);
|
2427
2385
|
SFI_ENSURE_INDEX_IS_READ(ste->sfi, sti);
|
2428
2386
|
frt_ste_index_seek(te, sti, pos / idx_int);
|
2429
2387
|
}
|
@@ -2443,6 +2401,7 @@ FrtTermEnum *frt_ste_new(FrtInStream *is, FrtSegmentFieldIndex *sfi)
|
|
2443
2401
|
|
2444
2402
|
TE(ste)->field_num = -1;
|
2445
2403
|
ste->is = is;
|
2404
|
+
FRT_REF(is);
|
2446
2405
|
ste->size = 0;
|
2447
2406
|
ste->pos = -1;
|
2448
2407
|
ste->sfi = sfi;
|
@@ -2490,25 +2449,6 @@ static bool tew_lt(const TermEnumWrapper *tew1, const TermEnumWrapper *tew2)
|
|
2490
2449
|
}
|
2491
2450
|
}
|
2492
2451
|
|
2493
|
-
/*
|
2494
|
-
static void tew_load_doc_map(TermEnumWrapper *tew)
|
2495
|
-
{
|
2496
|
-
int j = 0, i;
|
2497
|
-
FrtIndexReader *ir = tew->ir;
|
2498
|
-
int max_doc = ir->max_doc(ir);
|
2499
|
-
int *doc_map = tew->doc_map = FRT_ALLOC_N(int, max_doc);
|
2500
|
-
|
2501
|
-
for (i = 0; i < max_doc; i++) {
|
2502
|
-
if (ir->is_deleted(ir, i)) {
|
2503
|
-
doc_map[i] = -1;
|
2504
|
-
}
|
2505
|
-
else {
|
2506
|
-
doc_map[i] = j++;
|
2507
|
-
}
|
2508
|
-
}
|
2509
|
-
}
|
2510
|
-
*/
|
2511
|
-
|
2512
2452
|
static char *tew_next(TermEnumWrapper *tew)
|
2513
2453
|
{
|
2514
2454
|
return (tew->term = tew->te->next(tew->te));
|
@@ -2521,6 +2461,7 @@ static char *tew_skip_to(TermEnumWrapper *tew, const char *term)
|
|
2521
2461
|
|
2522
2462
|
static void tew_destroy(TermEnumWrapper *tew)
|
2523
2463
|
{
|
2464
|
+
frt_ir_close(tew->ir);
|
2524
2465
|
if (tew->doc_map) {
|
2525
2466
|
free(tew->doc_map);
|
2526
2467
|
}
|
@@ -2530,6 +2471,7 @@ static void tew_destroy(TermEnumWrapper *tew)
|
|
2530
2471
|
static TermEnumWrapper *tew_setup(TermEnumWrapper *tew, int index, FrtTermEnum *te, FrtIndexReader *ir) {
|
2531
2472
|
tew->index = index;
|
2532
2473
|
tew->ir = ir;
|
2474
|
+
FRT_REF(ir);
|
2533
2475
|
tew->te = te;
|
2534
2476
|
tew->term = te->curr_term;
|
2535
2477
|
tew->doc_map = NULL;
|
@@ -2689,11 +2631,13 @@ FrtTermInfosReader *frt_tir_open(FrtStore *store, FrtSegmentFieldIndex *sfi, con
|
|
2689
2631
|
char file_name[FRT_SEGMENT_NAME_MAX_LENGTH];
|
2690
2632
|
|
2691
2633
|
sprintf(file_name, "%s.tis", segment);
|
2692
|
-
|
2634
|
+
FrtInStream *is = store->open_input(store, file_name);
|
2635
|
+
FRT_DEREF(is);
|
2636
|
+
tir->orig_te = frt_ste_new(is, sfi);
|
2637
|
+
tir->thread_te = 0;
|
2693
2638
|
frt_thread_key_create(&tir->thread_te, NULL);
|
2694
2639
|
tir->te_bucket = frt_ary_new();
|
2695
2640
|
tir->field_num = -1;
|
2696
|
-
|
2697
2641
|
return tir;
|
2698
2642
|
}
|
2699
2643
|
|
@@ -2751,14 +2695,9 @@ char *frt_tir_get_term(FrtTermInfosReader *tir, int pos) {
|
|
2751
2695
|
}
|
2752
2696
|
}
|
2753
2697
|
|
2754
|
-
|
2755
2698
|
void frt_tir_close(FrtTermInfosReader *tir) {
|
2756
2699
|
frt_ary_destroy(tir->te_bucket, (frt_free_ft)&frt_ste_close);
|
2757
2700
|
frt_ste_close(tir->orig_te);
|
2758
|
-
|
2759
|
-
/* fix for some dodgy old versions of pthread */
|
2760
|
-
frt_thread_setspecific(tir->thread_te, NULL);
|
2761
|
-
|
2762
2701
|
frt_thread_key_delete(tir->thread_te);
|
2763
2702
|
free(tir);
|
2764
2703
|
}
|
@@ -2852,7 +2791,7 @@ static void tw_add(FrtTermWriter *tw, const char *term, int term_len, FrtTermInf
|
|
2852
2791
|
}
|
2853
2792
|
|
2854
2793
|
void frt_tiw_add(FrtTermInfosWriter *tiw, const char *term, int term_len, FrtTermInfo *ti) {
|
2855
|
-
|
2794
|
+
frt_off_t tis_pos;
|
2856
2795
|
|
2857
2796
|
if (0 == (tiw->tis_writer->counter % tiw->index_interval)) {
|
2858
2797
|
/* add an index term */
|
@@ -3025,8 +2964,8 @@ static bool stde_skip_to(FrtTermDocEnum *tde, int target_doc_num) {
|
|
3025
2964
|
if (stde->doc_freq >= stde->skip_interval
|
3026
2965
|
&& target_doc_num > stde->doc_num) { /* optimized case */
|
3027
2966
|
int last_skip_doc;
|
3028
|
-
|
3029
|
-
|
2967
|
+
frt_off_t last_frq_ptr;
|
2968
|
+
frt_off_t last_prx_ptr;
|
3030
2969
|
int num_skipped;
|
3031
2970
|
|
3032
2971
|
if (NULL == stde->skip_in) {
|
@@ -3097,7 +3036,7 @@ static void stde_skip_prox(FrtSegmentTermDocEnum *stde) {
|
|
3097
3036
|
(void)stde;
|
3098
3037
|
}
|
3099
3038
|
|
3100
|
-
static void stde_seek_prox(FrtSegmentTermDocEnum *stde,
|
3039
|
+
static void stde_seek_prox(FrtSegmentTermDocEnum *stde, frt_off_t prx_ptr) {
|
3101
3040
|
(void)stde;
|
3102
3041
|
(void)prx_ptr;
|
3103
3042
|
}
|
@@ -3193,7 +3132,7 @@ static void stpe_skip_prox(FrtSegmentTermDocEnum *stde)
|
|
3193
3132
|
frt_is_skip_vints(stde->prx_in, stde->freq);
|
3194
3133
|
}
|
3195
3134
|
|
3196
|
-
static void stpe_seek_prox(FrtSegmentTermDocEnum *stde,
|
3135
|
+
static void stpe_seek_prox(FrtSegmentTermDocEnum *stde, frt_off_t prx_ptr)
|
3197
3136
|
{
|
3198
3137
|
frt_is_seek(stde->prx_in, prx_ptr);
|
3199
3138
|
stde->prx_cnt = 0;
|
@@ -3696,11 +3635,13 @@ FrtDeleter *frt_deleter_new(FrtSegmentInfos *sis, FrtStore *store) {
|
|
3696
3635
|
FrtDeleter *dlr = FRT_ALLOC(FrtDeleter);
|
3697
3636
|
dlr->sis = sis;
|
3698
3637
|
dlr->store = store;
|
3638
|
+
FRT_REF(store);
|
3699
3639
|
dlr->pending = frt_hs_new_str(&free);
|
3700
3640
|
return dlr;
|
3701
3641
|
}
|
3702
3642
|
|
3703
3643
|
void frt_deleter_destroy(FrtDeleter *dlr) {
|
3644
|
+
frt_store_close(dlr->store);
|
3704
3645
|
frt_hs_destroy(dlr->pending);
|
3705
3646
|
free(dlr);
|
3706
3647
|
}
|
@@ -3821,7 +3762,7 @@ void frt_deleter_find_deletable_files(FrtDeleter *dlr) {
|
|
3821
3762
|
FrtStore *store = dlr->store;
|
3822
3763
|
struct DelFilesArg dfa;
|
3823
3764
|
FrtHash *current = dfa.current
|
3824
|
-
= frt_h_new_str((frt_free_ft)NULL, (frt_free_ft)
|
3765
|
+
= frt_h_new_str((frt_free_ft)NULL, (frt_free_ft)frt_si_close);
|
3825
3766
|
dfa.dlr = dlr;
|
3826
3767
|
|
3827
3768
|
for(i = 0; i < sis->size; i++) {
|
@@ -4096,37 +4037,28 @@ void frt_ir_commit(FrtIndexReader *ir)
|
|
4096
4037
|
frt_mutex_unlock(&ir->mutex);
|
4097
4038
|
}
|
4098
4039
|
|
4099
|
-
void frt_ir_close(FrtIndexReader *ir)
|
4100
|
-
{
|
4101
|
-
|
4102
|
-
|
4040
|
+
void frt_ir_close(FrtIndexReader *ir) {
|
4041
|
+
if (ir->ref_cnt == 0) {
|
4042
|
+
fprintf(stderr, "ir ref_cnt to low\n");
|
4043
|
+
FRT_RAISE(FRT_STATE_ERROR, "ir ref_cnt to low\n");
|
4044
|
+
}
|
4045
|
+
|
4046
|
+
if (FRT_DEREF(ir) == 0) {
|
4047
|
+
frt_mutex_lock(&ir->mutex);
|
4103
4048
|
ir_commit_i(ir);
|
4104
4049
|
ir->close_i(ir);
|
4105
|
-
if (ir->store)
|
4106
|
-
|
4107
|
-
|
4108
|
-
if (ir->
|
4109
|
-
|
4110
|
-
}
|
4111
|
-
if (ir->cache) {
|
4112
|
-
frt_h_destroy(ir->cache);
|
4113
|
-
}
|
4114
|
-
if (ir->field_index_cache) {
|
4115
|
-
frt_h_destroy(ir->field_index_cache);
|
4116
|
-
}
|
4117
|
-
if (ir->deleter && ir->is_owner) {
|
4118
|
-
frt_deleter_destroy(ir->deleter);
|
4119
|
-
}
|
4050
|
+
if (ir->store) frt_store_close(ir->store);
|
4051
|
+
if (ir->is_owner && ir->sis) frt_sis_destroy(ir->sis);
|
4052
|
+
if (ir->cache) frt_h_destroy(ir->cache);
|
4053
|
+
if (ir->field_index_cache) frt_h_destroy(ir->field_index_cache);
|
4054
|
+
if (ir->deleter && ir->is_owner) frt_deleter_destroy(ir->deleter);
|
4120
4055
|
free(ir->fake_norms);
|
4121
4056
|
|
4122
|
-
frt_mutex_destroy(&ir->mutex);
|
4123
4057
|
frt_mutex_destroy(&ir->field_index_mutex);
|
4124
|
-
free(ir);
|
4125
|
-
}
|
4126
|
-
else {
|
4127
4058
|
frt_mutex_unlock(&ir->mutex);
|
4059
|
+
frt_mutex_destroy(&ir->mutex);
|
4060
|
+
free(ir);
|
4128
4061
|
}
|
4129
|
-
|
4130
4062
|
}
|
4131
4063
|
|
4132
4064
|
/**
|
@@ -4160,6 +4092,7 @@ static Norm *norm_create(FrtInStream *is, int field_num)
|
|
4160
4092
|
Norm *norm = FRT_ALLOC(Norm);
|
4161
4093
|
|
4162
4094
|
norm->is = is;
|
4095
|
+
FRT_REF(is);
|
4163
4096
|
norm->field_num = field_num;
|
4164
4097
|
norm->bytes = NULL;
|
4165
4098
|
norm->is_dirty = false;
|
@@ -4202,10 +4135,8 @@ static void norm_rewrite(Norm *norm, FrtStore *store, FrtDeleter *dlr,
|
|
4202
4135
|
#define SR(ir) ((FrtSegmentReader *)(ir))
|
4203
4136
|
#define SR_SIZE(ir) (SR(ir)->fr->size)
|
4204
4137
|
|
4205
|
-
static FrtFieldsReader *sr_fr(FrtSegmentReader *sr)
|
4206
|
-
{
|
4138
|
+
static FrtFieldsReader *sr_fr(FrtSegmentReader *sr) {
|
4207
4139
|
FrtFieldsReader *fr;
|
4208
|
-
|
4209
4140
|
if (NULL == (fr = (FrtFieldsReader *)frt_thread_getspecific(sr->thread_fr))) {
|
4210
4141
|
fr = frt_fr_clone(sr->fr);
|
4211
4142
|
frt_ary_push(sr->fr_bucket, fr);
|
@@ -4219,17 +4150,13 @@ static bool sr_is_deleted_i(FrtSegmentReader *sr, int doc_num)
|
|
4219
4150
|
return (NULL != sr->deleted_docs && frt_bv_get(sr->deleted_docs, doc_num));
|
4220
4151
|
}
|
4221
4152
|
|
4222
|
-
static void sr_get_norms_into_i(FrtSegmentReader *sr, int field_num,
|
4223
|
-
frt_uchar *buf)
|
4224
|
-
{
|
4153
|
+
static void sr_get_norms_into_i(FrtSegmentReader *sr, int field_num, frt_uchar *buf) {
|
4225
4154
|
Norm *norm = (Norm *)frt_h_get_int(sr->norms, field_num);
|
4226
4155
|
if (NULL == norm) {
|
4227
4156
|
memset(buf, 0, SR_SIZE(sr));
|
4228
|
-
}
|
4229
|
-
else if (NULL != norm->bytes) { /* can copy from cache */
|
4157
|
+
} else if (NULL != norm->bytes) { /* can copy from cache */
|
4230
4158
|
memcpy(buf, norm->bytes, SR_SIZE(sr));
|
4231
|
-
}
|
4232
|
-
else {
|
4159
|
+
} else {
|
4233
4160
|
FrtInStream *norm_in = frt_is_clone(norm->is);
|
4234
4161
|
/* read from disk */
|
4235
4162
|
frt_is_seek(norm_in, 0);
|
@@ -4238,8 +4165,7 @@ static void sr_get_norms_into_i(FrtSegmentReader *sr, int field_num,
|
|
4238
4165
|
}
|
4239
4166
|
}
|
4240
4167
|
|
4241
|
-
static frt_uchar *sr_get_norms_i(FrtSegmentReader *sr, int field_num)
|
4242
|
-
{
|
4168
|
+
static frt_uchar *sr_get_norms_i(FrtSegmentReader *sr, int field_num) {
|
4243
4169
|
Norm *norm = (Norm *)frt_h_get_int(sr->norms, field_num);
|
4244
4170
|
if (NULL == norm) { /* not an indexed field */
|
4245
4171
|
return NULL;
|
@@ -4253,8 +4179,7 @@ static frt_uchar *sr_get_norms_i(FrtSegmentReader *sr, int field_num)
|
|
4253
4179
|
return norm->bytes;
|
4254
4180
|
}
|
4255
4181
|
|
4256
|
-
static void sr_set_norm_i(FrtIndexReader *ir, int doc_num, int field_num, frt_uchar b)
|
4257
|
-
{
|
4182
|
+
static void sr_set_norm_i(FrtIndexReader *ir, int doc_num, int field_num, frt_uchar b) {
|
4258
4183
|
Norm *norm = (Norm *)frt_h_get_int(SR(ir)->norms, field_num);
|
4259
4184
|
if (NULL != norm) { /* has_norms */
|
4260
4185
|
ir->has_changes = true;
|
@@ -4264,8 +4189,7 @@ static void sr_set_norm_i(FrtIndexReader *ir, int doc_num, int field_num, frt_uc
|
|
4264
4189
|
}
|
4265
4190
|
}
|
4266
4191
|
|
4267
|
-
static void sr_delete_doc_i(FrtIndexReader *ir, int doc_num)
|
4268
|
-
{
|
4192
|
+
static void sr_delete_doc_i(FrtIndexReader *ir, int doc_num) {
|
4269
4193
|
if (NULL == SR(ir)->deleted_docs) {
|
4270
4194
|
SR(ir)->deleted_docs = frt_bv_new();
|
4271
4195
|
}
|
@@ -4276,8 +4200,7 @@ static void sr_delete_doc_i(FrtIndexReader *ir, int doc_num)
|
|
4276
4200
|
frt_bv_set(SR(ir)->deleted_docs, doc_num);
|
4277
4201
|
}
|
4278
4202
|
|
4279
|
-
static void sr_undelete_all_i(FrtIndexReader *ir)
|
4280
|
-
{
|
4203
|
+
static void sr_undelete_all_i(FrtIndexReader *ir) {
|
4281
4204
|
SR(ir)->undelete_all = true;
|
4282
4205
|
SR(ir)->deleted_docs_dirty = false;
|
4283
4206
|
ir->has_changes = true;
|
@@ -4287,8 +4210,7 @@ static void sr_undelete_all_i(FrtIndexReader *ir)
|
|
4287
4210
|
SR(ir)->deleted_docs = NULL;
|
4288
4211
|
}
|
4289
4212
|
|
4290
|
-
static void sr_set_deleter_i(FrtIndexReader *ir, FrtDeleter *deleter)
|
4291
|
-
{
|
4213
|
+
static void sr_set_deleter_i(FrtIndexReader *ir, FrtDeleter *deleter) {
|
4292
4214
|
ir->deleter = deleter;
|
4293
4215
|
}
|
4294
4216
|
|
@@ -4372,8 +4294,7 @@ static void sr_commit_i(FrtIndexReader *ir)
|
|
4372
4294
|
}
|
4373
4295
|
}
|
4374
4296
|
|
4375
|
-
static void sr_close_i(FrtIndexReader *ir)
|
4376
|
-
{
|
4297
|
+
static void sr_close_i(FrtIndexReader *ir) {
|
4377
4298
|
FrtSegmentReader *sr = SR(ir);
|
4378
4299
|
|
4379
4300
|
if (sr->fr) frt_fr_close(sr->fr);
|
@@ -4383,9 +4304,8 @@ static void sr_close_i(FrtIndexReader *ir)
|
|
4383
4304
|
if (sr->prx_in) frt_is_close(sr->prx_in);
|
4384
4305
|
if (sr->norms) frt_h_destroy(sr->norms);
|
4385
4306
|
if (sr->deleted_docs) frt_bv_destroy(sr->deleted_docs);
|
4386
|
-
if (sr->cfs_store)
|
4307
|
+
if (sr->cfs_store) frt_store_close(sr->cfs_store);
|
4387
4308
|
if (sr->fr_bucket) {
|
4388
|
-
frt_thread_setspecific(sr->thread_fr, NULL);
|
4389
4309
|
frt_thread_key_delete(sr->thread_fr);
|
4390
4310
|
frt_ary_destroy(sr->fr_bucket, (frt_free_ft)&frt_fr_close);
|
4391
4311
|
}
|
@@ -4492,8 +4412,7 @@ static FrtTermVector *sr_term_vector(FrtIndexReader *ir, int doc_num, ID field)
|
|
4492
4412
|
FrtFieldInfo *fi = (FrtFieldInfo *)frt_h_get(ir->fis->field_dict, (void *)field);
|
4493
4413
|
FrtFieldsReader *fr;
|
4494
4414
|
|
4495
|
-
if (!fi || !fi_store_term_vector(fi) || !SR(ir)->fr ||
|
4496
|
-
!(fr = sr_fr(SR(ir)))) {
|
4415
|
+
if (!fi || !fi_store_term_vector(fi) || !SR(ir)->fr || !(fr = sr_fr(SR(ir)))) {
|
4497
4416
|
return NULL;
|
4498
4417
|
}
|
4499
4418
|
|
@@ -4536,8 +4455,9 @@ static void sr_open_norms(FrtIndexReader *ir, FrtStore *cfs_store)
|
|
4536
4455
|
FrtStore *store = (si->use_compound_file && si->norm_gens[i] == 0) ?
|
4537
4456
|
cfs_store : ir->store;
|
4538
4457
|
if (si_norm_file_name(si, file_name, i)) {
|
4539
|
-
|
4540
|
-
|
4458
|
+
FrtInStream *is = store->open_input(store, file_name);
|
4459
|
+
FRT_DEREF(is);
|
4460
|
+
frt_h_set_int(SR(ir)->norms, i, norm_create(is, i));
|
4541
4461
|
}
|
4542
4462
|
}
|
4543
4463
|
SR(ir)->norms_dirty = false;
|
@@ -4576,6 +4496,7 @@ static FrtIndexReader *sr_setup_i(FrtSegmentReader *sr)
|
|
4576
4496
|
|
4577
4497
|
ir->type = FRT_SEGMENT_READER;
|
4578
4498
|
|
4499
|
+
sr->thread_fr = 0;
|
4579
4500
|
sr->cfs_store = NULL;
|
4580
4501
|
|
4581
4502
|
FRT_TRY
|
@@ -4909,11 +4830,11 @@ FrtMultiReader *frt_mr_init(FrtMultiReader *mr, FrtIndexReader **sub_readers, co
|
|
4909
4830
|
mr->max_doc = 0;
|
4910
4831
|
mr->num_docs_cache = -1;
|
4911
4832
|
mr->has_deletions = false;
|
4912
|
-
|
4913
4833
|
mr->starts = FRT_ALLOC_N(int, (r_cnt+1));
|
4914
4834
|
|
4915
4835
|
for (i = 0; i < r_cnt; i++) {
|
4916
4836
|
FrtIndexReader *sub_reader = sub_readers[i];
|
4837
|
+
FRT_REF(sub_reader);
|
4917
4838
|
mr->starts[i] = mr->max_doc;
|
4918
4839
|
mr->max_doc += sub_reader->max_doc(sub_reader); /* compute max_docs */
|
4919
4840
|
|
@@ -5029,7 +4950,6 @@ FrtIndexReader *frt_mr_open(FrtIndexReader *ir, FrtIndexReader **sub_readers, co
|
|
5029
4950
|
|
5030
4951
|
static void ir_open_i(FrtStore *store, FindSegmentsFile *fsf, FrtIndexReader *ir) {
|
5031
4952
|
volatile bool success = false;
|
5032
|
-
// FrtIndexReader *volatile ir = NULL;
|
5033
4953
|
FrtSegmentInfos *volatile sis = NULL;
|
5034
4954
|
FRT_TRY
|
5035
4955
|
do {
|
@@ -5040,21 +4960,24 @@ static void ir_open_i(FrtStore *store, FindSegmentsFile *fsf, FrtIndexReader *ir
|
|
5040
4960
|
fis = sis->fis;
|
5041
4961
|
if (sis->size == 1) {
|
5042
4962
|
ir = sr_open(sis, fis, 0, true, (FrtSegmentReader *)ir);
|
5043
|
-
}
|
5044
|
-
else {
|
4963
|
+
} else {
|
5045
4964
|
volatile int i;
|
5046
|
-
FrtIndexReader **readers =
|
4965
|
+
FrtIndexReader **readers = FRT_ALLOC_AND_ZERO_N(FrtIndexReader *, sis->size);
|
5047
4966
|
int num_segments = sis->size;
|
5048
|
-
|
5049
|
-
|
4967
|
+
FRT_TRY
|
4968
|
+
for (i = num_segments - 1; i >= 0; i--) {
|
5050
4969
|
readers[i] = sr_open(sis, fis, i, false, NULL);
|
5051
|
-
|
5052
|
-
|
4970
|
+
FRT_DEREF(readers[i]);
|
4971
|
+
}
|
4972
|
+
FRT_XCATCHALL
|
4973
|
+
for (i++; i < num_segments; i++) {
|
4974
|
+
if (readers[i]) {
|
4975
|
+
FRT_REF(readers[i]);
|
5053
4976
|
frt_ir_close(readers[i]);
|
5054
4977
|
}
|
5055
|
-
|
5056
|
-
|
5057
|
-
|
4978
|
+
}
|
4979
|
+
free(readers);
|
4980
|
+
FRT_XENDTRY
|
5058
4981
|
ir = frt_mr_open_i(store, sis, fis, readers, sis->size, ir);
|
5059
4982
|
}
|
5060
4983
|
fsf->ret.ir = ir;
|
@@ -5187,8 +5110,8 @@ typedef struct SkipBuffer
|
|
5187
5110
|
FrtOutStream *frq_out;
|
5188
5111
|
FrtOutStream *prx_out;
|
5189
5112
|
int last_doc;
|
5190
|
-
|
5191
|
-
|
5113
|
+
frt_off_t last_frq_ptr;
|
5114
|
+
frt_off_t last_prx_ptr;
|
5192
5115
|
} SkipBuffer;
|
5193
5116
|
|
5194
5117
|
static void skip_buf_reset(SkipBuffer *skip_buf)
|
@@ -5210,8 +5133,8 @@ static SkipBuffer *skip_buf_new(FrtOutStream *frq_out, FrtOutStream *prx_out)
|
|
5210
5133
|
|
5211
5134
|
static void skip_buf_add(SkipBuffer *skip_buf, int doc)
|
5212
5135
|
{
|
5213
|
-
|
5214
|
-
|
5136
|
+
frt_off_t frq_ptr = frt_os_pos(skip_buf->frq_out);
|
5137
|
+
frt_off_t prx_ptr = frt_os_pos(skip_buf->prx_out);
|
5215
5138
|
|
5216
5139
|
frt_os_write_vint(skip_buf->buf, doc - skip_buf->last_doc);
|
5217
5140
|
frt_os_write_vint(skip_buf->buf, frq_ptr - skip_buf->last_frq_ptr);
|
@@ -5222,9 +5145,9 @@ static void skip_buf_add(SkipBuffer *skip_buf, int doc)
|
|
5222
5145
|
skip_buf->last_prx_ptr = prx_ptr;
|
5223
5146
|
}
|
5224
5147
|
|
5225
|
-
static
|
5148
|
+
static frt_off_t skip_buf_write(SkipBuffer *skip_buf)
|
5226
5149
|
{
|
5227
|
-
|
5150
|
+
frt_off_t skip_ptr = frt_os_pos(skip_buf->frq_out);
|
5228
5151
|
frt_ramo_write_to(skip_buf->buf, skip_buf->frq_out);
|
5229
5152
|
return skip_ptr;
|
5230
5153
|
}
|
@@ -5294,8 +5217,7 @@ static void dw_flush(FrtDocWriter *dw)
|
|
5294
5217
|
FrtPosting *p;
|
5295
5218
|
FrtOccurence *occ;
|
5296
5219
|
FrtStore *store = dw->store;
|
5297
|
-
FrtTermInfosWriter *tiw = frt_tiw_open(store, dw->si->name,
|
5298
|
-
dw->index_interval, skip_interval);
|
5220
|
+
FrtTermInfosWriter *tiw = frt_tiw_open(store, dw->si->name, dw->index_interval, skip_interval);
|
5299
5221
|
FrtTermInfo ti;
|
5300
5222
|
char file_name[FRT_SEGMENT_NAME_MAX_LENGTH];
|
5301
5223
|
FrtOutStream *frq_out, *prx_out;
|
@@ -5374,6 +5296,7 @@ FrtDocWriter *frt_dw_open(FrtIndexWriter *iw, FrtSegmentInfo *si)
|
|
5374
5296
|
dw->analyzer = iw->analyzer;
|
5375
5297
|
dw->fis = iw->fis;
|
5376
5298
|
dw->store = store;
|
5299
|
+
FRT_REF(store);
|
5377
5300
|
dw->fw = frt_fw_open(store, si->name, iw->fis);
|
5378
5301
|
dw->si = si;
|
5379
5302
|
|
@@ -5408,6 +5331,7 @@ void frt_dw_close(FrtDocWriter *dw)
|
|
5408
5331
|
if (dw->fw) {
|
5409
5332
|
frt_fw_close(dw->fw);
|
5410
5333
|
}
|
5334
|
+
frt_store_close(dw->store);
|
5411
5335
|
frt_h_destroy(dw->curr_plists);
|
5412
5336
|
frt_h_destroy(dw->fields);
|
5413
5337
|
frt_mp_destroy(dw->mp);
|
@@ -5456,7 +5380,7 @@ static void dw_add_posting(FrtMemoryPool *mp,
|
|
5456
5380
|
}
|
5457
5381
|
}
|
5458
5382
|
|
5459
|
-
static void dw_add_offsets(FrtDocWriter *dw, int pos,
|
5383
|
+
static void dw_add_offsets(FrtDocWriter *dw, int pos, frt_off_t start, frt_off_t end)
|
5460
5384
|
{
|
5461
5385
|
if (pos >= dw->offsets_capa) {
|
5462
5386
|
int old_capa = dw->offsets_capa;
|
@@ -5480,7 +5404,7 @@ FrtHash *frt_dw_invert_field(FrtDocWriter *dw, FrtFieldInverter *fld_inv, FrtDoc
|
|
5480
5404
|
int doc_num = dw->doc_num;
|
5481
5405
|
int i;
|
5482
5406
|
const int df_size = df->size;
|
5483
|
-
|
5407
|
+
frt_off_t start_offset = 0;
|
5484
5408
|
|
5485
5409
|
if (fld_inv->is_tokenized) {
|
5486
5410
|
FrtToken *tk;
|
@@ -5659,6 +5583,7 @@ static SegmentMergeInfo *smi_new(int base, FrtStore *store, FrtSegmentInfo *si)
|
|
5659
5583
|
smi->base = base;
|
5660
5584
|
smi->si = si;
|
5661
5585
|
smi->orig_store = smi->store = store;
|
5586
|
+
FRT_REF(smi->orig_store);
|
5662
5587
|
sprintf(file_name, "%s.cfs", segment);
|
5663
5588
|
if (store->exists(store, file_name)) {
|
5664
5589
|
smi->store = frt_open_cmpd_store(store, file_name);
|
@@ -5683,7 +5608,9 @@ static void smi_load_term_input(SegmentMergeInfo *smi)
|
|
5683
5608
|
char file_name[FRT_SEGMENT_NAME_MAX_LENGTH];
|
5684
5609
|
smi->sfi = frt_sfi_open(store, segment);
|
5685
5610
|
sprintf(file_name, "%s.tis", segment);
|
5686
|
-
|
5611
|
+
FrtInStream *is = store->open_input(store, file_name);
|
5612
|
+
FRT_DEREF(is);
|
5613
|
+
smi->te = TE(frt_ste_new(is, smi->sfi));
|
5687
5614
|
sprintf(file_name, "%s.frq", segment);
|
5688
5615
|
smi->frq_in = store->open_input(store, file_name);
|
5689
5616
|
sprintf(file_name, "%s.prx", segment);
|
@@ -5704,8 +5631,9 @@ static void smi_close_term_input(SegmentMergeInfo *smi)
|
|
5704
5631
|
static void smi_destroy(SegmentMergeInfo *smi)
|
5705
5632
|
{
|
5706
5633
|
if (smi->store != smi->orig_store) {
|
5707
|
-
|
5634
|
+
frt_store_close(smi->store);
|
5708
5635
|
}
|
5636
|
+
frt_store_close(smi->orig_store);
|
5709
5637
|
if (smi->deleted_docs) {
|
5710
5638
|
frt_bv_destroy(smi->deleted_docs);
|
5711
5639
|
free(smi->doc_map);
|
@@ -5741,19 +5669,18 @@ typedef struct SegmentMerger {
|
|
5741
5669
|
FrtOutStream *prx_out;
|
5742
5670
|
} SegmentMerger;
|
5743
5671
|
|
5744
|
-
static SegmentMerger *sm_create(FrtIndexWriter *iw, FrtSegmentInfo *si,
|
5745
|
-
FrtSegmentInfo **seg_infos, const int seg_cnt)
|
5672
|
+
static SegmentMerger *sm_create(FrtIndexWriter *iw, FrtSegmentInfo *si, FrtSegmentInfo **seg_infos, const int seg_cnt)
|
5746
5673
|
{
|
5747
5674
|
int i;
|
5748
5675
|
SegmentMerger *sm = FRT_ALLOC_AND_ZERO_N(SegmentMerger, seg_cnt);
|
5749
5676
|
sm->store = iw->store;
|
5677
|
+
FRT_REF(sm->store);
|
5750
5678
|
sm->fis = iw->fis;
|
5751
5679
|
sm->si = si;
|
5752
5680
|
sm->doc_cnt = 0;
|
5753
5681
|
sm->smis = FRT_ALLOC_N(SegmentMergeInfo *, seg_cnt);
|
5754
5682
|
for (i = 0; i < seg_cnt; i++) {
|
5755
|
-
sm->smis[i] = smi_new(sm->doc_cnt, seg_infos[i]->store,
|
5756
|
-
seg_infos[i]);
|
5683
|
+
sm->smis[i] = smi_new(sm->doc_cnt, seg_infos[i]->store, seg_infos[i]);
|
5757
5684
|
sm->doc_cnt += sm->smis[i]->doc_cnt;
|
5758
5685
|
}
|
5759
5686
|
sm->seg_cnt = seg_cnt;
|
@@ -5768,6 +5695,7 @@ static void sm_destroy(SegmentMerger *sm)
|
|
5768
5695
|
for (i = 0; i < seg_cnt; i++) {
|
5769
5696
|
smi_destroy(sm->smis[i]);
|
5770
5697
|
}
|
5698
|
+
frt_store_close(sm->store);
|
5771
5699
|
free(sm->smis);
|
5772
5700
|
free(sm);
|
5773
5701
|
}
|
@@ -5775,7 +5703,7 @@ static void sm_destroy(SegmentMerger *sm)
|
|
5775
5703
|
static void sm_merge_fields(SegmentMerger *sm)
|
5776
5704
|
{
|
5777
5705
|
int i, j;
|
5778
|
-
|
5706
|
+
frt_off_t start, end = 0;
|
5779
5707
|
char file_name[FRT_SEGMENT_NAME_MAX_LENGTH];
|
5780
5708
|
FrtOutStream *fdt_out, *fdx_out;
|
5781
5709
|
FrtStore *store = sm->store;
|
@@ -5892,12 +5820,12 @@ static char *sm_cache_term(SegmentMerger *sm, char *term, int term_len)
|
|
5892
5820
|
static void sm_merge_term_info(SegmentMerger *sm, SegmentMergeInfo **matches,
|
5893
5821
|
int match_size)
|
5894
5822
|
{
|
5895
|
-
|
5896
|
-
|
5823
|
+
frt_off_t frq_ptr = frt_os_pos(sm->frq_out);
|
5824
|
+
frt_off_t prx_ptr = frt_os_pos(sm->prx_out);
|
5897
5825
|
|
5898
5826
|
int df = sm_append_postings(sm, matches, match_size); /* append posting data */
|
5899
5827
|
|
5900
|
-
|
5828
|
+
frt_off_t skip_ptr = skip_buf_write(sm->skip_buf);
|
5901
5829
|
|
5902
5830
|
if (df > 0) {
|
5903
5831
|
/* add an entry to the dictionary with ptrs to prox and freq files */
|
@@ -6352,8 +6280,9 @@ void frt_iw_close(FrtIndexWriter *iw)
|
|
6352
6280
|
iw->write_lock->release(iw->write_lock);
|
6353
6281
|
frt_close_lock(iw->write_lock);
|
6354
6282
|
iw->write_lock = NULL;
|
6355
|
-
|
6283
|
+
frt_store_close(iw->store);
|
6356
6284
|
frt_deleter_destroy(iw->deleter);
|
6285
|
+
frt_mutex_unlock(&iw->mutex);
|
6357
6286
|
frt_mutex_destroy(&iw->mutex);
|
6358
6287
|
free(iw);
|
6359
6288
|
}
|
@@ -6367,6 +6296,7 @@ FrtIndexWriter *frt_iw_open(FrtIndexWriter *iw, FrtStore *store, FrtAnalyzer *vo
|
|
6367
6296
|
iw = frt_iw_alloc();
|
6368
6297
|
frt_mutex_init(&iw->mutex, NULL);
|
6369
6298
|
iw->store = store;
|
6299
|
+
FRT_REF(store);
|
6370
6300
|
if (!config) {
|
6371
6301
|
config = &frt_default_config;
|
6372
6302
|
}
|
@@ -6375,14 +6305,14 @@ FrtIndexWriter *frt_iw_open(FrtIndexWriter *iw, FrtStore *store, FrtAnalyzer *vo
|
|
6375
6305
|
FRT_TRY
|
6376
6306
|
iw->write_lock = frt_open_lock(store, FRT_WRITE_LOCK_NAME);
|
6377
6307
|
if (!iw->write_lock->obtain(iw->write_lock)) {
|
6378
|
-
FRT_RAISE(FRT_LOCK_ERROR,
|
6379
|
-
"Couldn't obtain write lock when opening IndexWriter");
|
6308
|
+
FRT_RAISE(FRT_LOCK_ERROR, "Couldn't obtain write lock when opening IndexWriter");
|
6380
6309
|
}
|
6381
6310
|
|
6382
6311
|
iw->sis = frt_sis_read(store);
|
6383
6312
|
iw->fis = iw->sis->fis;
|
6384
6313
|
FRT_REF(iw->fis);
|
6385
6314
|
FRT_XCATCHALL
|
6315
|
+
frt_store_close(iw->store);
|
6386
6316
|
if (iw->write_lock) {
|
6387
6317
|
iw->write_lock->release(iw->write_lock);
|
6388
6318
|
frt_close_lock(iw->write_lock);
|
@@ -6400,7 +6330,6 @@ FrtIndexWriter *frt_iw_open(FrtIndexWriter *iw, FrtStore *store, FrtAnalyzer *vo
|
|
6400
6330
|
iw->deleter = frt_deleter_new(iw->sis, store);
|
6401
6331
|
deleter_delete_deletable_files(iw->deleter);
|
6402
6332
|
|
6403
|
-
FRT_REF(store);
|
6404
6333
|
return iw;
|
6405
6334
|
}
|
6406
6335
|
|
@@ -6443,7 +6372,7 @@ static void iw_cp_fields(FrtIndexWriter *iw, FrtSegmentReader *sr, const char *s
|
|
6443
6372
|
int j, data_len = 0;
|
6444
6373
|
const int field_cnt = frt_is_read_vint(fdt_in);
|
6445
6374
|
int tv_cnt;
|
6446
|
-
|
6375
|
+
frt_off_t doc_start_ptr = frt_os_pos(fdt_out);
|
6447
6376
|
|
6448
6377
|
frt_os_write_u64(fdx_out, doc_start_ptr);
|
6449
6378
|
frt_os_write_vint(fdt_out, field_cnt);
|