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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/ext/isomorfeus_ferret_ext/bm_store.c +3 -3
  3. data/ext/isomorfeus_ferret_ext/bzlib.h +83 -82
  4. data/ext/isomorfeus_ferret_ext/frb_index.c +17 -23
  5. data/ext/isomorfeus_ferret_ext/frb_search.c +1 -4
  6. data/ext/isomorfeus_ferret_ext/frb_store.c +32 -34
  7. data/ext/isomorfeus_ferret_ext/frt_analysis.c +4 -4
  8. data/ext/isomorfeus_ferret_ext/frt_analysis.h +9 -9
  9. data/ext/isomorfeus_ferret_ext/frt_bitvector.c +1 -1
  10. data/ext/isomorfeus_ferret_ext/frt_bitvector.h +1 -1
  11. data/ext/isomorfeus_ferret_ext/frt_compound_io.c +41 -66
  12. data/ext/isomorfeus_ferret_ext/frt_config.h +8 -0
  13. data/ext/isomorfeus_ferret_ext/frt_except.c +1 -0
  14. data/ext/isomorfeus_ferret_ext/frt_filter.c +2 -4
  15. data/ext/isomorfeus_ferret_ext/frt_fs_store.c +24 -19
  16. data/ext/isomorfeus_ferret_ext/frt_global.c +6 -4
  17. data/ext/isomorfeus_ferret_ext/frt_global.h +1 -1
  18. data/ext/isomorfeus_ferret_ext/frt_hash.c +40 -48
  19. data/ext/isomorfeus_ferret_ext/frt_hash.h +14 -16
  20. data/ext/isomorfeus_ferret_ext/frt_hashset.c +5 -5
  21. data/ext/isomorfeus_ferret_ext/frt_ind.c +2 -3
  22. data/ext/isomorfeus_ferret_ext/frt_index.c +148 -219
  23. data/ext/isomorfeus_ferret_ext/frt_index.h +31 -31
  24. data/ext/isomorfeus_ferret_ext/frt_lang.c +1 -4
  25. data/ext/isomorfeus_ferret_ext/frt_multimapper.c +8 -9
  26. data/ext/isomorfeus_ferret_ext/frt_multimapper.h +1 -1
  27. data/ext/isomorfeus_ferret_ext/frt_q_boolean.c +6 -6
  28. data/ext/isomorfeus_ferret_ext/frt_q_match_all.c +8 -3
  29. data/ext/isomorfeus_ferret_ext/frt_q_parser.c +1743 -1742
  30. data/ext/isomorfeus_ferret_ext/frt_q_phrase.c +1 -2
  31. data/ext/isomorfeus_ferret_ext/frt_q_span.c +11 -10
  32. data/ext/isomorfeus_ferret_ext/frt_ram_store.c +24 -40
  33. data/ext/isomorfeus_ferret_ext/frt_search.c +29 -28
  34. data/ext/isomorfeus_ferret_ext/frt_search.h +18 -19
  35. data/ext/isomorfeus_ferret_ext/frt_store.c +47 -40
  36. data/ext/isomorfeus_ferret_ext/frt_store.h +46 -48
  37. data/ext/isomorfeus_ferret_ext/frt_threading.h +12 -5
  38. data/ext/isomorfeus_ferret_ext/isomorfeus_ferret.c +4 -3
  39. data/ext/isomorfeus_ferret_ext/test_1710.c +1 -2
  40. data/ext/isomorfeus_ferret_ext/test_compound_io.c +8 -8
  41. data/ext/isomorfeus_ferret_ext/test_fields.c +7 -7
  42. data/ext/isomorfeus_ferret_ext/test_file_deleter.c +1 -1
  43. data/ext/isomorfeus_ferret_ext/test_filter.c +4 -3
  44. data/ext/isomorfeus_ferret_ext/test_fs_store.c +1 -1
  45. data/ext/isomorfeus_ferret_ext/test_highlighter.c +3 -1
  46. data/ext/isomorfeus_ferret_ext/test_index.c +61 -61
  47. data/ext/isomorfeus_ferret_ext/test_q_const_score.c +2 -1
  48. data/ext/isomorfeus_ferret_ext/test_q_filtered.c +3 -2
  49. data/ext/isomorfeus_ferret_ext/test_q_fuzzy.c +3 -1
  50. data/ext/isomorfeus_ferret_ext/test_q_span.c +8 -1
  51. data/ext/isomorfeus_ferret_ext/test_ram_store.c +4 -4
  52. data/ext/isomorfeus_ferret_ext/test_search.c +9 -4
  53. data/ext/isomorfeus_ferret_ext/test_segments.c +4 -3
  54. data/ext/isomorfeus_ferret_ext/test_sort.c +17 -9
  55. data/ext/isomorfeus_ferret_ext/test_term.c +4 -2
  56. data/ext/isomorfeus_ferret_ext/test_term_vectors.c +2 -2
  57. data/ext/isomorfeus_ferret_ext/test_threading.c +5 -4
  58. data/lib/isomorfeus/ferret/index/index.rb +8 -3
  59. data/lib/isomorfeus/ferret/version.rb +1 -1
  60. 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 store, FrtCompressionType compression, FrtIndexValue index, FrtTermVectorValue term_vector) {
373
- fi_check_params(store, compression, index, term_vector);
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->store = store;
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->store, fis->compression, fis->index, fis->term_vector);
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->store);
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->store],
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 frt_si_deref(FrtSegmentInfo *si)
641
- {
642
- if (--si->ref_cnt <= 0) {
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
- frt_si_deref(sis->segs[i]);
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
- frt_si_deref(sis->segs[at]);
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
- frt_si_deref(sis->segs[i]);
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
- fdx_in = fr->fdx_in = store->open_input(store, file_name);
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
- off_t pos;
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
- off_t pos;
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 off_t abs_start = frt_is_pos(fdt_in);
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
- off_t data_ptr, field_index_ptr;
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
- off_t field_index_ptr;
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
- off_t fdt_start_pos = frt_os_pos(fdt_out);
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
- off_t index_ptr = 0;
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
- else {
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
- tir->orig_te = frt_ste_new(store->open_input(store, file_name), sfi);
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
- off_t tis_pos;
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
- off_t last_frq_ptr;
3029
- off_t last_prx_ptr;
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, off_t prx_ptr) {
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, off_t prx_ptr)
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)frt_si_deref);
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
- frt_mutex_lock(&ir->mutex);
4102
- if (0 == --(ir->ref_cnt)) {
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
- frt_store_deref(ir->store);
4107
- }
4108
- if (ir->is_owner && ir->sis) {
4109
- frt_sis_destroy(ir->sis);
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) frt_store_deref(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
- frt_h_set_int(SR(ir)->norms, i,
4540
- norm_create(store->open_input(store, file_name), i));
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 = FRT_ALLOC_N(FrtIndexReader *, sis->size);
4965
+ FrtIndexReader **readers = FRT_ALLOC_AND_ZERO_N(FrtIndexReader *, sis->size);
5047
4966
  int num_segments = sis->size;
5048
- for (i = num_segments - 1; i >= 0; i--) {
5049
- FRT_TRY
4967
+ FRT_TRY
4968
+ for (i = num_segments - 1; i >= 0; i--) {
5050
4969
  readers[i] = sr_open(sis, fis, i, false, NULL);
5051
- FRT_XCATCHALL
5052
- for (i++; i < num_segments; i++) {
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
- free(readers);
5056
- FRT_XENDTRY
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
- off_t last_frq_ptr;
5191
- off_t last_prx_ptr;
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
- off_t frq_ptr = frt_os_pos(skip_buf->frq_out);
5214
- off_t prx_ptr = frt_os_pos(skip_buf->prx_out);
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 off_t skip_buf_write(SkipBuffer *skip_buf)
5148
+ static frt_off_t skip_buf_write(SkipBuffer *skip_buf)
5226
5149
  {
5227
- off_t skip_ptr = frt_os_pos(skip_buf->frq_out);
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, off_t start, off_t end)
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
- off_t start_offset = 0;
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
- smi->te = TE(frt_ste_new(store->open_input(store, file_name), smi->sfi));
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
- frt_store_deref(smi->store);
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
- off_t start, end = 0;
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
- off_t frq_ptr = frt_os_pos(sm->frq_out);
5896
- off_t prx_ptr = frt_os_pos(sm->prx_out);
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
- off_t skip_ptr = skip_buf_write(sm->skip_buf);
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
- frt_store_deref(iw->store);
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
- off_t doc_start_ptr = frt_os_pos(fdt_out);
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);