Split the property pool into three pools; requires, provides and packages.
authorKristian H?gsberg <krh@redhat.com>
Thu Sep 20 19:28:09 2007 -0400 (2007-09-20)
changeset 395fe9c9286cd0
parent 38 88f3ec190a3f
child 40 305cd8657bc8
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.
Makefile
razor.c
     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  }