Introduce new config option for mmap limit.
[gitweb.git] / sha1_file.c
index 63f416bb5a900210d6b3ab15bb4ffe1e16244b9a..4183f595edfe6086f5097a430cb48202db00c5c1 100644 (file)
@@ -397,7 +397,6 @@ static char *find_sha1_file(const unsigned char *sha1, struct stat *st)
        return NULL;
 }
 
-#define PACK_MAX_SZ (1<<26)
 static int pack_used_ctr;
 static unsigned long pack_mapped;
 struct packed_git *packed_git;
@@ -490,7 +489,7 @@ int use_packed_git(struct packed_git *p)
                struct pack_header *hdr;
 
                pack_mapped += p->pack_size;
-               while (PACK_MAX_SZ < pack_mapped && unuse_one_packed_git())
+               while (packed_git_limit < pack_mapped && unuse_one_packed_git())
                        ; /* nothing */
                fd = open(p->pack_name, O_RDONLY);
                if (fd < 0)
@@ -1013,7 +1012,7 @@ void packed_object_info_detail(struct packed_git *p,
        for (;;) {
                switch (kind) {
                default:
-                       die("corrupted pack file %s containing object of kind %d",
+                       die("pack %s contains unknown object type %d",
                            p->pack_name, kind);
                case OBJ_COMMIT:
                case OBJ_TREE:
@@ -1063,7 +1062,7 @@ static int packed_object_info(struct packed_git *p, unsigned long offset,
                strcpy(type, type_names[kind]);
                break;
        default:
-               die("corrupted pack file %s containing object of kind %d",
+               die("pack %s contains unknown object type %d",
                    p->pack_name, kind);
        }
        if (sizep)
@@ -1110,7 +1109,7 @@ static void *unpack_delta_entry(struct packed_git *p,
        unsigned long result_size, base_size, base_offset;
 
        offset = get_delta_base(p, offset, kind, obj_offset, &base_offset);
-       base = unpack_entry_gently(p, base_offset, type, &base_size);
+       base = unpack_entry(p, base_offset, type, &base_size);
        if (!base)
                die("failed to read delta base object at %lu from %s",
                    base_offset, p->pack_name);
@@ -1127,43 +1126,34 @@ static void *unpack_delta_entry(struct packed_git *p,
        return result;
 }
 
-static void *unpack_entry(struct pack_entry *entry,
+void *unpack_entry(struct packed_git *p, unsigned long offset,
                          char *type, unsigned long *sizep)
 {
-       struct packed_git *p = entry->p;
+       unsigned long size, obj_offset = offset;
+       enum object_type kind;
        void *retval;
 
        if (use_packed_git(p))
                die("cannot map packed file");
-       retval = unpack_entry_gently(p, entry->offset, type, sizep);
-       unuse_packed_git(p);
-       if (!retval)
-               die("corrupted pack file %s", p->pack_name);
-       return retval;
-}
-
-/* The caller is responsible for use_packed_git()/unuse_packed_git() pair */
-void *unpack_entry_gently(struct packed_git *p, unsigned long offset,
-                         char *type, unsigned long *sizep)
-{
-       unsigned long size, obj_offset = offset;
-       enum object_type kind;
-
        offset = unpack_object_header(p, offset, &kind, &size);
        switch (kind) {
        case OBJ_OFS_DELTA:
        case OBJ_REF_DELTA:
-               return unpack_delta_entry(p, offset, size, kind, obj_offset, type, sizep);
+               retval = unpack_delta_entry(p, offset, size, kind, obj_offset, type, sizep);
+               break;
        case OBJ_COMMIT:
        case OBJ_TREE:
        case OBJ_BLOB:
        case OBJ_TAG:
                strcpy(type, type_names[kind]);
                *sizep = size;
-               return unpack_compressed_entry(p, offset, size);
+               retval = unpack_compressed_entry(p, offset, size);
+               break;
        default:
-               return NULL;
+               die("unknown object type %i in %s", kind, p->pack_name);
        }
+       unuse_packed_git(p);
+       return retval;
 }
 
 int num_packed_objects(const struct packed_git *p)
@@ -1312,7 +1302,7 @@ static void *read_packed_sha1(const unsigned char *sha1, char *type, unsigned lo
                error("cannot read sha1_file for %s", sha1_to_hex(sha1));
                return NULL;
        }
-       return unpack_entry(&e, type, size);
+       return unpack_entry(e.p, e.offset, type, size);
 }
 
 void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size)