Convert deltas to dynamic allocation
Another elimination of a static length structure in libalpm. Should result in a little more memory saved during execution of packages with lots of deltas attached. Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
parent
f6785dcb89
commit
927af790ee
4 changed files with 28 additions and 19 deletions
|
@ -487,7 +487,8 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
|
||||||
|
|
||||||
/* DELTAS */
|
/* DELTAS */
|
||||||
if(inforeq & INFRQ_DELTAS) {
|
if(inforeq & INFRQ_DELTAS) {
|
||||||
snprintf(path, PATH_MAX, "%s/%s-%s/deltas", db->path, info->name, info->version);
|
snprintf(path, PATH_MAX, "%s/%s-%s/deltas", db->path,
|
||||||
|
info->name, info->version);
|
||||||
if((fp = fopen(path, "r"))) {
|
if((fp = fopen(path, "r"))) {
|
||||||
while(!feof(fp)) {
|
while(!feof(fp)) {
|
||||||
fgets(line, 255, fp);
|
fgets(line, 255, fp);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* delta.c
|
* delta.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2007-2008 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -99,7 +99,7 @@ unsigned long _alpm_delta_path_size(alpm_list_t *deltas)
|
||||||
alpm_list_t *dlts = deltas;
|
alpm_list_t *dlts = deltas;
|
||||||
|
|
||||||
while(dlts) {
|
while(dlts) {
|
||||||
pmdelta_t *d = (pmdelta_t *)alpm_list_getdata(dlts);
|
pmdelta_t *d = alpm_list_getdata(dlts);
|
||||||
sum += d->size;
|
sum += d->size;
|
||||||
|
|
||||||
dlts = alpm_list_next(dlts);
|
dlts = alpm_list_next(dlts);
|
||||||
|
@ -121,7 +121,7 @@ unsigned long _alpm_delta_path_size_uncached(alpm_list_t *deltas)
|
||||||
alpm_list_t *dlts = deltas;
|
alpm_list_t *dlts = deltas;
|
||||||
|
|
||||||
while(dlts) {
|
while(dlts) {
|
||||||
pmdelta_t *d = (pmdelta_t *)alpm_list_getdata(dlts);
|
pmdelta_t *d = alpm_list_getdata(dlts);
|
||||||
char *fname = _alpm_filecache_find(d->filename);
|
char *fname = _alpm_filecache_find(d->filename);
|
||||||
|
|
||||||
if(!fname) {
|
if(!fname) {
|
||||||
|
@ -241,12 +241,12 @@ pmdelta_t *_alpm_delta_parse(char *line)
|
||||||
tmp2 = tmp;
|
tmp2 = tmp;
|
||||||
tmp = strchr(tmp, ' ');
|
tmp = strchr(tmp, ' ');
|
||||||
*(tmp++) = '\0';
|
*(tmp++) = '\0';
|
||||||
strncpy(delta->from, tmp2, DLT_VERSION_LEN);
|
STRDUP(delta->from, tmp2, RET_ERR(PM_ERR_MEMORY, NULL));
|
||||||
|
|
||||||
tmp2 = tmp;
|
tmp2 = tmp;
|
||||||
tmp = strchr(tmp, ' ');
|
tmp = strchr(tmp, ' ');
|
||||||
*(tmp++) = '\0';
|
*(tmp++) = '\0';
|
||||||
strncpy(delta->to, tmp2, DLT_VERSION_LEN);
|
STRDUP(delta->to, tmp2, RET_ERR(PM_ERR_MEMORY, NULL));
|
||||||
|
|
||||||
tmp2 = tmp;
|
tmp2 = tmp;
|
||||||
tmp = strchr(tmp, ' ');
|
tmp = strchr(tmp, ' ');
|
||||||
|
@ -256,11 +256,20 @@ pmdelta_t *_alpm_delta_parse(char *line)
|
||||||
tmp2 = tmp;
|
tmp2 = tmp;
|
||||||
tmp = strchr(tmp, ' ');
|
tmp = strchr(tmp, ' ');
|
||||||
*(tmp++) = '\0';
|
*(tmp++) = '\0';
|
||||||
strncpy(delta->filename, tmp2, DLT_FILENAME_LEN);
|
STRDUP(delta->filename, tmp2, RET_ERR(PM_ERR_MEMORY, NULL));
|
||||||
|
|
||||||
strncpy(delta->md5sum, tmp, DLT_MD5SUM_LEN);
|
STRDUP(delta->md5sum, tmp, RET_ERR(PM_ERR_MEMORY, NULL));
|
||||||
|
|
||||||
return(delta);
|
return(delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _alpm_delta_free(pmdelta_t *delta)
|
||||||
|
{
|
||||||
|
FREE(delta->from);
|
||||||
|
FREE(delta->to);
|
||||||
|
FREE(delta->filename);
|
||||||
|
FREE(delta->md5sum);
|
||||||
|
FREE(delta);
|
||||||
|
}
|
||||||
|
|
||||||
/* vim: set ts=2 sw=2 noet: */
|
/* vim: set ts=2 sw=2 noet: */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* delta.h
|
* delta.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2007-2008 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -21,22 +21,20 @@
|
||||||
|
|
||||||
#include "alpm.h"
|
#include "alpm.h"
|
||||||
|
|
||||||
#define DLT_FILENAME_LEN 512
|
|
||||||
#define DLT_VERSION_LEN 64
|
|
||||||
#define DLT_MD5SUM_LEN 33
|
|
||||||
|
|
||||||
struct __pmdelta_t {
|
struct __pmdelta_t {
|
||||||
char from[DLT_VERSION_LEN];
|
char *from;
|
||||||
char to[DLT_VERSION_LEN];
|
char *to;
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
char filename[DLT_FILENAME_LEN];
|
char *filename;
|
||||||
char md5sum[DLT_MD5SUM_LEN];
|
char *md5sum;
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned long _alpm_delta_path_size(alpm_list_t *deltas);
|
unsigned long _alpm_delta_path_size(alpm_list_t *deltas);
|
||||||
unsigned long _alpm_delta_path_size_uncached(alpm_list_t *deltas);
|
unsigned long _alpm_delta_path_size_uncached(alpm_list_t *deltas);
|
||||||
pmdelta_t *_alpm_delta_parse(char *line);
|
pmdelta_t *_alpm_delta_parse(char *line);
|
||||||
alpm_list_t *_alpm_shortest_delta_path(alpm_list_t *deltas, const char *from, const char *to);
|
void _alpm_delta_free(pmdelta_t *delta);
|
||||||
|
alpm_list_t *_alpm_shortest_delta_path(alpm_list_t *deltas,
|
||||||
|
const char *from, const char *to);
|
||||||
|
|
||||||
#endif /* _ALPM_DELTA_H */
|
#endif /* _ALPM_DELTA_H */
|
||||||
|
|
||||||
|
|
|
@ -845,7 +845,8 @@ void _alpm_pkg_free(pmpkg_t *pkg)
|
||||||
FREELIST(pkg->optdepends);
|
FREELIST(pkg->optdepends);
|
||||||
FREELIST(pkg->conflicts);
|
FREELIST(pkg->conflicts);
|
||||||
FREELIST(pkg->provides);
|
FREELIST(pkg->provides);
|
||||||
FREELIST(pkg->deltas);
|
alpm_list_free_inner(pkg->deltas, (alpm_list_fn_free)_alpm_delta_free);
|
||||||
|
alpm_list_free(pkg->deltas);
|
||||||
|
|
||||||
if(pkg->origin == PKG_FROM_FILE) {
|
if(pkg->origin == PKG_FROM_FILE) {
|
||||||
FREE(pkg->origin_data.file);
|
FREE(pkg->origin_data.file);
|
||||||
|
|
Loading…
Add table
Reference in a new issue