razor.c
changeset 40 305cd8657bc8
parent 38 88f3ec190a3f
child 41 7eea400e19db
     1.1 --- a/razor.c	Thu Sep 20 14:53:03 2007 -0400
     1.2 +++ b/razor.c	Wed Sep 26 00:08:03 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  }