Split the property pool into three pools; requires, provides and packages.
This simplifies the remapping code a lot and reduces memory pressure
during import a bit.
1.1 --- a/Makefile Thu Sep 20 14:53:03 2007 -0400
1.2 +++ b/Makefile Thu Sep 20 19:28:09 2007 -0400
1.3 @@ -1,4 +1,4 @@
1.4 -CFLAGS = -Wall -g
1.5 +CFLAGS = -Wall -g -O2
1.6 LDLIBS = -lexpat -g -lrpm
1.7
1.8 razor : razor.o import.o sha1.o
2.1 --- a/razor.c Thu Sep 20 14:53:03 2007 -0400
2.2 +++ b/razor.c Thu Sep 20 19:28:09 2007 -0400
2.3 @@ -40,7 +40,9 @@
2.4 #define RAZOR_REQUIRES 1
2.5 #define RAZOR_PROVIDES 2
2.6 #define RAZOR_STRING_POOL 3
2.7 -#define RAZOR_PROPERTY_POOL 4
2.8 +#define RAZOR_PACKAGE_POOL 4
2.9 +#define RAZOR_REQUIRES_POOL 5
2.10 +#define RAZOR_PROVIDES_POOL 6
2.11
2.12 struct razor_package {
2.13 unsigned long name;
2.14 @@ -57,10 +59,12 @@
2.15
2.16 struct razor_set {
2.17 struct array string_pool;
2.18 - struct array property_pool;
2.19 struct array packages;
2.20 + struct array package_pool;
2.21 struct array requires;
2.22 struct array provides;
2.23 + struct array requires_pool;
2.24 + struct array provides_pool;
2.25 struct razor_set_header *header;
2.26 };
2.27
2.28 @@ -151,7 +155,9 @@
2.29 { RAZOR_REQUIRES, offsetof(struct razor_set, requires) },
2.30 { RAZOR_PROVIDES, offsetof(struct razor_set, provides) },
2.31 { RAZOR_STRING_POOL, offsetof(struct razor_set, string_pool) },
2.32 - { RAZOR_PROPERTY_POOL, offsetof(struct razor_set, property_pool) },
2.33 + { RAZOR_PACKAGE_POOL, offsetof(struct razor_set, package_pool) },
2.34 + { RAZOR_REQUIRES_POOL, offsetof(struct razor_set, requires_pool) },
2.35 + { RAZOR_PROVIDES_POOL, offsetof(struct razor_set, provides_pool) },
2.36 };
2.37
2.38 struct razor_set *
2.39 @@ -311,16 +317,16 @@
2.40 }
2.41
2.42 static unsigned long
2.43 -add_to_property_pool(struct razor_set *set, struct array *properties)
2.44 +add_to_property_pool(struct array *pool, struct array *properties)
2.45 {
2.46 unsigned long *p;
2.47
2.48 p = array_add(properties, sizeof *p);
2.49 *p = ~0ul;
2.50 - p = array_add(&set->property_pool, properties->size);
2.51 + p = array_add(pool, properties->size);
2.52 memcpy(p, properties->data, properties->size);
2.53
2.54 - return p - (unsigned long *) set->property_pool.data;
2.55 + return p - (unsigned long *) pool->data;
2.56 }
2.57
2.58 static void
2.59 @@ -405,9 +411,9 @@
2.60 struct razor_package *p;
2.61
2.62 p = importer->package;
2.63 - p->requires = add_to_property_pool(importer->set,
2.64 + p->requires = add_to_property_pool(&importer->set->requires_pool,
2.65 &importer->requires.package);
2.66 - p->provides = add_to_property_pool(importer->set,
2.67 + p->provides = add_to_property_pool(&importer->set->provides_pool,
2.68 &importer->provides.package);
2.69
2.70 array_release(&importer->requires.package);
2.71 @@ -655,7 +661,7 @@
2.72 properties->size = (void *) up - properties->data;
2.73 rp_end = up;
2.74 for (rp = properties->data, p = pkgs; rp < rp_end; rp++, p++) {
2.75 - rp->packages = add_to_property_pool(set, p);
2.76 + rp->packages = add_to_property_pool(&set->package_pool, p);
2.77 array_release(p);
2.78 }
2.79
2.80 @@ -665,70 +671,30 @@
2.81 }
2.82
2.83 static void
2.84 -remap_package_links(struct razor_importer *importer)
2.85 +remap_links(struct array *links, unsigned long *map)
2.86 {
2.87 - struct razor_package *p, *end;
2.88 - unsigned long *pool, *r;
2.89 + unsigned long *p, *end;
2.90
2.91 - pool = importer->set->property_pool.data;
2.92 - end = importer->set->packages.data + importer->set->packages.size;
2.93 - for (p = importer->set->packages.data; p < end; p++) {
2.94 - for (r = &pool[p->requires]; ~*r; r++)
2.95 - *r = importer->requires_map[*r];
2.96 - for (r = &pool[p->provides]; ~*r; r++)
2.97 - *r = importer->provides_map[*r];
2.98 - }
2.99 -}
2.100 -
2.101 -static void
2.102 -remap_property_links(struct razor_importer *importer, unsigned long *map)
2.103 -{
2.104 - struct razor_property *p, *end;
2.105 - struct razor_package *rp;
2.106 - unsigned long *pool, *r, *rmap;
2.107 - int i, count;
2.108 -
2.109 - pool = importer->set->property_pool.data;
2.110 - count = importer->set->packages.size / sizeof(struct razor_package);
2.111 - rmap = malloc(count * sizeof *map);
2.112 - rp = importer->set->packages.data;
2.113 - for (i = 0; i < count; i++)
2.114 - rmap[map[i]] = i;
2.115 -
2.116 - /* FIXME: This will break if we implement package list sharing
2.117 - * for all properties, since we'll remap those lists more than
2.118 - * once. We should just have a separate pool for property
2.119 - * lists and a separate pool for package lists and remap it as
2.120 - * a flat pool. Right now, as property lists and package
2.121 - * lists are mixed, we can't do that. */
2.122 -
2.123 - end = importer->set->requires.data + importer->set->requires.size;
2.124 - for (p = importer->set->requires.data; p < end; p++)
2.125 - for (r = &pool[p->packages]; ~*r; r++)
2.126 - *r = rmap[*r];
2.127 -
2.128 - end = importer->set->provides.data + importer->set->provides.size;
2.129 - for (p = importer->set->provides.data; p < end; p++)
2.130 - for (r = &pool[p->packages]; ~*r; r++)
2.131 - *r = rmap[*r];
2.132 -
2.133 - free(rmap);
2.134 + end = links->data + links->size;
2.135 + for (p = links->data; p < end; p++)
2.136 + if (*p != ~0)
2.137 + *p = map[*p];
2.138 }
2.139
2.140 struct razor_set *
2.141 razor_importer_finish(struct razor_importer *importer)
2.142 {
2.143 struct razor_set *set;
2.144 - unsigned long *map;
2.145 - int count;
2.146 + unsigned long *map, *rmap;
2.147 + int i, count;
2.148
2.149 - importer->requires_map = uniqueify_properties(importer->set,
2.150 - importer->requires.all);
2.151 - importer->provides_map = uniqueify_properties(importer->set,
2.152 - importer->provides.all);
2.153 - remap_package_links(importer);
2.154 - free(importer->requires_map);
2.155 - free(importer->provides_map);
2.156 + map = uniqueify_properties(importer->set, &importer->set->requires);
2.157 + remap_links(&importer->set->requires_pool, map);
2.158 + free(map);
2.159 +
2.160 + map = uniqueify_properties(importer->set, &importer->set->provides);
2.161 + remap_links(&importer->set->provides_pool, map);
2.162 + free(map);
2.163
2.164 count = importer->set->packages.size / sizeof(struct razor_package);
2.165 map = qsort_with_data(importer->set->packages.data,
2.166 @@ -736,8 +702,14 @@
2.167 sizeof(struct razor_package),
2.168 compare_packages,
2.169 importer->set);
2.170 - remap_property_links(importer, map);
2.171 +
2.172 + rmap = malloc(count * sizeof *rmap);
2.173 + for (i = 0; i < count; i++)
2.174 + rmap[map[i]] = i;
2.175 +
2.176 + remap_links(&importer->set->package_pool, rmap);
2.177 free(map);
2.178 + free(rmap);
2.179
2.180 set = importer->set;
2.181 array_release(&importer->buckets);
2.182 @@ -832,7 +804,7 @@
2.183
2.184 if (name) {
2.185 package = razor_set_get_package(set, name);
2.186 - r = (unsigned long *) set->property_pool.data +
2.187 + r = (unsigned long *) set->requires_pool.data +
2.188 package->requires;
2.189 requires = set->requires.data;
2.190 pool = set->string_pool.data;
2.191 @@ -854,7 +826,7 @@
2.192
2.193 if (name) {
2.194 package = razor_set_get_package(set, name);
2.195 - r = (unsigned long *) set->property_pool.data +
2.196 + r = (unsigned long *) set->provides_pool.data +
2.197 package->provides;
2.198 provides = set->provides.data;
2.199 pool = set->string_pool.data;
2.200 @@ -888,7 +860,7 @@
2.201 if (version && versioncmp(version, &pool[property->version]) != 0)
2.202 goto next;
2.203 r = (unsigned long *)
2.204 - set->property_pool.data + property->packages;
2.205 + set->package_pool.data + property->packages;
2.206 while (~*r) {
2.207 p = &packages[*r++];
2.208 printf("%s %s\n",
2.209 @@ -973,7 +945,7 @@
2.210 &pool[package->name],
2.211 &pool[package->version]);
2.212
2.213 - r = (unsigned long *) set->property_pool.data + package->requires;
2.214 + r = (unsigned long *) set->requires_pool.data + package->requires;
2.215 properties = set->requires.data;
2.216 while (~*r) {
2.217 p = &properties[*r++];
2.218 @@ -981,7 +953,7 @@
2.219 &pool[p->name], &pool[p->version]);
2.220 }
2.221
2.222 - r = (unsigned long *) set->property_pool.data + package->provides;
2.223 + r = (unsigned long *) set->provides_pool.data + package->provides;
2.224 properties = set->provides.data;
2.225 while (~*r) {
2.226 p = &properties[*r++];
2.227 @@ -1054,7 +1026,7 @@
2.228 {
2.229 struct razor_property *requires, *r;
2.230 struct razor_property *p, *pend;
2.231 - unsigned long *u, *end, *pkg, *property_pool;
2.232 + unsigned long *u, *end, *pkg, *package_pool;
2.233 char *pool, *upool;
2.234
2.235 end = unsatisfied->data + unsatisfied->size;
2.236 @@ -1064,7 +1036,7 @@
2.237 p = upstream->provides.data;
2.238 pend = upstream->provides.data + upstream->provides.size;
2.239 upool = upstream->string_pool.data;
2.240 - property_pool = upstream->property_pool.data;
2.241 + package_pool = upstream->package_pool.data;
2.242
2.243 for (u = unsatisfied->data; u < end; u++) {
2.244 r = requires + *u;
2.245 @@ -1085,7 +1057,7 @@
2.246 } else {
2.247 pkg = array_add(list, sizeof *pkg);
2.248 /* We just pull in the first package that provides */
2.249 - *pkg = property_pool[p->packages];
2.250 + *pkg = package_pool[p->packages];
2.251 }
2.252 }
2.253 }
2.254 @@ -1212,9 +1184,6 @@
2.255 case RAZOR_STRING_POOL:
2.256 printf("string pool:\t\t%dkb\n", size / 1024);
2.257 break;
2.258 - case RAZOR_PROPERTY_POOL:
2.259 - printf("properties section:\t%dkb\n", size / 1024);
2.260 - break;
2.261 }
2.262 }
2.263 }