#include "cache.h"
#include "object.h"
#include "replace-object.h"
+#include "object-store.h"
#include "blob.h"
#include "tree.h"
#include "commit.h"
#include "tag.h"
+#include "alloc.h"
#include "object-store.h"
#include "packfile.h"
* power of 2 (but at least 32). Copy the existing values to the new
* hash map.
*/
-#define grow_object_hash(r) grow_object_hash_##r()
-static void grow_object_hash_the_repository(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 = the_repository->parsed_objects->obj_hash_size < 32 ? 32 : 2 * the_repository->parsed_objects->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 < the_repository->parsed_objects->obj_hash_size; i++) {
- struct object *obj = the_repository->parsed_objects->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(the_repository->parsed_objects->obj_hash);
- the_repository->parsed_objects->obj_hash = new_hash;
- the_repository->parsed_objects->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_the_repository(const unsigned char *sha1, void *o)
+void *create_object(struct repository *r, const unsigned char *sha1, void *o)
{
struct object *obj = o;
obj->flags = 0;
hashcpy(obj->oid.hash, sha1);
- if (the_repository->parsed_objects->obj_hash_size - 1 <= the_repository->parsed_objects->nr_objs * 2)
- grow_object_hash(the_repository);
+ if (r->parsed_objects->obj_hash_size - 1 <= r->parsed_objects->nr_objs * 2)
+ grow_object_hash(r);
- insert_obj_hash(obj, the_repository->parsed_objects->obj_hash,
- the_repository->parsed_objects->obj_hash_size);
- the_repository->parsed_objects->nr_objs++;
+ insert_obj_hash(obj, r->parsed_objects->obj_hash,
+ r->parsed_objects->obj_hash_size);
+ r->parsed_objects->nr_objs++;
return obj;
}
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;
}
struct object *obj = lookup_object(sha1);
if (!obj)
obj = create_object(the_repository, sha1,
- alloc_object_node());
+ alloc_object_node(the_repository));
return obj;
}
} else if (type == OBJ_COMMIT) {
struct commit *commit = lookup_commit(oid);
if (commit) {
- if (parse_commit_buffer(commit, buffer, size))
+ if (parse_commit_buffer(commit, buffer, size, 1))
return NULL;
if (!get_cached_commit_buffer(commit, NULL)) {
set_commit_buffer(commit, buffer, size);
{
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();
+
+ o->is_shallow = -1;
+ o->shallow_stat = xcalloc(1, sizeof(*o->shallow_stat));
+
return o;
}
FREE_AND_NULL(o->objectdir);
FREE_AND_NULL(o->alternate_db);
+ oidmap_free(o->replace_map, 1);
+ FREE_AND_NULL(o->replace_map);
+
free_alt_odbs(o);
o->alt_odb_tail = NULL;
void parsed_object_pool_clear(struct parsed_object_pool *o)
{
/*
- * TOOD free objects in o->obj_hash.
- *
* 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);
}