1.1 --- a/razor.c Thu Sep 20 14:53:03 2007 -0400
1.2 +++ b/razor.c Thu Sep 20 19:28:09 2007 -0400
1.3 @@ -40,7 +40,9 @@
1.4 #define RAZOR_REQUIRES 1
1.5 #define RAZOR_PROVIDES 2
1.6 #define RAZOR_STRING_POOL 3
1.7 -#define RAZOR_PROPERTY_POOL 4
1.8 +#define RAZOR_PACKAGE_POOL 4
1.9 +#define RAZOR_REQUIRES_POOL 5
1.10 +#define RAZOR_PROVIDES_POOL 6
1.11
1.12 struct razor_package {
1.13 unsigned long name;
1.14 @@ -57,10 +59,12 @@
1.15
1.16 struct razor_set {
1.17 struct array string_pool;
1.18 - struct array property_pool;
1.19 struct array packages;
1.20 + struct array package_pool;
1.21 struct array requires;
1.22 struct array provides;
1.23 + struct array requires_pool;
1.24 + struct array provides_pool;
1.25 struct razor_set_header *header;
1.26 };
1.27
1.28 @@ -151,7 +155,9 @@
1.29 { RAZOR_REQUIRES, offsetof(struct razor_set, requires) },
1.30 { RAZOR_PROVIDES, offsetof(struct razor_set, provides) },
1.31 { RAZOR_STRING_POOL, offsetof(struct razor_set, string_pool) },
1.32 - { RAZOR_PROPERTY_POOL, offsetof(struct razor_set, property_pool) },
1.33 + { RAZOR_PACKAGE_POOL, offsetof(struct razor_set, package_pool) },
1.34 + { RAZOR_REQUIRES_POOL, offsetof(struct razor_set, requires_pool) },
1.35 + { RAZOR_PROVIDES_POOL, offsetof(struct razor_set, provides_pool) },
1.36 };
1.37
1.38 struct razor_set *
1.39 @@ -311,16 +317,16 @@
1.40 }
1.41
1.42 static unsigned long
1.43 -add_to_property_pool(struct razor_set *set, struct array *properties)
1.44 +add_to_property_pool(struct array *pool, struct array *properties)
1.45 {
1.46 unsigned long *p;
1.47
1.48 p = array_add(properties, sizeof *p);
1.49 *p = ~0ul;
1.50 - p = array_add(&set->property_pool, properties->size);
1.51 + p = array_add(pool, properties->size);
1.52 memcpy(p, properties->data, properties->size);
1.53
1.54 - return p - (unsigned long *) set->property_pool.data;
1.55 + return p - (unsigned long *) pool->data;
1.56 }
1.57
1.58 static void
1.59 @@ -405,9 +411,9 @@
1.60 struct razor_package *p;
1.61
1.62 p = importer->package;
1.63 - p->requires = add_to_property_pool(importer->set,
1.64 + p->requires = add_to_property_pool(&importer->set->requires_pool,
1.65 &importer->requires.package);
1.66 - p->provides = add_to_property_pool(importer->set,
1.67 + p->provides = add_to_property_pool(&importer->set->provides_pool,
1.68 &importer->provides.package);
1.69
1.70 array_release(&importer->requires.package);
1.71 @@ -655,7 +661,7 @@
1.72 properties->size = (void *) up - properties->data;
1.73 rp_end = up;
1.74 for (rp = properties->data, p = pkgs; rp < rp_end; rp++, p++) {
1.75 - rp->packages = add_to_property_pool(set, p);
1.76 + rp->packages = add_to_property_pool(&set->package_pool, p);
1.77 array_release(p);
1.78 }
1.79
1.80 @@ -665,70 +671,30 @@
1.81 }
1.82
1.83 static void
1.84 -remap_package_links(struct razor_importer *importer)
1.85 +remap_links(struct array *links, unsigned long *map)
1.86 {
1.87 - struct razor_package *p, *end;
1.88 - unsigned long *pool, *r;
1.89 + unsigned long *p, *end;
1.90
1.91 - pool = importer->set->property_pool.data;
1.92 - end = importer->set->packages.data + importer->set->packages.size;
1.93 - for (p = importer->set->packages.data; p < end; p++) {
1.94 - for (r = &pool[p->requires]; ~*r; r++)
1.95 - *r = importer->requires_map[*r];
1.96 - for (r = &pool[p->provides]; ~*r; r++)
1.97 - *r = importer->provides_map[*r];
1.98 - }
1.99 -}
1.100 -
1.101 -static void
1.102 -remap_property_links(struct razor_importer *importer, unsigned long *map)
1.103 -{
1.104 - struct razor_property *p, *end;
1.105 - struct razor_package *rp;
1.106 - unsigned long *pool, *r, *rmap;
1.107 - int i, count;
1.108 -
1.109 - pool = importer->set->property_pool.data;
1.110 - count = importer->set->packages.size / sizeof(struct razor_package);
1.111 - rmap = malloc(count * sizeof *map);
1.112 - rp = importer->set->packages.data;
1.113 - for (i = 0; i < count; i++)
1.114 - rmap[map[i]] = i;
1.115 -
1.116 - /* FIXME: This will break if we implement package list sharing
1.117 - * for all properties, since we'll remap those lists more than
1.118 - * once. We should just have a separate pool for property
1.119 - * lists and a separate pool for package lists and remap it as
1.120 - * a flat pool. Right now, as property lists and package
1.121 - * lists are mixed, we can't do that. */
1.122 -
1.123 - end = importer->set->requires.data + importer->set->requires.size;
1.124 - for (p = importer->set->requires.data; p < end; p++)
1.125 - for (r = &pool[p->packages]; ~*r; r++)
1.126 - *r = rmap[*r];
1.127 -
1.128 - end = importer->set->provides.data + importer->set->provides.size;
1.129 - for (p = importer->set->provides.data; p < end; p++)
1.130 - for (r = &pool[p->packages]; ~*r; r++)
1.131 - *r = rmap[*r];
1.132 -
1.133 - free(rmap);
1.134 + end = links->data + links->size;
1.135 + for (p = links->data; p < end; p++)
1.136 + if (*p != ~0)
1.137 + *p = map[*p];
1.138 }
1.139
1.140 struct razor_set *
1.141 razor_importer_finish(struct razor_importer *importer)
1.142 {
1.143 struct razor_set *set;
1.144 - unsigned long *map;
1.145 - int count;
1.146 + unsigned long *map, *rmap;
1.147 + int i, count;
1.148
1.149 - importer->requires_map = uniqueify_properties(importer->set,
1.150 - importer->requires.all);
1.151 - importer->provides_map = uniqueify_properties(importer->set,
1.152 - importer->provides.all);
1.153 - remap_package_links(importer);
1.154 - free(importer->requires_map);
1.155 - free(importer->provides_map);
1.156 + map = uniqueify_properties(importer->set, &importer->set->requires);
1.157 + remap_links(&importer->set->requires_pool, map);
1.158 + free(map);
1.159 +
1.160 + map = uniqueify_properties(importer->set, &importer->set->provides);
1.161 + remap_links(&importer->set->provides_pool, map);
1.162 + free(map);
1.163
1.164 count = importer->set->packages.size / sizeof(struct razor_package);
1.165 map = qsort_with_data(importer->set->packages.data,
1.166 @@ -736,8 +702,14 @@
1.167 sizeof(struct razor_package),
1.168 compare_packages,
1.169 importer->set);
1.170 - remap_property_links(importer, map);
1.171 +
1.172 + rmap = malloc(count * sizeof *rmap);
1.173 + for (i = 0; i < count; i++)
1.174 + rmap[map[i]] = i;
1.175 +
1.176 + remap_links(&importer->set->package_pool, rmap);
1.177 free(map);
1.178 + free(rmap);
1.179
1.180 set = importer->set;
1.181 array_release(&importer->buckets);
1.182 @@ -832,7 +804,7 @@
1.183
1.184 if (name) {
1.185 package = razor_set_get_package(set, name);
1.186 - r = (unsigned long *) set->property_pool.data +
1.187 + r = (unsigned long *) set->requires_pool.data +
1.188 package->requires;
1.189 requires = set->requires.data;
1.190 pool = set->string_pool.data;
1.191 @@ -854,7 +826,7 @@
1.192
1.193 if (name) {
1.194 package = razor_set_get_package(set, name);
1.195 - r = (unsigned long *) set->property_pool.data +
1.196 + r = (unsigned long *) set->provides_pool.data +
1.197 package->provides;
1.198 provides = set->provides.data;
1.199 pool = set->string_pool.data;
1.200 @@ -888,7 +860,7 @@
1.201 if (version && versioncmp(version, &pool[property->version]) != 0)
1.202 goto next;
1.203 r = (unsigned long *)
1.204 - set->property_pool.data + property->packages;
1.205 + set->package_pool.data + property->packages;
1.206 while (~*r) {
1.207 p = &packages[*r++];
1.208 printf("%s %s\n",
1.209 @@ -973,7 +945,7 @@
1.210 &pool[package->name],
1.211 &pool[package->version]);
1.212
1.213 - r = (unsigned long *) set->property_pool.data + package->requires;
1.214 + r = (unsigned long *) set->requires_pool.data + package->requires;
1.215 properties = set->requires.data;
1.216 while (~*r) {
1.217 p = &properties[*r++];
1.218 @@ -981,7 +953,7 @@
1.219 &pool[p->name], &pool[p->version]);
1.220 }
1.221
1.222 - r = (unsigned long *) set->property_pool.data + package->provides;
1.223 + r = (unsigned long *) set->provides_pool.data + package->provides;
1.224 properties = set->provides.data;
1.225 while (~*r) {
1.226 p = &properties[*r++];
1.227 @@ -1054,7 +1026,7 @@
1.228 {
1.229 struct razor_property *requires, *r;
1.230 struct razor_property *p, *pend;
1.231 - unsigned long *u, *end, *pkg, *property_pool;
1.232 + unsigned long *u, *end, *pkg, *package_pool;
1.233 char *pool, *upool;
1.234
1.235 end = unsatisfied->data + unsatisfied->size;
1.236 @@ -1064,7 +1036,7 @@
1.237 p = upstream->provides.data;
1.238 pend = upstream->provides.data + upstream->provides.size;
1.239 upool = upstream->string_pool.data;
1.240 - property_pool = upstream->property_pool.data;
1.241 + package_pool = upstream->package_pool.data;
1.242
1.243 for (u = unsatisfied->data; u < end; u++) {
1.244 r = requires + *u;
1.245 @@ -1085,7 +1057,7 @@
1.246 } else {
1.247 pkg = array_add(list, sizeof *pkg);
1.248 /* We just pull in the first package that provides */
1.249 - *pkg = property_pool[p->packages];
1.250 + *pkg = package_pool[p->packages];
1.251 }
1.252 }
1.253 }
1.254 @@ -1212,9 +1184,6 @@
1.255 case RAZOR_STRING_POOL:
1.256 printf("string pool:\t\t%dkb\n", size / 1024);
1.257 break;
1.258 - case RAZOR_PROPERTY_POOL:
1.259 - printf("properties section:\t%dkb\n", size / 1024);
1.260 - break;
1.261 }
1.262 }
1.263 }