sha1_file: use llist_mergesort() for sorting packs
Sort the linked list of packs directly using llist_mergesort() instead of building an array, calling qsort(3) and fixing up the list pointers. This is shorter and less complicated. Signed-off-by: Rene Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
35f6318d44
commit
c4c6effa9b
39
sha1_file.c
39
sha1_file.c
@ -25,6 +25,7 @@
|
|||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
#include "mru.h"
|
#include "mru.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
|
#include "mergesort.h"
|
||||||
|
|
||||||
#ifndef O_NOATIME
|
#ifndef O_NOATIME
|
||||||
#if defined(__linux__) && (defined(__i386__) || defined(__PPC__))
|
#if defined(__linux__) && (defined(__i386__) || defined(__PPC__))
|
||||||
@ -1380,10 +1381,20 @@ static void prepare_packed_git_one(char *objdir, int local)
|
|||||||
strbuf_release(&path);
|
strbuf_release(&path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *get_next_packed_git(const void *p)
|
||||||
|
{
|
||||||
|
return ((const struct packed_git *)p)->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_next_packed_git(void *p, void *next)
|
||||||
|
{
|
||||||
|
((struct packed_git *)p)->next = next;
|
||||||
|
}
|
||||||
|
|
||||||
static int sort_pack(const void *a_, const void *b_)
|
static int sort_pack(const void *a_, const void *b_)
|
||||||
{
|
{
|
||||||
struct packed_git *a = *((struct packed_git **)a_);
|
const struct packed_git *a = a_;
|
||||||
struct packed_git *b = *((struct packed_git **)b_);
|
const struct packed_git *b = b_;
|
||||||
int st;
|
int st;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1410,28 +1421,8 @@ static int sort_pack(const void *a_, const void *b_)
|
|||||||
|
|
||||||
static void rearrange_packed_git(void)
|
static void rearrange_packed_git(void)
|
||||||
{
|
{
|
||||||
struct packed_git **ary, *p;
|
packed_git = llist_mergesort(packed_git, get_next_packed_git,
|
||||||
int i, n;
|
set_next_packed_git, sort_pack);
|
||||||
|
|
||||||
for (n = 0, p = packed_git; p; p = p->next)
|
|
||||||
n++;
|
|
||||||
if (n < 2)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* prepare an array of packed_git for easier sorting */
|
|
||||||
ary = xcalloc(n, sizeof(struct packed_git *));
|
|
||||||
for (n = 0, p = packed_git; p; p = p->next)
|
|
||||||
ary[n++] = p;
|
|
||||||
|
|
||||||
qsort(ary, n, sizeof(struct packed_git *), sort_pack);
|
|
||||||
|
|
||||||
/* link them back again */
|
|
||||||
for (i = 0; i < n - 1; i++)
|
|
||||||
ary[i]->next = ary[i + 1];
|
|
||||||
ary[n - 1]->next = NULL;
|
|
||||||
packed_git = ary[0];
|
|
||||||
|
|
||||||
free(ary);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void prepare_packed_git_mru(void)
|
static void prepare_packed_git_mru(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user