X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=blobdiff_plain;f=src%2Freclists.c;h=44ed96c6ea774d3b1fb871600c6cd681862daed4;hb=0818e0450b743e626ef22adb9491831d547beffa;hp=20ac3872c5a53b503e8008ed24f7aa15730fa840;hpb=2819110732a5e3cdc6de71333977ff39d7cf8bf3;p=pazpar2-moved-to-github.git diff --git a/src/reclists.c b/src/reclists.c index 20ac387..44ed96c 100644 --- a/src/reclists.c +++ b/src/reclists.c @@ -27,11 +27,23 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "pazpar2.h" #include "reclists.h" +#include "jenkins_hash.h" -extern struct parameters global_parameters; +struct reclist +{ + struct reclist_bucket **hashtable; + int hashtable_size; + int hashmask; + + struct record_cluster **flatlist; + int flatlist_size; + int num_records; + int pointer; -// Not threadsafe -static struct reclist_sortparms *sortparms = 0; + NMEM nmem; +}; + +static struct reclist_sortparms *qsort_sortparms = 0; /* thread pr */ struct reclist_bucket { @@ -93,11 +105,11 @@ reclist_sortparms_insert(NMEM nmem, #endif -struct reclist_sortparms *reclist_parse_sortparms(NMEM nmem, const char *parms) +struct reclist_sortparms *reclist_parse_sortparms(NMEM nmem, const char *parms, + struct conf_service *service) { struct reclist_sortparms *res = 0; struct reclist_sortparms **rp = &res; - struct conf_service *service = config->servers->service; if (strlen(parms) > 256) return 0; @@ -168,7 +180,7 @@ static int reclist_cmp(const void *p1, const void *p2) struct reclist_sortparms *s; int res = 0; - for (s = sortparms; s && res == 0; s = s->next) + for (s = qsort_sortparms; s && res == 0; s = s->next) { union data_types *ut1 = r1->sortkeys[s->offset]; union data_types *ut2 = r2->sortkeys[s->offset]; @@ -214,7 +226,7 @@ static int reclist_cmp(const void *p1, const void *p2) void reclist_sort(struct reclist *l, struct reclist_sortparms *parms) { - sortparms = parms; + qsort_sortparms = parms; qsort(l->flatlist, l->num_records, sizeof(struct record_cluster*), reclist_cmp); reclist_rewind(l); @@ -234,23 +246,6 @@ void reclist_rewind(struct reclist *l) l->pointer = 0; } -// Jenkins one-at-a-time hash (from wikipedia) -static unsigned int hash(const unsigned char *key) -{ - unsigned int hash = 0; - - while (*key) - { - hash += *(key++); - hash += (hash << 10); - hash ^= (hash >> 6); - } - hash += (hash << 3); - hash ^= (hash >> 11); - hash += (hash << 15); - return hash; -} - struct reclist *reclist_create(NMEM nmem, int numrecs) { int hashsize = 1; @@ -274,6 +269,18 @@ struct reclist *reclist_create(NMEM nmem, int numrecs) return res; } +int reclist_get_num_records(struct reclist *l) +{ + if (l) + return l->num_records; + return 0; +} + +struct record_cluster *reclist_get_cluster(struct reclist *l, int i) +{ + return l->flatlist[i]; +} + // Insert a record. Return record cluster (newly formed or pre-existing) struct record_cluster *reclist_insert( struct reclist *l, struct conf_service *service, @@ -290,7 +297,7 @@ struct record_cluster *reclist_insert( struct reclist *l, assert(merge_key); assert(total); - bucket = hash((unsigned char*) merge_key) & l->hashmask; + bucket = jenkins_hash((unsigned char*) merge_key) & l->hashmask; for (p = &l->hashtable[bucket]; *p; p = &(*p)->next) { @@ -340,7 +347,9 @@ struct record_cluster *reclist_insert( struct reclist *l, /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab */ +