Changeset 553474a2f82a765bea2a3430c3d1b15ced7a15fc

Show
Ignore:
Timestamp:
04/21/08 20:59:24 (9 months ago)
Author:
dave <dave@…>
Parents:
7746856afdda981effb01ee9e21e7454d5ad2fa7
Children:
585583fabc2d8f758ad113f07b02b6e37e03ca63
git-committer:
dave <dave@06fd6eb0-0002-0410-a719-e5602cce40bc> / 2008-04-21T10:59:24Z+0000
Message:

Added the intern method. All field names are now interned.

Whenever a field name is assigned to a struct it must be interned. This means that field names never need to be freed and they can be compared with == instead of strcmp. This is not the case for public functions which have a field parameter. In this case, the parameter will either need to be interned or the standard string methods used for comparison.

I'm not sure I like this solution yet. The reason I've added it is that it means there is one less object that we need to keep track of in terms of memory allocation. It also adds a slight speed and memory usage improvement as field names only ever get allocated once and they are quite commonly compared so it is more efficient to use == instead of strcmp. However, it feels like it could be quite easy to forget to intern a field somewhere causing a hard to track down error. In future I may add a Symbol object to force field names to be interned.

git-svn-id: svn+ssh://davebalmain.com/home/dave/repos/ferret/trunk@1027 06fd6eb0-0002-0410-a719-e5602cce40bc

Location:
c
Files:
3 added
32 modified

Legend:

Unmodified
Added
Removed
  • c/Makefile

    r613a2b r553474  
    4545search.o            similarity.o         sort.o             stopwords.o       \ 
    4646store.o             term_vectors.o       field_index.o      lang.o            \ 
    47 scanner.o           scanner_mb.o 
     47scanner.o           scanner_mb.o                 intern.o 
    4848 
    4949TEST_OBJS = \ 
     
    6060test_analysis.o          test_filter.o            test_priorityqueue.o \ 
    6161test_sort.o              test_ram_store.o         test_file_deleter.o  \ 
    62 test_lang.o 
     62test_lang.o                              test_intern.o 
    6363 
    6464BZLIB_SRCS = \ 
  • c/Rakefile

    r54419e r553474  
    200200                  GCOV_DIR]) 
    201201 
    202 task :default => :test 
     202task :default => :testall 
    203203 
    204204def run_tests 
     
    369369 
    370370  rule '.c' => '.rl' do |t| 
    371     sh "ragel -G2 #{t.prerequisites} -o #{t.name}" 
     371    sh "ragel #{t.prerequisites} -o #{t.name}" 
    372372  end 
    373373 
  • c/include/analysis.h

    r442a23 r553474  
    182182{ 
    183183    FrtTokenStream *current_ts; 
    184     FrtTokenStream *(*get_ts)(struct FrtAnalyzer *a, char *field, char *text); 
     184    FrtTokenStream *(*get_ts)(struct FrtAnalyzer *a, const char *field, char *text); 
    185185    void (*destroy_i)(struct FrtAnalyzer *a); 
    186186    int ref_cnt; 
     
    194194                              void (*destroy)(FrtAnalyzer *a), 
    195195                              FrtTokenStream *(*get_ts)(FrtAnalyzer *a, 
    196                                                      char *field, 
     196                                                     const char *field, 
    197197                                                     char *text)); 
    198198extern void frt_a_standard_destroy(FrtAnalyzer *a); 
     
    226226 
    227227extern FrtAnalyzer *frt_per_field_analyzer_new(FrtAnalyzer *a); 
    228 extern void frt_pfa_add_field(FrtAnalyzer *self, char *field, FrtAnalyzer *analyzer); 
     228extern void frt_pfa_add_field(FrtAnalyzer *self, 
     229                              const char *field, 
     230                              FrtAnalyzer *analyzer); 
    229231 
    230232#endif 
  • c/include/document.h

    r48290f r553474  
    1414typedef struct FrtDocField 
    1515{ 
    16     char *name; 
     16    const char *name; 
    1717    int size; 
    1818    int capa; 
  • c/include/hash.h

    r48290f r553474  
    126126 */ 
    127127extern FrtHash *frt_h_new(frt_hash_ft hash, 
    128                                   frt_eq_ft eq,  
    129                                   frt_free_ft free_key, 
    130                                   frt_free_ft free_value); 
     128                          frt_eq_ft eq,  
     129                          frt_free_ft free_key, 
     130                          frt_free_ft free_value); 
    131131 
    132132/** 
     
    145145 */ 
    146146extern FrtHash *frt_h_new_str(frt_free_ft free_key, 
    147                                       frt_free_ft free_value); 
     147                              frt_free_ft free_value); 
    148148 
    149149/** 
  • c/include/ind.h

    r6a5a9e r553474  
    2222    FrtQParser *qp; 
    2323    FrtHashSet *key; 
    24     char *id_field; 
    25     char *def_field; 
     24    const char *id_field; 
     25    const char *def_field; 
    2626    /* for FrtIndexWriter */ 
    2727    bool auto_flush : 1; 
  • c/include/index.h

    r48290f r553474  
    103103typedef struct FrtFieldInfo 
    104104{ 
    105     char *name; 
     105    const char *name; 
    106106    float boost; 
    107107    unsigned int bits; 
     
    111111 
    112112extern FrtFieldInfo *frt_fi_new(const char *name, 
    113                          FrtStoreValue store, 
    114                          FrtIndexValue index, 
    115                          FrtTermVectorValue term_vector); 
     113                                FrtStoreValue store, 
     114                                FrtIndexValue index, 
     115                                FrtTermVectorValue term_vector); 
    116116extern char *frt_fi_to_s(FrtFieldInfo *fi); 
    117117extern void frt_fi_deref(FrtFieldInfo *fi); 
     
    550550typedef struct FrtTermVector 
    551551{ 
    552     int     field_num; 
    553     char  *field; 
    554     int     term_cnt; 
    555     FrtTVTerm *terms; 
    556     int     offset_cnt; 
    557     FrtOffset *offsets; 
     552    int        field_num; 
     553    const char *field; 
     554    int        term_cnt; 
     555    FrtTVTerm  *terms; 
     556    int        offset_cnt; 
     557    FrtOffset  *offsets; 
    558558} FrtTermVector; 
    559559 
     
    633633typedef struct FrtLazyDocField 
    634634{ 
    635     char             *name; 
     635    const char          *name; 
    636636    FrtLazyDocFieldData *data; 
    637637    FrtLazyDoc          *doc; 
    638     int               size; /* number of data elements */ 
    639     int               len;  /* length of data elements concatenated */ 
    640     bool              is_compressed : 2; /* set to 2 after all data is loaded */ 
     638    int                 size; /* number of data elements */ 
     639    int                 len;  /* length of data elements concatenated */ 
     640    bool                is_compressed : 2; /* set to 2 after all data is loaded */ 
    641641} FrtLazyDocField; 
    642642 
  • c/include/internal.h

    r442a23 r553474  
    581581#define init                                    frt_init 
    582582#define int2float                               frt_int2float 
     583#define intern                                  frt_intern 
     584#define intern_and_free                         frt_intern_and_free 
     585#define intern_init                             frt_intern_init 
    583586#define ir_add_cache                            frt_ir_add_cache 
    584587#define ir_close                                frt_ir_close 
  • c/include/search.h

    r48290f r553474  
    8989} FrtTopDocs; 
    9090 
    91 extern FrtTopDocs *frt_td_new(int total_hits, int size, FrtHit **hits, float max_score); 
     91extern FrtTopDocs *frt_td_new(int total_hits, int size, FrtHit **hits, 
     92                              float max_score); 
    9293extern void frt_td_destroy(FrtTopDocs *td); 
    9394extern char *frt_td_to_s(FrtTopDocs *td); 
     
    101102typedef struct FrtFilter 
    102103{ 
    103     char                *name; 
    104     FrtHash     *cache; 
    105     FrtBitVector           *(*get_bv_i)(struct FrtFilter *self, FrtIndexReader *ir); 
    106     char                *(*to_s)(struct FrtFilter *self); 
    107     unsigned long        (*hash)(struct FrtFilter *self); 
    108     int                  (*eq)(struct FrtFilter *self, struct FrtFilter *o); 
    109     void                 (*destroy_i)(struct FrtFilter *self); 
    110     int                  ref_cnt; 
     104    const char    *name; 
     105    FrtHash       *cache; 
     106    FrtBitVector  *(*get_bv_i)(struct FrtFilter *self, FrtIndexReader *ir); 
     107    char          *(*to_s)(struct FrtFilter *self); 
     108    unsigned long (*hash)(struct FrtFilter *self); 
     109    int           (*eq)(struct FrtFilter *self, struct FrtFilter *o); 
     110    void          (*destroy_i)(struct FrtFilter *self); 
     111    int           ref_cnt; 
    111112} FrtFilter; 
    112113 
     
    246247typedef struct FrtTermQuery 
    247248{ 
    248     FrtQuery super; 
    249     char *field; 
    250     char *term; 
     249    FrtQuery   super; 
     250    const char *field; 
     251    char       *term; 
    251252} FrtTermQuery; 
    252253 
     
    313314typedef struct FrtPhraseQuery 
    314315{ 
    315     FrtQuery           super; 
    316     int             slop; 
    317     char           *field; 
     316    FrtQuery          super; 
     317    int               slop; 
     318    const char        *field; 
    318319    FrtPhrasePosition *positions; 
    319     int             pos_cnt; 
    320     int             pos_capa; 
     320    int               pos_cnt; 
     321    int               pos_capa; 
    321322} FrtPhraseQuery; 
    322323 
     
    333334typedef struct FrtMultiTermQuery 
    334335{ 
    335     FrtQuery           super; 
    336     char           *field; 
    337     FrtPriorityQueue  *boosted_terms; 
    338     float           min_boost; 
     336    FrtQuery         super; 
     337    const char       *field; 
     338    FrtPriorityQueue *boosted_terms; 
     339    float            min_boost; 
    339340} FrtMultiTermQuery; 
    340341 
     
    361362{ 
    362363    FrtMTQSubQuery super; 
    363     char *field; 
    364     char *prefix; 
     364    const char    *field; 
     365    char           *prefix; 
    365366} FrtPrefixQuery; 
    366367 
     
    378379{ 
    379380    FrtMTQSubQuery super; 
    380     char *field; 
    381     char *pattern; 
     381    const char    *field; 
     382    char           *pattern; 
    382383} FrtWildCardQuery; 
    383384 
     
    398399{ 
    399400    FrtMTQSubQuery super; 
    400     char      *field; 
     401    const char *field; 
    401402    char       *term; 
    402403    const char *text; /* term text after prefix */ 
     
    492493typedef struct FrtSpanQuery 
    493494{ 
    494     FrtQuery        super; 
    495     char        *field; 
     495    FrtQuery       super; 
     496    const char     *field; 
    496497    FrtSpanEnum    *(*get_spans)(FrtQuery *self, FrtIndexReader *ir); 
    497498    FrtHashSet     *(*get_terms)(FrtQuery *self); 
     
    674675typedef struct FrtSortField 
    675676{ 
    676     char                  *field; 
    677     SortType         type; 
    678     bool                   reverse : 1; 
    679677    const FrtFieldIndexClass *field_index_class; 
     678    const char  *field; 
     679    SortType    type; 
     680    bool        reverse : 1; 
    680681    int         (*compare)(void *index_ptr, FrtHit *hit1, FrtHit *hit2); 
    681682    void        (*get_val)(void *index_ptr, FrtHit *hit1, FrtComparable *comparable); 
     
    683684 
    684685extern FrtSortField *frt_sort_field_new(const char *field, 
    685                                  SortType type, 
    686                                  bool reverse); 
     686                                        SortType type, 
     687                                        bool reverse); 
    687688extern FrtSortField *frt_sort_field_score_new(bool reverse); 
    688689extern FrtSortField *frt_sort_field_doc_new(bool reverse); 
  • c/include/similarity.h

    r5167b9 r553474  
    1515typedef struct FrtTerm 
    1616{ 
    17     char *field; 
     17    const char *field; 
    1818    char *text; 
    1919} FrtTerm; 
  • c/src/analysis.c

    r378d29 r553474  
    213213} 
    214214 
    215 static TokenStream *a_standard_get_ts(Analyzer *a, char *field, char *text) 
     215static TokenStream *a_standard_get_ts(Analyzer *a, 
     216                                      const char *field, 
     217                                      char *text) 
    216218{ 
    217219    TokenStream *ts; 
     
    223225Analyzer *analyzer_new(TokenStream *ts, 
    224226                       void (*destroy_i)(Analyzer *a), 
    225                        TokenStream *(*get_ts)(Analyzer *a, char *field, 
     227                       TokenStream *(*get_ts)(Analyzer *a, 
     228                                              const char *field, 
    226229                                              char *text)) 
    227230{ 
     
    15491552} 
    15501553 
    1551 static TokenStream *pfa_get_ts(Analyzer *self, char *field, char *text) 
     1554static TokenStream *pfa_get_ts(Analyzer *self, 
     1555                               const char *field, char *text) 
    15521556{ 
    15531557    Analyzer *a = (Analyzer *)h_get(PFA(self)->dict, field); 
     
    15641568} 
    15651569 
    1566 void pfa_add_field(Analyzer *self, char *field, Analyzer *analyzer) 
    1567 { 
    1568     h_set(PFA(self)->dict, estrdup(field), analyzer); 
     1570void pfa_add_field(Analyzer *self,  
     1571                   const char *field, 
     1572                   Analyzer *analyzer) 
     1573{ 
     1574    h_set(PFA(self)->dict, field, analyzer); 
    15691575} 
    15701576 
     
    15741580 
    15751581    PFA(a)->default_a = default_a; 
    1576     PFA(a)->dict = h_new_str(&free, &pfa_sub_a_destroy_i); 
     1582    PFA(a)->dict = h_new_str(NULL, &pfa_sub_a_destroy_i); 
    15771583 
    15781584    a->destroy_i = &pfa_destroy_i; 
  • c/src/document.c

    r5a8e6f r553474  
    11#include "document.h" 
     2#include "intern.h" 
    23#include <string.h> 
    34#include "internal.h" 
     
    1213{ 
    1314    DocField *df = ALLOC(DocField); 
    14     df->name = estrdup(name); 
     15    df->name = intern(name); 
    1516    df->size = 0; 
    1617    df->capa = DF_INIT_CAPA; 
     
    5051    free(df->data); 
    5152    free(df->lengths); 
    52     free(df->name); 
    5353    free(df); 
    5454} 
  • c/src/filter.c

    r5a8e6f r553474  
    11#include "search.h" 
     2#include "intern.h" 
    23#include <string.h> 
    34#include "internal.h" 
     
    1213{ 
    1314    h_destroy(filt->cache); 
    14     free(filt->name); 
    1515    free(filt); 
    1616} 
     
    5959    Filter *filt    = (Filter *)emalloc(size); 
    6060    filt->cache     = co_hash_create(); 
    61     filt->name      = estrdup(name); 
     61    filt->name      = intern(name); 
    6262    filt->to_s      = &filt_to_s_i; 
    6363    filt->hash      = &filt_hash_default; 
  • c/src/global.c

    r2088c0b r553474  
    11#include "global.h" 
     2#include "intern.h" 
    23#include <stdarg.h> 
    34#include <stdio.h> 
     
    445446    SETSIG_IF_UNSET(SIGBUS , action); 
    446447    SETSIG_IF_UNSET(SIGSEGV, action); 
    447 } 
     448 
     449    intern_init(); 
     450} 
  • c/src/ind.c

    r5a8e6f r553474  
    4747                 bool create) 
    4848{ 
    49     HashSet *all_fields = hs_new_str(&free); 
     49    HashSet *all_fields = hs_new_str(NULL); 
    5050    Index *self = ALLOC_AND_ZERO(Index); 
    5151    self->config = default_config; 
     
    7575    /* options */ 
    7676    self->key = NULL; 
    77     self->id_field = estrdup(ID_STRING); 
    78     self->def_field = estrdup(ID_STRING); 
     77    self->id_field = ID_STRING; 
     78    self->def_field = ID_STRING; 
    7979    self->auto_flush = false; 
    8080    self->check_latest = true; 
     
    9999    if (self->qp) qp_destroy(self->qp); 
    100100    if (self->key) hs_destroy(self->key); 
    101     free(self->id_field); 
    102     free(self->def_field); 
    103101    free(self); 
    104102} 
     
    282280    fis = self->ir->fis; 
    283281    for (i = fis->size - 1; i >= 0; i--) { 
    284         char *field = fis->fields[i]->name; 
    285         hs_add(self->qp->all_fields, estrdup(field)); 
     282        hs_add(self->qp->all_fields, (char *)fis->fields[i]->name); 
    286283    } 
    287284    return qp_parse(self->qp, qstr); 
  • c/src/index.c

    r48290f r553474  
    11#include "index.h" 
     2#include "intern.h" 
    23#include "similarity.h" 
    34#include "helper.h" 
     
    285286    FieldInfo *fi = ALLOC(FieldInfo); 
    286287    fi_check_params(store, index, term_vector); 
    287     fi->name = estrdup(name); 
     288    fi->name = intern(name); 
    288289    fi->boost = 1.0; 
    289290    fi->bits = 0; 
     
    298299{ 
    299300    if (0 == --(fi->ref_cnt)) { 
    300         free(fi->name); 
    301301        free(fi); 
    302302    } 
     
    418418                fi = ALLOC_AND_ZERO(FieldInfo); 
    419419                TRY 
    420                     fi->name = is_read_string_safe(is); 
     420                    fi->name = intern_and_free(is_read_string_safe(is)); 
    421421                    tmp.i = is_read_u32(is); 
    422422                    fi->boost = tmp.f; 
    423423                    fi->bits = is_read_vint(is); 
    424424                XCATCHALL 
    425                     free(fi->name); 
    426425                    free(fi); 
    427426                XENDTRY