@@ -33,12 +33,15 @@ struct object_stat {
33
33
};
34
34
35
35
struct base_data {
36
+ /* Initialized by make_base(). */
36
37
struct base_data * base ;
37
38
struct object_entry * obj ;
38
- void * data ;
39
- unsigned long size ;
40
39
int ref_first , ref_last ;
41
40
int ofs_first , ofs_last ;
41
+
42
+ /* Not initialized by make_base(). */
43
+ void * data ;
44
+ unsigned long size ;
42
45
};
43
46
44
47
struct thread_local {
@@ -362,14 +365,6 @@ static void set_thread_data(struct thread_local *data)
362
365
pthread_setspecific (key , data );
363
366
}
364
367
365
- static struct base_data * alloc_base_data (void )
366
- {
367
- struct base_data * base = xcalloc (1 , sizeof (struct base_data ));
368
- base -> ref_last = -1 ;
369
- base -> ofs_last = -1 ;
370
- return base ;
371
- }
372
-
373
368
static void free_base_data (struct base_data * c )
374
369
{
375
370
if (c -> data ) {
@@ -406,19 +401,6 @@ static void prune_base_data(struct base_data *youngest_child)
406
401
free (ancestry );
407
402
}
408
403
409
- static void link_base_data (struct base_data * base , struct base_data * c )
410
- {
411
- c -> base = base ;
412
- if (c -> data )
413
- get_thread_data ()-> base_cache_used += c -> size ;
414
- prune_base_data (c );
415
- }
416
-
417
- static void unlink_base_data (struct base_data * c )
418
- {
419
- free_base_data (c );
420
- }
421
-
422
404
static int is_delta_type (enum object_type type )
423
405
{
424
406
return (type == OBJ_REF_DELTA || type == OBJ_OFS_DELTA );
@@ -929,10 +911,25 @@ static void *get_base_data(struct base_data *c)
929
911
return c -> data ;
930
912
}
931
913
932
- static void resolve_delta (struct object_entry * delta_obj ,
933
- struct base_data * base , struct base_data * result )
914
+ static struct base_data * make_base (struct object_entry * obj ,
915
+ struct base_data * parent )
934
916
{
935
- void * base_data , * delta_data ;
917
+ struct base_data * base = xcalloc (1 , sizeof (struct base_data ));
918
+ base -> base = parent ;
919
+ base -> obj = obj ;
920
+ find_ref_delta_children (& obj -> idx .oid ,
921
+ & base -> ref_first , & base -> ref_last );
922
+ find_ofs_delta_children (obj -> idx .offset ,
923
+ & base -> ofs_first , & base -> ofs_last );
924
+ return base ;
925
+ }
926
+
927
+ static struct base_data * resolve_delta (struct object_entry * delta_obj ,
928
+ struct base_data * base )
929
+ {
930
+ void * base_data , * delta_data , * result_data ;
931
+ struct base_data * result ;
932
+ unsigned long result_size ;
936
933
937
934
if (show_stat ) {
938
935
int i = delta_obj - objects ;
@@ -946,19 +943,31 @@ static void resolve_delta(struct object_entry *delta_obj,
946
943
}
947
944
delta_data = get_data_from_pack (delta_obj );
948
945
base_data = get_base_data (base );
949
- result -> obj = delta_obj ;
950
- result -> data = patch_delta (base_data , base -> size ,
951
- delta_data , delta_obj -> size , & result -> size );
946
+ result_data = patch_delta (base_data , base -> size ,
947
+ delta_data , delta_obj -> size , & result_size );
952
948
free (delta_data );
953
- if (!result -> data )
949
+ if (!result_data )
954
950
bad_object (delta_obj -> idx .offset , _ ("failed to apply delta" ));
955
- hash_object_file (the_hash_algo , result -> data , result -> size ,
951
+ hash_object_file (the_hash_algo , result_data , result_size ,
956
952
type_name (delta_obj -> real_type ), & delta_obj -> idx .oid );
957
- sha1_object (result -> data , NULL , result -> size , delta_obj -> real_type ,
953
+ sha1_object (result_data , NULL , result_size , delta_obj -> real_type ,
958
954
& delta_obj -> idx .oid );
955
+
956
+ result = make_base (delta_obj , base );
957
+ if (result -> ref_last == -1 && result -> ofs_last == -1 ) {
958
+ free (result_data );
959
+ } else {
960
+ result -> data = result_data ;
961
+ result -> size = result_size ;
962
+ get_thread_data ()-> base_cache_used += result -> size ;
963
+ prune_base_data (result );
964
+ }
965
+
959
966
counter_lock ();
960
967
nr_resolved_deltas ++ ;
961
968
counter_unlock ();
969
+
970
+ return result ;
962
971
}
963
972
964
973
/*
@@ -984,32 +993,17 @@ static int compare_and_swap_type(signed char *type,
984
993
static struct base_data * find_unresolved_deltas_1 (struct base_data * base ,
985
994
struct base_data * prev_base )
986
995
{
987
- if (base -> ref_last == -1 && base -> ofs_last == -1 ) {
988
- find_ref_delta_children (& base -> obj -> idx .oid ,
989
- & base -> ref_first , & base -> ref_last );
990
-
991
- find_ofs_delta_children (base -> obj -> idx .offset ,
992
- & base -> ofs_first , & base -> ofs_last );
993
-
994
- if (base -> ref_last == -1 && base -> ofs_last == -1 ) {
995
- free (base -> data );
996
- return NULL ;
997
- }
998
-
999
- link_base_data (prev_base , base );
1000
- }
1001
-
1002
996
if (base -> ref_first <= base -> ref_last ) {
1003
997
struct object_entry * child = objects + ref_deltas [base -> ref_first ].obj_no ;
1004
- struct base_data * result = alloc_base_data () ;
998
+ struct base_data * result ;
1005
999
1006
1000
if (!compare_and_swap_type (& child -> real_type , OBJ_REF_DELTA ,
1007
1001
base -> obj -> real_type ))
1008
1002
die ("REF_DELTA at offset %" PRIuMAX " already resolved (duplicate base %s?)" ,
1009
1003
(uintmax_t )child -> idx .offset ,
1010
1004
oid_to_hex (& base -> obj -> idx .oid ));
1011
1005
1012
- resolve_delta (child , base , result );
1006
+ result = resolve_delta (child , base );
1013
1007
if (base -> ref_first == base -> ref_last && base -> ofs_last == -1 )
1014
1008
free_base_data (base );
1015
1009
@@ -1019,19 +1013,19 @@ static struct base_data *find_unresolved_deltas_1(struct base_data *base,
1019
1013
1020
1014
if (base -> ofs_first <= base -> ofs_last ) {
1021
1015
struct object_entry * child = objects + ofs_deltas [base -> ofs_first ].obj_no ;
1022
- struct base_data * result = alloc_base_data () ;
1016
+ struct base_data * result ;
1023
1017
1024
1018
assert (child -> real_type == OBJ_OFS_DELTA );
1025
1019
child -> real_type = base -> obj -> real_type ;
1026
- resolve_delta (child , base , result );
1020
+ result = resolve_delta (child , base );
1027
1021
if (base -> ofs_first == base -> ofs_last )
1028
1022
free_base_data (base );
1029
1023
1030
1024
base -> ofs_first ++ ;
1031
1025
return result ;
1032
1026
}
1033
1027
1034
- unlink_base_data (base );
1028
+ free_base_data (base );
1035
1029
return NULL ;
1036
1030
}
1037
1031
@@ -1074,9 +1068,8 @@ static int compare_ref_delta_entry(const void *a, const void *b)
1074
1068
1075
1069
static void resolve_base (struct object_entry * obj )
1076
1070
{
1077
- struct base_data * base_obj = alloc_base_data ();
1078
- base_obj -> obj = obj ;
1079
- base_obj -> data = NULL ;
1071
+ struct base_data * base_obj = make_base (obj , NULL );
1072
+
1080
1073
find_unresolved_deltas (base_obj );
1081
1074
}
1082
1075
@@ -1369,22 +1362,26 @@ static void fix_unresolved_deltas(struct hashfile *f)
1369
1362
for (i = 0 ; i < nr_ref_deltas ; i ++ ) {
1370
1363
struct ref_delta_entry * d = sorted_by_pos [i ];
1371
1364
enum object_type type ;
1372
- struct base_data * base_obj = alloc_base_data ();
1365
+ struct base_data * base ;
1366
+ void * data ;
1367
+ unsigned long size ;
1368
+ struct object_entry * obj ;
1373
1369
1374
1370
if (objects [d -> obj_no ].real_type != OBJ_REF_DELTA )
1375
1371
continue ;
1376
- base_obj -> data = read_object_file (& d -> oid , & type ,
1377
- & base_obj -> size );
1378
- if (!base_obj -> data )
1372
+ data = read_object_file (& d -> oid , & type , & size );
1373
+ if (!data )
1379
1374
continue ;
1380
1375
1381
1376
if (check_object_signature (the_repository , & d -> oid ,
1382
- base_obj -> data , base_obj -> size ,
1377
+ data , size ,
1383
1378
type_name (type )))
1384
1379
die (_ ("local object %s is corrupt" ), oid_to_hex (& d -> oid ));
1385
- base_obj -> obj = append_obj_to_pack (f , d -> oid .hash ,
1386
- base_obj -> data , base_obj -> size , type );
1387
- find_unresolved_deltas (base_obj );
1380
+ obj = append_obj_to_pack (f , d -> oid .hash , data , size , type );
1381
+ base = make_base (obj , NULL );
1382
+ base -> data = data ;
1383
+ base -> size = size ;
1384
+ find_unresolved_deltas (base );
1388
1385
display_progress (progress , nr_resolved_deltas );
1389
1386
}
1390
1387
free (sorted_by_pos );
0 commit comments