#ifndef PACK_OBJECTS_H #define PACK_OBJECTS_H #include "object-store-ll.h" #include "thread-utils.h" #include "pack.h" struct repository; #define DEFAULT_DELTA_CACHE_SIZE … #define OE_DFS_STATE_BITS … #define OE_DEPTH_BITS … #define OE_IN_PACK_BITS … #define OE_Z_DELTA_BITS … /* * Note that oe_set_size() becomes expensive when the given size is * above this limit. Don't lower it too much. */ #define OE_SIZE_BITS … #define OE_DELTA_SIZE_BITS … /* * State flags for depth-first search used for analyzing delta cycles. * * The depth is measured in delta-links to the base (so if A is a delta * against B, then A has a depth of 1, and B a depth of 0). */ enum dfs_state { … }; /* * The size of struct nearly determines pack-objects's memory * consumption. This struct is packed tight for that reason. When you * add or reorder something in this struct, think a bit about this. * * basic object info * ----------------- * idx.oid is filled up before delta searching starts. idx.crc32 is * only valid after the object is written out and will be used for * generating the index. idx.offset will be both gradually set and * used in writing phase (base objects get offset first, then deltas * refer to them) * * "size" is the uncompressed object size. Compressed size of the raw * data for an object in a pack is not stored anywhere but is computed * and made available when reverse .idx is made. Note that when a * delta is reused, "size" is the uncompressed _delta_ size, not the * canonical one after the delta has been applied. * * "hash" contains a path name hash which is used for sorting the * delta list and also during delta searching. Once prepare_pack() * returns it's no longer needed. * * source pack info * ---------------- * The (in_pack, in_pack_offset) tuple contains the location of the * object in the source pack. in_pack_header_size allows quickly * skipping the header and going straight to the zlib stream. * * "type" and "in_pack_type" both describe object type. in_pack_type * may contain a delta type, while type is always the canonical type. * * deltas * ------ * Delta links (delta, delta_child and delta_sibling) are created to * reflect that delta graph from the source pack then updated or added * during delta searching phase when we find better deltas. * * delta_child and delta_sibling are last needed in * compute_write_order(). "delta" and "delta_size" must remain valid * at object writing phase in case the delta is not cached. * * If a delta is cached in memory and is compressed, delta_data points * to the data and z_delta_size contains the compressed size. If it's * uncompressed [1], z_delta_size must be zero. delta_size is always * the uncompressed size and must be valid even if the delta is not * cached. * * [1] during try_delta phase we don't bother with compressing because * the delta could be quickly replaced with a better one. */ struct object_entry { … }; struct packing_data { … }; void prepare_packing_data(struct repository *r, struct packing_data *pdata); void clear_packing_data(struct packing_data *pdata); /* Protect access to object database */ static inline void packing_data_lock(struct packing_data *pdata) { … } static inline void packing_data_unlock(struct packing_data *pdata) { … } struct object_entry *packlist_alloc(struct packing_data *pdata, const struct object_id *oid); struct object_entry *packlist_find(struct packing_data *pdata, const struct object_id *oid); static inline uint32_t pack_name_hash(const char *name) { … } static inline enum object_type oe_type(const struct object_entry *e) { … } static inline void oe_set_type(struct object_entry *e, enum object_type type) { … } static inline unsigned int oe_in_pack_pos(const struct packing_data *pack, const struct object_entry *e) { … } static inline void oe_set_in_pack_pos(const struct packing_data *pack, const struct object_entry *e, unsigned int pos) { … } static inline struct packed_git *oe_in_pack(const struct packing_data *pack, const struct object_entry *e) { … } void oe_map_new_pack(struct packing_data *pack); static inline void oe_set_in_pack(struct packing_data *pack, struct object_entry *e, struct packed_git *p) { … } void oe_set_delta_ext(struct packing_data *pack, struct object_entry *e, const struct object_id *oid); static inline unsigned int oe_tree_depth(struct packing_data *pack, struct object_entry *e) { … } static inline void oe_set_layer(struct packing_data *pack, struct object_entry *e, unsigned char layer) { … } static inline uint32_t oe_cruft_mtime(struct packing_data *pack, struct object_entry *e) { … } static inline void oe_set_cruft_mtime(struct packing_data *pack, struct object_entry *e, uint32_t mtime) { … } #endif