# HG changeset patch # User Kristian H?gsberg # Date 1193246412 14400 # Node ID fca1ef50dd2c0432b19e4b805062dcfcf2b1b2ea # Parent c525dec02ef4c53e572a7b48faaeea6ff5dc6190 Introduce an immediate bit for 1-length lists. Instead of linking to a ~0 terminated list of one package, use the high bit of the link to indicate it's a direct link to the one package. diff -r c525dec02ef4 -r fca1ef50dd2c razor.c --- a/razor.c Wed Oct 24 12:21:29 2007 -0400 +++ b/razor.c Wed Oct 24 13:20:12 2007 -0400 @@ -740,8 +740,9 @@ } } -#define RAZOR_ENTRY_LAST 0x80000000ul -#define RAZOR_ENTRY_MASK 0x00fffffful +#define RAZOR_ENTRY_LAST 0x80000000ul +#define RAZOR_IMMEDIATE 0x80000000ul +#define RAZOR_ENTRY_MASK 0x00fffffful static void serialize_files(struct razor_set *set, @@ -749,7 +750,7 @@ { struct import_directory *p, *end; struct razor_entry *e = NULL; - unsigned long s; + unsigned long s, *r; p = d->files.data; end = d->files.data + d->files.size; @@ -759,8 +760,14 @@ e->name = p->name; e->start = p->count > 0 ? s : 0; s += p->count; - e->packages = add_to_property_pool(&set->package_pool, - &p->packages); + + if (p->packages.size / sizeof (unsigned long) == 1) { + r = p->packages.data; + e->packages = *r | RAZOR_IMMEDIATE; + } else { + e->packages = add_to_property_pool(&set->package_pool, + &p->packages); + } array_release(&p->packages); p++; } @@ -846,7 +853,7 @@ } static void -build_package_file_lists(struct razor_set *set) +build_package_file_lists(struct razor_set *set, unsigned long *rmap) { struct razor_package *p, *packages; struct array *pkgs; @@ -860,10 +867,19 @@ e = set->files.data; end = set->files.data + set->files.size; while (e < end) { - r = (unsigned long *) set->package_pool.data + e->packages; + if (e->packages & RAZOR_IMMEDIATE) { + e->packages = rmap[e->packages & RAZOR_ENTRY_MASK] | + RAZOR_IMMEDIATE; + r = &e->packages; + } else { + r = (unsigned long *) set->package_pool.data + e->packages; + } + while (~*r) { - q = array_add(&pkgs[*r++], sizeof *q); + q = array_add(&pkgs[*r & RAZOR_ENTRY_MASK], sizeof *q); *q = e - (struct razor_entry *) set->files.data; + if (*r++ & RAZOR_IMMEDIATE) + break; } e++; } @@ -906,9 +922,9 @@ build_file_tree(importer); remap_links(&importer->set->package_pool, rmap); + build_package_file_lists(importer->set, rmap); free(rmap); - build_package_file_lists(importer->set); set = importer->set; array_release(&importer->buckets); @@ -1170,12 +1186,18 @@ if (e == NULL) return; - r = (unsigned long *) set->package_pool.data + e->packages; + if (e->packages & RAZOR_IMMEDIATE) + r = &e->packages; + else + r = (unsigned long *) set->package_pool.data + e->packages; + packages = set->packages.data; pool = set->string_pool.data; while (~*r) { - p = &packages[*r++]; + p = &packages[*r & RAZOR_ENTRY_MASK]; printf("%s-%s\n", &pool[p->name], &pool[p->version]); + if (*r++ & RAZOR_IMMEDIATE) + break; } }