Merge branch 'sb/object-store-alloc'
The conversion to pass "the_repository" and then "a_repository" throughout the object access API continues. * sb/object-store-alloc: alloc: allow arbitrary repositories for alloc functions object: allow create_object to handle arbitrary repositories object: allow grow_object_hash to handle arbitrary repositories alloc: add repository argument to alloc_commit_index alloc: add repository argument to alloc_report alloc: add repository argument to alloc_object_node alloc: add repository argument to alloc_tag_node alloc: add repository argument to alloc_commit_node alloc: add repository argument to alloc_tree_node alloc: add repository argument to alloc_blob_node object: add repository argument to grow_object_hash object: add repository argument to create_object repository: introduce parsed objects field
This commit is contained in:
113
object.c
113
object.c
@ -5,20 +5,18 @@
|
||||
#include "tree.h"
|
||||
#include "commit.h"
|
||||
#include "tag.h"
|
||||
#include "alloc.h"
|
||||
#include "object-store.h"
|
||||
#include "packfile.h"
|
||||
|
||||
static struct object **obj_hash;
|
||||
static int nr_objs, obj_hash_size;
|
||||
|
||||
unsigned int get_max_object_index(void)
|
||||
{
|
||||
return obj_hash_size;
|
||||
return the_repository->parsed_objects->obj_hash_size;
|
||||
}
|
||||
|
||||
struct object *get_indexed_object(unsigned int idx)
|
||||
{
|
||||
return obj_hash[idx];
|
||||
return the_repository->parsed_objects->obj_hash[idx];
|
||||
}
|
||||
|
||||
static const char *object_type_strings[] = {
|
||||
@ -90,15 +88,16 @@ struct object *lookup_object(const unsigned char *sha1)
|
||||
unsigned int i, first;
|
||||
struct object *obj;
|
||||
|
||||
if (!obj_hash)
|
||||
if (!the_repository->parsed_objects->obj_hash)
|
||||
return NULL;
|
||||
|
||||
first = i = hash_obj(sha1, obj_hash_size);
|
||||
while ((obj = obj_hash[i]) != NULL) {
|
||||
first = i = hash_obj(sha1,
|
||||
the_repository->parsed_objects->obj_hash_size);
|
||||
while ((obj = the_repository->parsed_objects->obj_hash[i]) != NULL) {
|
||||
if (!hashcmp(sha1, obj->oid.hash))
|
||||
break;
|
||||
i++;
|
||||
if (i == obj_hash_size)
|
||||
if (i == the_repository->parsed_objects->obj_hash_size)
|
||||
i = 0;
|
||||
}
|
||||
if (obj && i != first) {
|
||||
@ -107,7 +106,8 @@ struct object *lookup_object(const unsigned char *sha1)
|
||||
* that we do not need to walk the hash table the next
|
||||
* time we look for it.
|
||||
*/
|
||||
SWAP(obj_hash[i], obj_hash[first]);
|
||||
SWAP(the_repository->parsed_objects->obj_hash[i],
|
||||
the_repository->parsed_objects->obj_hash[first]);
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
@ -117,29 +117,30 @@ struct object *lookup_object(const unsigned char *sha1)
|
||||
* power of 2 (but at least 32). Copy the existing values to the new
|
||||
* hash map.
|
||||
*/
|
||||
static void grow_object_hash(void)
|
||||
static void grow_object_hash(struct repository *r)
|
||||
{
|
||||
int i;
|
||||
/*
|
||||
* Note that this size must always be power-of-2 to match hash_obj
|
||||
* above.
|
||||
*/
|
||||
int new_hash_size = obj_hash_size < 32 ? 32 : 2 * obj_hash_size;
|
||||
int new_hash_size = r->parsed_objects->obj_hash_size < 32 ? 32 : 2 * r->parsed_objects->obj_hash_size;
|
||||
struct object **new_hash;
|
||||
|
||||
new_hash = xcalloc(new_hash_size, sizeof(struct object *));
|
||||
for (i = 0; i < obj_hash_size; i++) {
|
||||
struct object *obj = obj_hash[i];
|
||||
for (i = 0; i < r->parsed_objects->obj_hash_size; i++) {
|
||||
struct object *obj = r->parsed_objects->obj_hash[i];
|
||||
|
||||
if (!obj)
|
||||
continue;
|
||||
insert_obj_hash(obj, new_hash, new_hash_size);
|
||||
}
|
||||
free(obj_hash);
|
||||
obj_hash = new_hash;
|
||||
obj_hash_size = new_hash_size;
|
||||
free(r->parsed_objects->obj_hash);
|
||||
r->parsed_objects->obj_hash = new_hash;
|
||||
r->parsed_objects->obj_hash_size = new_hash_size;
|
||||
}
|
||||
|
||||
void *create_object(const unsigned char *sha1, void *o)
|
||||
void *create_object(struct repository *r, const unsigned char *sha1, void *o)
|
||||
{
|
||||
struct object *obj = o;
|
||||
|
||||
@ -147,11 +148,12 @@ void *create_object(const unsigned char *sha1, void *o)
|
||||
obj->flags = 0;
|
||||
hashcpy(obj->oid.hash, sha1);
|
||||
|
||||
if (obj_hash_size - 1 <= nr_objs * 2)
|
||||
grow_object_hash();
|
||||
if (r->parsed_objects->obj_hash_size - 1 <= r->parsed_objects->nr_objs * 2)
|
||||
grow_object_hash(r);
|
||||
|
||||
insert_obj_hash(obj, obj_hash, obj_hash_size);
|
||||
nr_objs++;
|
||||
insert_obj_hash(obj, r->parsed_objects->obj_hash,
|
||||
r->parsed_objects->obj_hash_size);
|
||||
r->parsed_objects->nr_objs++;
|
||||
return obj;
|
||||
}
|
||||
|
||||
@ -161,7 +163,7 @@ void *object_as_type(struct object *obj, enum object_type type, int quiet)
|
||||
return obj;
|
||||
else if (obj->type == OBJ_NONE) {
|
||||
if (type == OBJ_COMMIT)
|
||||
((struct commit *)obj)->index = alloc_commit_index();
|
||||
((struct commit *)obj)->index = alloc_commit_index(the_repository);
|
||||
obj->type = type;
|
||||
return obj;
|
||||
}
|
||||
@ -178,7 +180,8 @@ struct object *lookup_unknown_object(const unsigned char *sha1)
|
||||
{
|
||||
struct object *obj = lookup_object(sha1);
|
||||
if (!obj)
|
||||
obj = create_object(sha1, alloc_object_node());
|
||||
obj = create_object(the_repository, sha1,
|
||||
alloc_object_node(the_repository));
|
||||
return obj;
|
||||
}
|
||||
|
||||
@ -431,8 +434,8 @@ void clear_object_flags(unsigned flags)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i < obj_hash_size; i++) {
|
||||
struct object *obj = obj_hash[i];
|
||||
for (i=0; i < the_repository->parsed_objects->obj_hash_size; i++) {
|
||||
struct object *obj = the_repository->parsed_objects->obj_hash[i];
|
||||
if (obj)
|
||||
obj->flags &= ~flags;
|
||||
}
|
||||
@ -442,13 +445,27 @@ void clear_commit_marks_all(unsigned int flags)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < obj_hash_size; i++) {
|
||||
struct object *obj = obj_hash[i];
|
||||
for (i = 0; i < the_repository->parsed_objects->obj_hash_size; i++) {
|
||||
struct object *obj = the_repository->parsed_objects->obj_hash[i];
|
||||
if (obj && obj->type == OBJ_COMMIT)
|
||||
obj->flags &= ~flags;
|
||||
}
|
||||
}
|
||||
|
||||
struct parsed_object_pool *parsed_object_pool_new(void)
|
||||
{
|
||||
struct parsed_object_pool *o = xmalloc(sizeof(*o));
|
||||
memset(o, 0, sizeof(*o));
|
||||
|
||||
o->blob_state = allocate_alloc_state();
|
||||
o->tree_state = allocate_alloc_state();
|
||||
o->commit_state = allocate_alloc_state();
|
||||
o->tag_state = allocate_alloc_state();
|
||||
o->object_state = allocate_alloc_state();
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
struct raw_object_store *raw_object_store_new(void)
|
||||
{
|
||||
struct raw_object_store *o = xmalloc(sizeof(*o));
|
||||
@ -491,3 +508,43 @@ void raw_object_store_clear(struct raw_object_store *o)
|
||||
close_all_packs(o);
|
||||
o->packed_git = NULL;
|
||||
}
|
||||
|
||||
void parsed_object_pool_clear(struct parsed_object_pool *o)
|
||||
{
|
||||
/*
|
||||
* As objects are allocated in slabs (see alloc.c), we do
|
||||
* not need to free each object, but each slab instead.
|
||||
*
|
||||
* Before doing so, we need to free any additional memory
|
||||
* the objects may hold.
|
||||
*/
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < o->obj_hash_size; i++) {
|
||||
struct object *obj = o->obj_hash[i];
|
||||
|
||||
if (!obj)
|
||||
continue;
|
||||
|
||||
if (obj->type == OBJ_TREE)
|
||||
free_tree_buffer((struct tree*)obj);
|
||||
else if (obj->type == OBJ_COMMIT)
|
||||
release_commit_memory((struct commit*)obj);
|
||||
else if (obj->type == OBJ_TAG)
|
||||
release_tag_memory((struct tag*)obj);
|
||||
}
|
||||
|
||||
FREE_AND_NULL(o->obj_hash);
|
||||
o->obj_hash_size = 0;
|
||||
|
||||
clear_alloc_state(o->blob_state);
|
||||
clear_alloc_state(o->tree_state);
|
||||
clear_alloc_state(o->commit_state);
|
||||
clear_alloc_state(o->tag_state);
|
||||
clear_alloc_state(o->object_state);
|
||||
FREE_AND_NULL(o->blob_state);
|
||||
FREE_AND_NULL(o->tree_state);
|
||||
FREE_AND_NULL(o->commit_state);
|
||||
FREE_AND_NULL(o->tag_state);
|
||||
FREE_AND_NULL(o->object_state);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user