Convert package filelists to an array instead of linked list
commitbb3dada8711fbb822513cd556167867b537f8986
authorDan McGee <dan@archlinux.org>
Tue, 19 Jul 2011 09:47:29 +0000 (19 04:47 -0500)
committerDan McGee <dan@archlinux.org>
Thu, 21 Jul 2011 20:04:30 +0000 (21 15:04 -0500)
tree1230de6f94675777e9cdd4150779f4756995efa1
parent058ee1737182c2d5e900e0feba57f0d6496e735e
Convert package filelists to an array instead of linked list

This accomplishes quite a few things with one rather invasive change.

1. Iteration is much more performant, due to a reduction in pointer
   chasing and linear item access.
2. Data structures are smaller- we no longer have the overhead of the
   linked list as the file struts are now laid out consecutively in
   memory.
3. Memory allocation has been massively reworked. Before, we would
   allocate three different pieces of memory per file item- the list
   struct, the file struct, and the copied filename. What this resulted
   in was massive fragmentation of memory when loading filelists since
   the memory allocator had to leave holes all over the place. The new
   situation here now removes the need for any list item allocation;
   allocates the file structs in contiguous memory (and reallocs as
   necessary), leaving only the strings as individually allocated. Tests
   using valgrind (massif) show some pretty significant memory
   reductions on the worst case `pacman -Ql > /dev/null` (366387 files
   on my machine):

   Before:
     Peak heap:   54,416,024 B
 Useful heap: 36,840,692 B
 Extra heap:  17,575,332 B

   After:
     Peak heap:   38,004,352 B
 Useful heap: 28,101,347 B
 Extra heap:   9,903,005 B

Several small helper methods have been introduced, including a list to
array conversion helper as well as a filelist merge sort that works
directly on arrays.

Signed-off-by: Dan McGee <dan@archlinux.org>
13 files changed:
lib/libalpm/alpm.h
lib/libalpm/alpm_list.c
lib/libalpm/alpm_list.h
lib/libalpm/be_local.c
lib/libalpm/be_package.c
lib/libalpm/conflict.c
lib/libalpm/conflict.h
lib/libalpm/diskspace.c
lib/libalpm/package.c
lib/libalpm/package.h
lib/libalpm/remove.c
src/pacman/package.c
src/pacman/query.c