X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Freclists.c;h=b7a3db263803e676aa76e71f13bf93db9f83bf45;hb=5ac0f94cc7fc45e3ae81e8575facb88aa1740a98;hp=bbb293c93d123d45ece0a8967de718bb92d8be84;hpb=8bb7f1b57ccdfc01c5a6beb03ac3400c416bd911;p=pazpar2-moved-to-github.git diff --git a/src/reclists.c b/src/reclists.c index bbb293c..b7a3db2 100644 --- a/src/reclists.c +++ b/src/reclists.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2009 Index Data + Copyright (C) 2006-2010 Index Data Pazpar2 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -39,6 +39,7 @@ struct reclist struct reclist_bucket *sorted_ptr; struct reclist_bucket **last; NMEM nmem; + YAZ_MUTEX mutex; }; static struct reclist_sortparms *qsort_sortparms = 0; /* thread pr */ @@ -133,7 +134,7 @@ static int reclist_cmp(const void *p1, const void *p2) switch (s->type) { case Metadata_sortkey_relevance: - res = r2->relevance - r1->relevance; + res = r2->relevance_score - r1->relevance_score; break; case Metadata_sortkey_string: s1 = ut1 ? ut1->text.sort : ""; @@ -165,15 +166,23 @@ static int reclist_cmp(const void *p1, const void *p2) res = 0; } } + if (res == 0) + res = strcmp(r1->recid, r2->recid); return res; } void reclist_sort(struct reclist *l, struct reclist_sortparms *parms) { + struct reclist_bucket **flatlist = xmalloc(sizeof(*flatlist) * l->num_records); - struct reclist_bucket *ptr = l->sorted_list; - struct reclist_bucket **prev = &l->sorted_list; + struct reclist_bucket *ptr; + struct reclist_bucket **prev; int i = 0; + + reclist_enter(l); + + ptr = l->sorted_list; + prev = &l->sorted_list; while (ptr) { flatlist[i] = ptr; @@ -194,7 +203,7 @@ void reclist_sort(struct reclist *l, struct reclist_sortparms *parms) xfree(flatlist); - reclist_rewind(l); + reclist_leave(l); } struct record_cluster *reclist_read_record(struct reclist *l) @@ -209,12 +218,22 @@ struct record_cluster *reclist_read_record(struct reclist *l) return 0; } -void reclist_rewind(struct reclist *l) +void reclist_enter(struct reclist *l) +{ + yaz_mutex_enter(l->mutex); + if (l) + l->sorted_ptr = l->sorted_list; +} + + +void reclist_leave(struct reclist *l) { + yaz_mutex_leave(l->mutex); if (l) l->sorted_ptr = l->sorted_list; } + struct reclist *reclist_create(NMEM nmem) { struct reclist *res = nmem_malloc(nmem, sizeof(struct reclist)); @@ -229,9 +248,16 @@ struct reclist *reclist_create(NMEM nmem) res->last = &res->sorted_list; res->num_records = 0; + res->mutex = 0; + yaz_mutex_create(&res->mutex); return res; } +void reclist_destroy(struct reclist *l) +{ + yaz_mutex_destroy(&l->mutex); +} + int reclist_get_num_records(struct reclist *l) { if (l) @@ -257,6 +283,7 @@ struct record_cluster *reclist_insert( struct reclist *l, bucket = jenkins_hash((unsigned char*) merge_key) % l->hash_size; + yaz_mutex_enter(l->mutex); for (p = &l->hashtable[bucket]; *p; p = &(*p)->hnext) { // We found a matching record. Merge them @@ -281,7 +308,7 @@ struct record_cluster *reclist_insert( struct reclist *l, new->hnext = 0; cluster->records = record; cluster->merge_key = merge_key; - cluster->relevance = 0; + cluster->relevance_score = 0; cluster->term_frequency_vec = 0; cluster->recid = merge_key; (*total)++; @@ -306,10 +333,10 @@ struct record_cluster *reclist_insert( struct reclist *l, l->num_records++; } + yaz_mutex_leave(l->mutex); return cluster; } - /* * Local variables: * c-basic-offset: 4