struct llist_item {
struct llist_item *next;
- char *sha1;
+ unsigned char *sha1;
};
static struct llist {
struct llist_item *front;
size_t pl_size;
};
-static inline void llist_free(struct llist *list)
+static struct llist_item *free_nodes = NULL;
+
+static inline struct llist_item *llist_item_get()
+{
+ struct llist_item *new;
+ if ( free_nodes ) {
+ new = free_nodes;
+ free_nodes = free_nodes->next;
+ } else
+ new = xmalloc(sizeof(struct llist_item));
+
+ return new;
+}
+
+static inline void llist_item_put(struct llist_item *item)
+{
+ item->next = free_nodes;
+ free_nodes = item;
+}
+
+static void llist_free(struct llist *list)
{
while((list->back = list->front)) {
list->front = list->front->next;
- free(list->back);
+ llist_item_put(list->back);
}
free(list);
}
if ((ret->size = list->size) == 0)
return ret;
- new = ret->front = xmalloc(sizeof(struct llist_item));
+ new = ret->front = llist_item_get();
new->sha1 = list->front->sha1;
old = list->front->next;
while (old) {
prev = new;
- new = xmalloc(sizeof(struct llist_item));
+ new = llist_item_get();
prev->next = new;
new->sha1 = old->sha1;
old = old->next;
}
static inline struct llist_item * llist_insert(struct llist *list,
- struct llist_item *after, char *sha1)
+ struct llist_item *after,
+ unsigned char *sha1)
{
- struct llist_item *new = xmalloc(sizeof(struct llist_item));
+ struct llist_item *new = llist_item_get();
new->sha1 = sha1;
new->next = NULL;
return new;
}
-static inline struct llist_item * llist_insert_back(struct llist *list, char *sha1)
+static inline struct llist_item *llist_insert_back(struct llist *list, unsigned char *sha1)
{
return llist_insert(list, list->back, sha1);
}
-static inline struct llist_item * llist_insert_sorted_unique(struct llist *list,
- char *sha1, struct llist_item *hint)
+static inline struct llist_item *llist_insert_sorted_unique(struct llist *list, unsigned char *sha1, struct llist_item *hint)
{
struct llist_item *prev = NULL, *l;
}
/* returns a pointer to an item in front of sha1 */
-static inline struct llist_item * llist_sorted_remove(struct llist *list, char *sha1,
- struct llist_item *hint)
+static inline struct llist_item * llist_sorted_remove(struct llist *list, const unsigned char *sha1, struct llist_item *hint)
{
struct llist_item *prev, *l;
prev->next = l->next;
if (l == list->back)
list->back = prev;
- free(l);
+ llist_item_put(l);
list->size--;
return prev;
}
return ret;
}
-static struct pack_list * pack_list_difference(struct pack_list *A,
- struct pack_list *B)
+static struct pack_list * pack_list_difference(const struct pack_list *A,
+ const struct pack_list *B)
{
- struct pack_list *ret, *pl;
+ struct pack_list *ret;
+ const struct pack_list *pl;
if (A == NULL)
return NULL;
diff = llist_copy(list);
while (pl) {
- llist_sorted_difference_inplace(diff,
- pl->all_objects);
+ llist_sorted_difference_inplace(diff, pl->all_objects);
if (diff->size == 0) { /* we're done */
llist_free(diff);
return 1;
{
struct pack_list *pl = local_packs;
struct llist_item *hint, *l;
- int i;
llist_init(&all_objects);
while (pl) {
- i = 0;
hint = NULL;
l = pl->all_objects->front;
while (l) {
int i;
struct pack_list *min, *red, *pl;
struct llist *ignore;
- char *sha1, buf[42]; /* 40 byte sha1 + \n + \0 */
+ unsigned char *sha1;
+ char buf[42]; /* 40 byte sha1 + \n + \0 */
for (i = 1; i < argc; i++) {
const char *arg = argv[i];
pl = pl->next;
}
if (verbose)
- fprintf(stderr, "%luMB of redundant packs in total.\n", pack_set_bytecount(red)/(1024*1024));
+ fprintf(stderr, "%luMB of redundant packs in total.\n",
+ (unsigned long)pack_set_bytecount(red)/(1024*1024));
return 0;
}