poldek: poldek/capreq.c, poldek/capreq.h, poldek/capreqidx.c, pold...
mis
mis at pld-linux.org
Thu Jul 12 23:29:31 CEST 2007
Author: mis Date: Thu Jul 12 21:29:31 2007 GMT
Module: poldek Tag: HEAD
---- Log message:
- cap names allocated once (reduces cpu and mem usage)
- minor cleanups
---- Files affected:
poldek/poldek:
capreq.c (1.45 -> 1.46) , capreq.h (1.31 -> 1.32) , capreqidx.c (1.17 -> 1.18) , capreqidx.h (1.9 -> 1.10) , fileindex.c (1.31 -> 1.32) , fileindex.h (1.12 -> 1.13) , pkgset-req.c (1.52 -> 1.53) , pkgset.c (1.99 -> 1.100) , lib_pkgset.c (1.21 -> 1.22) , pkg.c (1.118 -> 1.119)
poldek/poldek/install:
obsoletes.c (1.10 -> 1.11) , requirements.c (1.11 -> 1.12)
---- Diffs:
================================================================
Index: poldek/poldek/capreq.c
diff -u poldek/poldek/capreq.c:1.45 poldek/poldek/capreq.c:1.46
--- poldek/poldek/capreq.c:1.45 Sat Jun 30 14:01:43 2007
+++ poldek/poldek/capreq.c Thu Jul 12 23:29:26 2007
@@ -39,6 +39,44 @@
static void capreq_store(struct capreq *cr, tn_buf *nbuf);
static struct capreq *capreq_restore(tn_alloc *na, tn_buf_it *nbufi);
+static tn_hash *capreqname_h = NULL;
+static tn_alloc *capreqname_na = NULL;
+static const char *capreqname_last_name = NULL; /* semi-cache */
+
+static void capreqname_init(void)
+{
+ capreqname_na = n_alloc_new(256, TN_ALLOC_OBSTACK);
+ capreqname_h = n_hash_new_na(capreqname_na, 1024 * 128, NULL);
+ n_hash_ctl(capreqname_h, TN_HASH_NOCPKEY);
+}
+
+const char *capreq__alloc_name(const char *name)
+{
+ unsigned khash = 0;
+ int klen = 0;
+ char *naname;
+
+ if (!capreqname_h)
+ capreqname_init();
+
+ if (capreqname_last_name && strcmp(capreqname_last_name, name) == 0)
+ return capreqname_last_name;
+
+ //if (n_hash_size(capreqname_h) % 5000 == 0)
+ // n_hash_stats(capreqname_h);
+
+ if ((naname = n_hash_get_ex(capreqname_h, name, &klen, &khash))) {
+ capreqname_last_name = naname;
+ return naname;
+ }
+
+ naname = capreqname_na->na_malloc(capreqname_na, klen + 1);
+ memcpy(naname, name, klen + 1);
+ capreqname_last_name = naname;
+ n_hash_insert_ex(capreqname_h, naname, klen, khash, naname);
+
+ return naname;
+}
void capreq_free_na(tn_alloc *na, struct capreq *cr)
{
@@ -92,7 +130,7 @@
int capreq_cmp_name_evr(struct capreq *cr1, struct capreq *cr2)
{
register int rc;
-
+
if ((rc = strcmp(capreq_name(cr1), capreq_name(cr2))))
return rc;
@@ -207,7 +245,7 @@
return do_capreq_snprintf(str, size, cr, 0);
}
-uint8_t capreq_bufsize(const struct capreq *cr)
+static uint8_t capreq_bufsize(const struct capreq *cr)
{
register int max_ofs = 0;
@@ -222,8 +260,9 @@
if (max_ofs == 0)
max_ofs = 1;
+ else
+ max_ofs += strlen(&cr->_buff[max_ofs]) + 1;
- max_ofs += strlen(&cr->_buf[max_ofs]) + 1;
//printf("sizeof %s = %d (5 + %d + (%s) + %d)\n", capreq_snprintf_s(cr),
// size, max_ofs, &cr->_buf[max_ofs], strlen(&cr->_buf[max_ofs]));
@@ -233,8 +272,7 @@
return max_ofs;
}
-static
-uint8_t capreq_sizeof(const struct capreq *cr)
+static uint8_t capreq_sizeof(const struct capreq *cr)
{
size_t size;
@@ -294,7 +332,7 @@
name_len = strlen(name);
}
- len = 1 + name_len + 1;
+ len = 1; // + name_len + 1;
if (epoch) {
if (version == NULL)
@@ -327,29 +365,31 @@
cr->cr_flags = cr->cr_relflags = 0;
cr->cr_ep_ofs = cr->cr_ver_ofs = cr->cr_rel_ofs = 0;
+
+ cr->name = capreq__alloc_name(name);
- buf = cr->_buf;
+ buf = cr->_buff;
*buf++ = '\0'; /* set buf[0] to '\0' */
- memcpy(buf, name, name_len);
- buf += name_len;
- *buf++ = '\0';
+ //memcpy(buf, name, name_len);
+ //buf += name_len;
+ //*buf++ = '\0';
if (epoch) {
- cr->cr_ep_ofs = buf - cr->_buf;
+ cr->cr_ep_ofs = buf - cr->_buff;
memcpy(buf, &epoch, sizeof(epoch));
buf += sizeof(epoch);
}
if (version != NULL) {
- cr->cr_ver_ofs = buf - cr->_buf;
+ cr->cr_ver_ofs = buf - cr->_buff;
memcpy(buf, version, version_len);
buf += version_len ;
*buf++ = '\0';
}
if (release != NULL) {
- cr->cr_rel_ofs = buf - cr->_buf;
+ cr->cr_rel_ofs = buf - cr->_buff;
memcpy(buf, release, release_len);
buf += release_len ;
*buf++ = '\0';
@@ -404,7 +444,7 @@
{
int32_t epoch;
- memcpy(&epoch, &cr->_buf[cr->cr_ep_ofs], sizeof(epoch));
+ memcpy(&epoch, &cr->_buff[cr->cr_ep_ofs], sizeof(epoch));
return epoch;
}
@@ -463,12 +503,26 @@
return nbuf;
}
-
-static
-void capreq_store(struct capreq *cr, tn_buf *nbuf)
+/* store format:
+
+ 0. size uint8_t
+ 1. flags&offsets uint8_t[5]
+ 2. '\0' char // legacy, needless in fact
+ 3. name char[]
+
+ -- if versioned --
+ 4. '\0'
+ 5. epoch uint32_t in network byte order
+ 6. '\0'
+ 7. version char[]
+ 8. '\0'
+ 9. release char[]
+*/
+static void capreq_store(struct capreq *cr, tn_buf *nbuf)
{
+ register int i;
int32_t epoch, nepoch;
- uint8_t size, bufsize;
+ uint8_t size, bufsize, name_len;
uint8_t cr_buf[5];
uint8_t cr_flags = 0, cr_relflags = 0;
@@ -487,23 +541,35 @@
cr_buf[2] = cr->cr_ep_ofs;
cr_buf[3] = cr->cr_ver_ofs;
cr_buf[4] = cr->cr_rel_ofs;
-
- bufsize = capreq_bufsize(cr) - 1; /* without '\0' */
+
+
+ bufsize = capreq_bufsize(cr) - 1; /* without last '\0' */
size = sizeof(cr_buf) + bufsize;
-
+ name_len = strlen(cr->name);
+ size += name_len + 1; /* +1 for leading '\0' */
+
+ for (i=2; i < 5; i++)
+ if (cr_buf[i])
+ cr_buf[i] += name_len + 1;
+
n_buf_add_int8(nbuf, size);
n_buf_add(nbuf, cr_buf, sizeof(cr_buf));
- if (cr->cr_ep_ofs) {
- epoch = capreq_epoch(cr);
- nepoch = n_hton32(epoch);
- memcpy(&cr->_buf[cr->cr_ep_ofs], &nepoch, sizeof(nepoch));
- }
+ n_buf_add_int8(nbuf, '\0');
+ n_buf_add(nbuf, cr->name, name_len);
- n_buf_add(nbuf, cr->_buf, bufsize);
+ if (bufsize) { /* versioned? */
+ if (cr->cr_ep_ofs) {
+ epoch = capreq_epoch(cr);
+ nepoch = n_hton32(epoch);
+ memcpy(&cr->_buff[cr->cr_ep_ofs], &nepoch, sizeof(nepoch));
+ }
- if (cr->cr_ep_ofs)
- memcpy(&cr->_buf[cr->cr_ep_ofs], &epoch, sizeof(epoch)); /* restore epoch */
+ n_buf_add(nbuf, cr->_buff, bufsize);
+
+ if (cr->cr_ep_ofs)
+ memcpy(&cr->_buff[cr->cr_ep_ofs], &epoch, sizeof(epoch));
+ }
if (cr_flags)
cr->cr_flags = cr_flags;
@@ -512,48 +578,75 @@
cr->cr_relflags = cr_relflags;
}
-static
-struct capreq *capreq_restore(tn_alloc *na, tn_buf_it *nbufi)
+static struct capreq *capreq_restore(tn_alloc *na, tn_buf_it *nbufi)
{
struct capreq *cr;
- uint8_t size = 0, *cr_bufp;
- uint8_t cr_buf[5]; /* placeholder, for sizeof */
-
-
+ register int i;
+ uint8_t size = 0, *cr_buf, *buff;
+ uint8_t phcr_buf[5]; /* placeholder, for sizeof */
+ char *p, *name = NULL;
+ size_t name_len = 0;
+
n_buf_it_get_int8(nbufi, &size);
- cr_bufp = n_buf_it_get(nbufi, sizeof(cr_buf));
- if (cr_bufp == NULL)
+
+ cr_buf = n_buf_it_get(nbufi, sizeof(phcr_buf));
+ if (cr_buf == NULL)
return NULL;
- size -= sizeof(cr_buf);
-#if XXX_IGNORE_RPMLIB_DEPS
- if (cr_bufp[1] & CAPREQ_RPMLIB) {
- n_buf_it_get(nbufi, size);
- return NULL;
+ size -= sizeof(phcr_buf);
+ buff = n_buf_it_get(nbufi, size);
+
+ buff++; /* skip '\0' */
+ size--;
+
+ if ((p = memchr(buff, '\0', size))) { /* versioned? */
+ name = buff;
+ name_len = p - (char*)buff;
+ size -= name_len;
+ buff = p + 1;
+
+ } else {
+ char *n = alloca(size + 1);
+ memcpy(n, buff, size);
+ n[size] = '\0';
+ name = n;
+ name_len = size;
+ size = 0;
}
-#endif
+
if (na)
cr = na->na_malloc(na, sizeof(*cr) + size + 1);
else
cr = n_malloc(sizeof(*cr) + size + 1);
- cr->cr_relflags = cr_bufp[0];
- cr->cr_flags = cr_bufp[1];
- cr->cr_ep_ofs = cr_bufp[2];
- cr->cr_ver_ofs = cr_bufp[3];
- cr->cr_rel_ofs = cr_bufp[4];
+ cr->cr_relflags = cr_buf[0];
+ cr->cr_flags = cr_buf[1];
+
+ for (i=2; i < 5; i++)
+ if (cr_buf[i])
+ cr_buf[i] -= name_len + 1;
+
+ cr->cr_ep_ofs = cr_buf[2];
+ cr->cr_ver_ofs = cr_buf[3];
+ cr->cr_rel_ofs = cr_buf[4];
+
+ cr->name = capreq__alloc_name(name);
if (na)
cr->cr_relflags |= __NAALLOC;
-
- cr->_buf[size] = '\0';
- cr_bufp = n_buf_it_get(nbufi, size);
- memcpy(cr->_buf, cr_bufp, size);
+
+ cr->_buff[0] = '\0';
+ if (size) {
+ memcpy(&cr->_buff[1], buff, size);
+ cr->_buff[size] = '\0';
+ }
if (cr->cr_ep_ofs) {
int32_t epoch = n_ntoh32(capreq_epoch(cr));
- memcpy(&cr->_buf[cr->cr_ep_ofs], &epoch, sizeof(epoch));
+ memcpy(&cr->_buff[cr->cr_ep_ofs], &epoch, sizeof(epoch));
}
+ DBGF("cr %s\n", capreq_snprintf_s(cr));
+
//printf("cr %s: %d, %d, %d, %d, %d\n", capreq_snprintf_s(cr),
//cr_bufp[0], cr_bufp[1], cr_bufp[2], cr_bufp[3], cr_bufp[4]);
//printf("REST* %s %d -> %d\n", capreq_snprintf_s(cr),
@@ -738,4 +831,3 @@
n_array_uniq_ex(arr, (tn_fn_cmp)cmp_uniq);
return arr;
}
-
================================================================
Index: poldek/poldek/capreq.h
diff -u poldek/poldek/capreq.h:1.31 poldek/poldek/capreq.h:1.32
--- poldek/poldek/capreq.h:1.31 Sat Jun 30 14:01:43 2007
+++ poldek/poldek/capreq.h Thu Jul 12 23:29:26 2007
@@ -41,15 +41,15 @@
struct capreq {
uint8_t cr_flags;
uint8_t cr_relflags;
-/* uint8_t cr_name_ofs = 1, always */
+ const char *name;
uint8_t cr_ep_ofs;
uint8_t cr_ver_ofs; /* 0 if capreq hasn't version */
uint8_t cr_rel_ofs; /* 0 if capreq hasn't release */
- char _buf[0]; /* alias cr_name, first byte is always '\0' */
+ char _buff[0]; /* for evr, first byte is always '\0' */
};
/* CAUTION: side effects! */
-#define capreq_name(cr) &(cr)->_buf[1]
+#define capreq_name(cr) (cr)->name
#ifdef SWIG
# define extern__inline
@@ -62,8 +62,8 @@
#define capreq_epoch(cr) \
((cr)->cr_ep_ofs ? capreq_epoch_(cr) : 0)
-#define capreq_ver(cr) (&(cr)->_buf[(cr)->cr_ver_ofs])
-#define capreq_rel(cr) (&(cr)->_buf[(cr)->cr_rel_ofs])
+#define capreq_ver(cr) (&(cr)->_buff[(cr)->cr_ver_ofs])
+#define capreq_rel(cr) (&(cr)->_buff[(cr)->cr_rel_ofs])
#define capreq_has_epoch(cr) (cr)->cr_ep_ofs
#define capreq_has_ver(cr) (cr)->cr_ver_ofs
@@ -75,8 +75,10 @@
#define capreq_is_prereq(cr) ((cr)->cr_flags & CAPREQ_PREREQ)
#define capreq_is_prereq_un(cr) ((cr)->cr_flags & CAPREQ_PREREQ_UN)
#define capreq_is_obsl(cr) capreq_is_prereq((cr))
-#define capreq_is_file(cr) ((cr)->_buf[1] == '/')
-#define capreq_isnot_file(cr) ((cr)->_buf[1] != '/')
+
+#define capreq_is_file(cr) (*(cr)->name == '/')
+#define capreq_isnot_file(cr) (*(cr)->name != '/')
+
#define capreq_is_bastard(cr) ((cr)->cr_flags & CAPREQ_BASTARD)
#define capreq_is_autodirreq(cr) (capreq_is_bastard(cr) && capreq_is_file(cr))
@@ -95,17 +97,20 @@
struct capreq *capreq_new(tn_alloc *na, const char *name, int32_t epoch,
const char *version, const char *release,
int32_t relflags, int32_t flags);
+#ifndef SWIG
+const char *capreq__alloc_name(const char *name);
+#endif
-#define capreq_new_name_a(name, crptr) \
- { \
- struct capreq *__cr; \
- int len = strlen((name)); \
- __cr = alloca(sizeof(*__cr) + len + 2); \
- __cr->cr_flags = __cr->cr_relflags = 0; \
+#define capreq_new_name_a(nam, crptr) \
+ { \
+ struct capreq *__cr; \
+ const char *name = capreq__alloc_name(nam); \
+ __cr = alloca(sizeof(*__cr) + 2); \
+ __cr->cr_flags = __cr->cr_relflags = 0; \
__cr->cr_ep_ofs = __cr->cr_ver_ofs = __cr->cr_rel_ofs = 0; \
- __cr->_buf[0] = '\0'; \
- memcpy(&__cr->_buf[1], (name), len + 1); \
- crptr = __cr; \
+ __cr->_buff[0] = '\0'; \
+ __cr->name = name; \
+ crptr = __cr; \
}
void capreq_free_na(tn_alloc *na, struct capreq *cr);
================================================================
Index: poldek/poldek/capreqidx.c
diff -u poldek/poldek/capreqidx.c:1.17 poldek/poldek/capreqidx.c:1.18
--- poldek/poldek/capreqidx.c:1.17 Mon Sep 27 22:26:57 2004
+++ poldek/poldek/capreqidx.c Thu Jul 12 23:29:26 2007
@@ -23,6 +23,7 @@
#include "i18n.h"
#include "pkg.h"
#include "capreqidx.h"
+#include "capreq.h"
#include "log.h"
static void capreq_ent_free(struct capreq_idx_ent *ent)
@@ -39,6 +40,7 @@
MEMINF("START");
idx->na = n_alloc_new(4, TN_ALLOC_OBSTACK);
idx->ht = n_hash_new_na(idx->na, nelem, (tn_fn_free)capreq_ent_free);
+ n_hash_ctl(idx->ht, TN_HASH_NOCPKEY);
MEMINF("END");
return 1;
}
@@ -69,13 +71,18 @@
struct pkg *pkg)
{
struct capreq_idx_ent *ent;
-
- if ((ent = n_hash_get(idx->ht, capname)) == NULL) {
+ unsigned khash = 0;
+ int klen = 0;
+
+ if ((ent = n_hash_get_ex(idx->ht, capname, &klen, &khash)) == NULL) {
+ const char *hcapname = capreq__alloc_name(capname);
+
ent = idx->na->na_malloc(idx->na, sizeof(*ent));
ent->_size = 1;
ent->items = 1;
ent->crent_pkg = pkg;
- n_hash_insert(idx->ht, capname, ent);
+
+ n_hash_insert_ex(idx->ht, hcapname, klen, khash, ent);
#if ENABLE_TRACE
if ((n_hash_size(idx->ht) % 1000) == 0)
n_hash_stats(idx->ht);
@@ -86,13 +93,15 @@
if (ent->_size == 1) /* crent_pkgs is NOT allocated */
capreq_idx_ent_transform_to_array(ent);
-
+
+#if 0 /* not happens in fact */
if (idx->flags & CAPREQ_IDX_CAP) { /* check for duplicates */
for (i=0; i < ent->items; i++) {
if (pkg == ent->crent_pkgs[i])
return 1;
}
}
+#endif
if (ent->items == ent->_size) {
ent->_size *= 2;
================================================================
Index: poldek/poldek/capreqidx.h
diff -u poldek/poldek/capreqidx.h:1.9 poldek/poldek/capreqidx.h:1.10
--- poldek/poldek/capreqidx.h:1.9 Thu May 12 17:41:05 2005
+++ poldek/poldek/capreqidx.h Thu Jul 12 23:29:26 2007
@@ -1,6 +1,6 @@
/* $Id$ */
-#ifndef POLDEK_PROVREQIDX_H
-#define POLDEK_PROVREQIDX_H
+#ifndef POLDEK_CAPREQ_IDX_H
+#define POLDEK_CAPREQ_IDX_H
#include <stdint.h>
#include <trurl/nhash.h>
@@ -9,8 +9,6 @@
#define CAPREQ_IDX_CAP (1 << 0)
#define CAPREQ_IDX_REQ (1 << 1)
-
-
struct capreq_idx {
unsigned flags;
tn_hash *ht; /* name => *pkgs[] */
@@ -23,7 +21,6 @@
int32_t _size;
union {
struct pkg *pkg;
-// struct pkg *pkgs[0]; /* pkgs list */
struct pkg **pkgs; /* pkgs list */
} capreq_idx_ent_pkg;
};
================================================================
Index: poldek/poldek/fileindex.c
diff -u poldek/poldek/fileindex.c:1.31 poldek/poldek/fileindex.c:1.32
--- poldek/poldek/fileindex.c:1.31 Wed Jun 20 10:33:40 2007
+++ poldek/poldek/fileindex.c Thu Jul 12 23:29:26 2007
@@ -136,12 +136,9 @@
fi->cnflh = NULL;
fi->na = na;
- fi->_last_files = NULL;
- fi->_last_dirname = NULL;
return fi;
}
-
void file_index_free(struct file_index *fi)
{
n_hash_free(fi->dirs);
@@ -151,34 +148,25 @@
n_alloc_free(fi->na);
}
-
void *file_index_add_dirname(struct file_index *fi, const char *dirname)
{
tn_array *files;
+ int klen = 0;
+ unsigned khash = 0;
+
DBGF("%s\n", dirname);
- if (fi->_last_files != NULL && strcmp(dirname, fi->_last_dirname) == 0) {
- DBGF("HIT dirname = %s %s\n", dirname, fi->last_dirname);
- files = fi->_last_files;
-
- } else {
- /* find directory */
- if ((files = n_hash_get(fi->dirs, dirname)) == NULL) {
- files = n_array_new(4, NULL, fent_cmp);
- n_hash_insert(fi->dirs, dirname, files);
- }
+
+ if ((files = n_hash_get_ex(fi->dirs, dirname, &klen, &khash)) == NULL) {
+ files = n_array_new(4, NULL, fent_cmp);
+ n_hash_insert_ex(fi->dirs, dirname, klen, khash, files);
+ }
#if ENABLE_TRACE
- if ((n_hash_size(fi->dirs) % 10) == 0) {
- DBGF("stats\n");
- n_hash_stats(fi->dirs);
- }
-#endif
-#if 0 /* XXX - cache */
- fi->_last_files = files;
- n_cfree(&fi->_last_dirname);
- fi->_last_dirname = n_strdup(dirname);
-#endif
+ if ((n_hash_size(fi->dirs) % 10) == 0) {
+ DBGF("stats\n");
+ n_hash_stats(fi->dirs);
}
-
+#endif
+
return files;
}
@@ -186,7 +174,6 @@
{
n_array_sort(files);
}
-
int file_index_add_basename(struct file_index *fi, void *fidx_dir,
struct flfile *flfile,
================================================================
Index: poldek/poldek/fileindex.h
diff -u poldek/poldek/fileindex.h:1.12 poldek/poldek/fileindex.h:1.13
--- poldek/poldek/fileindex.h:1.12 Sun Aug 20 20:14:58 2006
+++ poldek/poldek/fileindex.h Thu Jul 12 23:29:26 2007
@@ -18,9 +18,6 @@
tn_hash *dirs; /* dirname => tn_array *files */
tn_hash *cnflh;
tn_alloc *na;
-
- tn_array *_last_files; /* add_dirname()'s temporary var */
- const char *_last_dirname;
};
struct file_index *file_index_new(int nelem);
================================================================
Index: poldek/poldek/pkgset-req.c
diff -u poldek/poldek/pkgset-req.c:1.52 poldek/poldek/pkgset-req.c:1.53
--- poldek/poldek/pkgset-req.c:1.52 Mon Jul 9 20:31:56 2007
+++ poldek/poldek/pkgset-req.c Thu Jul 12 23:29:26 2007
@@ -232,7 +232,7 @@
rpkg = reqpkg_new(dpkg, req, 0, 0);
n_array_push(pkg->reqpkgs, rpkg);
- n_array_sort(pkg->reqpkgs);
<<Diff was trimmed, longer than 597 lines>>
---- CVS-web:
http://cvs.pld-linux.org/poldek/poldek/capreq.c?r1=1.45&r2=1.46&f=u
http://cvs.pld-linux.org/poldek/poldek/capreq.h?r1=1.31&r2=1.32&f=u
http://cvs.pld-linux.org/poldek/poldek/capreqidx.c?r1=1.17&r2=1.18&f=u
http://cvs.pld-linux.org/poldek/poldek/capreqidx.h?r1=1.9&r2=1.10&f=u
http://cvs.pld-linux.org/poldek/poldek/fileindex.c?r1=1.31&r2=1.32&f=u
http://cvs.pld-linux.org/poldek/poldek/fileindex.h?r1=1.12&r2=1.13&f=u
http://cvs.pld-linux.org/poldek/poldek/pkgset-req.c?r1=1.52&r2=1.53&f=u
http://cvs.pld-linux.org/poldek/poldek/pkgset.c?r1=1.99&r2=1.100&f=u
http://cvs.pld-linux.org/poldek/poldek/lib_pkgset.c?r1=1.21&r2=1.22&f=u
http://cvs.pld-linux.org/poldek/poldek/pkg.c?r1=1.118&r2=1.119&f=u
http://cvs.pld-linux.org/poldek/poldek/install/obsoletes.c?r1=1.10&r2=1.11&f=u
http://cvs.pld-linux.org/poldek/poldek/install/requirements.c?r1=1.11&r2=1.12&f=u
More information about the pld-cvs-commit
mailing list