RPM Package Manager, CVS Repository
http://rpm5.org/cvs/
____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson
Root: /v/rpm/cvs Email: [EMAIL PROTECTED]
Module: rpm Date: 03-May-2008 20:36:05
Branch: HEAD Handle: 2008050318360401
Modified files:
rpm CHANGES
rpm/rpmdb header.c
Log:
- jbj: disable the headerLoad speedup's until headerUnload changes are done.
- jbj: swab integer tag data in headerGet, not headerLoad (measured 6.9%
rpm-V speedup ymmv).
Summary:
Revision Changes Path
1.2316 +2 -0 rpm/CHANGES
1.157 +115 -89 rpm/rpmdb/header.c
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/CHANGES
============================================================================
$ cvs diff -u -r1.2315 -r1.2316 CHANGES
--- rpm/CHANGES 2 May 2008 16:13:52 -0000 1.2315
+++ rpm/CHANGES 3 May 2008 18:36:04 -0000 1.2316
@@ -1,5 +1,7 @@
5.1.0 -> 5.2a0:
+ - jbj: disable the headerLoad speedup's until headerUnload changes are
done.
+ - jbj: swab integer tag data in headerGet, not headerLoad (measured 6.9%
rpm-V speedup ymmv).
- jbj: compute tag store w subtract (measured 26.3% rpm -qa speedup
ymmv).
- jbj: initialize ts->PRCO lazily (measured 20.4% rpm -qa speedup ymmv).
- glen: print error when makeTempPath fails due missing temp dir
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/header.c
============================================================================
$ cvs diff -u -r1.156 -r1.157 header.c
--- rpm/rpmdb/header.c 2 May 2008 16:13:53 -0000 1.156
+++ rpm/rpmdb/header.c 3 May 2008 18:36:05 -0000 1.157
@@ -27,7 +27,11 @@
/[EMAIL PROTECTED] entryInfo @*/
/[EMAIL PROTECTED] indexEntry @*/
-int _fastdatalength = 1;
+/* Compute tag data store size using offsets? */
+static int _fastdatalength = 0;
+
+/* Swab tag data only when accessed through headerGet()? */
+static int _lazytagswab = 0;
/** \ingroup header
*/
@@ -359,7 +363,107 @@
}
/** \ingroup header
- * Swap uint32_t and uint16_t arrays within header region.
+ * Swab uint64_t/uint32_t/uint16_t arrays within header region.
+ *
+ */
+static unsigned char * tagSwab(unsigned char * t, const HE_t he, size_t nb)
+ /[EMAIL PROTECTED] *t @*/
+{
+ uint32_t i;
+
+ switch (he->t) {
+ case RPM_UINT64_TYPE:
+ { uint32_t * tt = (uint32_t *)t;
+ for (i = 0; i < he->c; i++) {
+ uint32_t j = 2 * i;
+ uint32_t b = (uint32_t) htonl(he->p.ui32p[j]);
+ tt[j ] = (uint32_t) htonl(he->p.ui32p[j+1]);
+ tt[j+1] = b;
+ }
+ } break;
+ case RPM_UINT32_TYPE:
+ { uint32_t * tt = (uint32_t *)t;
+ for (i = 0; i < he->c; i++)
+ tt[i] = (uint32_t) htonl(he->p.ui32p[i]);
+ } break;
+ case RPM_UINT16_TYPE:
+ { uint16_t * tt = (uint16_t *)t;
+ for (i = 0; i < he->c; i++)
+ tt[i] = (uint16_t) htons(he->p.ui16p[i]);
+ } break;
+ default:
+ if ((void *)t != he->p.ptr && nb)
+ memcpy(t, he->p.ptr, nb);
+ t += nb;
+ break;
+ }
+ return t;
+}
+
+/**
+ * Always realloc HE_t memory.
+ * @param he tag container
+ * @return 1 on success, 0 on failure
+ */
+static int rpmheRealloc(HE_t he)
+ /[EMAIL PROTECTED] he @*/
+{
+ size_t nb = 0;
+ int rc = 1; /* assume success */
+
+ switch (he->t) {
+ default:
+assert(0); /* XXX stop unimplemented oversights. */
+ break;
+ case RPM_BIN_TYPE:
+ he->freeData = 1; /* XXX RPM_BIN_TYPE is malloc'd */
+ /[EMAIL PROTECTED]@*/
+ case RPM_UINT8_TYPE:
+ nb = he->c * sizeof(*he->p.ui8p);
+ break;
+ case RPM_UINT16_TYPE:
+ nb = he->c * sizeof(*he->p.ui16p);
+ break;
+ case RPM_UINT32_TYPE:
+ nb = he->c * sizeof(*he->p.ui32p);
+ break;
+ case RPM_UINT64_TYPE:
+ nb = he->c * sizeof(*he->p.ui64p);
+ break;
+ case RPM_STRING_TYPE:
+ if (he->p.str)
+ nb = strlen(he->p.str) + 1;
+ else
+ rc = 0;
+ break;
+ case RPM_I18NSTRING_TYPE:
+ case RPM_STRING_ARRAY_TYPE:
+ break;
+ }
+
+ /* Allocate all returned storage (if not already). */
+ if (he->p.ptr && nb && !he->freeData) {
+ void * ptr = xmalloc(nb);
+ if (_lazytagswab) {
+ if (tagSwab(ptr, he, nb) != NULL)
+ he->p.ptr = ptr;
+ else {
+ ptr = _free(ptr);
+ rc = 0;
+ }
+ } else {
+ he->p.ptr = memcpy(ptr, he->p.ptr, nb);
+ }
+ }
+
+ if (rc)
+ he->freeData = 1;
+
+ return rc;
+}
+
+/** \ingroup header
+ * Swab uint64_t/uint32_t/uint16_t arrays within header region.
*
* This code is way more twisty than I would like.
*
@@ -392,6 +496,7 @@
int32_t regionid)
/[EMAIL PROTECTED] *entry, *dataStart @*/
{
+ HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
rpmTagData p;
rpmTagData pend;
unsigned char * tprev = NULL;
@@ -479,41 +584,15 @@
}
/* Perform endian conversions */
- switch (ntohl(pe->type)) {
- case RPM_UINT64_TYPE:
- { uint64_t * it = (uint64_t *)t;
- uint32_t b[2];
- for (; ie.info.count > 0; ie.info.count--, it += 1) {
- if (dataEnd && ((unsigned char *)it) >= dataEnd)
- return 0;
- b[1] = (uint32_t) htonl(((uint32_t *)it)[0]);
- b[0] = (uint32_t) htonl(((uint32_t *)it)[1]);
- if (b[1] != ((uint32_t *)it)[0])
- memcpy(it, b, sizeof(b));
- }
- t = (unsigned char *) it;
- } /[EMAIL PROTECTED]@*/ break;
- case RPM_UINT32_TYPE:
- { uint32_t * it = (uint32_t *)t;
- for (; ie.info.count > 0; ie.info.count--, it += 1) {
- if (dataEnd && ((unsigned char *)it) >= dataEnd)
- return 0;
- *it = (uint32_t) htonl(*it);
- }
- t = (unsigned char *) it;
- } /[EMAIL PROTECTED]@*/ break;
- case RPM_UINT16_TYPE:
- { uint16_t * it = (uint16_t *) t;
- for (; ie.info.count > 0; ie.info.count--, it += 1) {
- if (dataEnd && ((unsigned char *)it) >= dataEnd)
- return 0;
- *it = (uint16_t) htons(*it);
- }
- t = (unsigned char *) it;
- } /[EMAIL PROTECTED]@*/ break;
- default:
+ if (_lazytagswab)
t += ie.length;
- /[EMAIL PROTECTED]@*/ break;
+ else {
+ he->tag = ie.info.tag;
+ he->t = ie.info.type;
+ he->p.ptr = t;
+ he->c = ie.info.count;
+ if ((t = tagSwab(t, he, ie.length)) == NULL)
+ return 0;
}
dl += ie.length;
@@ -1903,59 +1982,6 @@
}
/**
- * Always realloc HE_t memory.
- * @param he tag container
- * @return 1 on success, 0 on failure
- */
-static int rpmheRealloc(HE_t he)
- /[EMAIL PROTECTED] he @*/
-{
- size_t nb = 0;
- int rc = 1; /* assume success */
-
- switch (he->t) {
- default:
-assert(0); /* XXX stop unimplemented oversights. */
- break;
- case RPM_BIN_TYPE:
- he->freeData = 1; /* XXX RPM_BIN_TYPE is malloc'd */
- /[EMAIL PROTECTED]@*/
- case RPM_UINT8_TYPE:
- nb = he->c * sizeof(*he->p.ui8p);
- break;
- case RPM_UINT16_TYPE:
- nb = he->c * sizeof(*he->p.ui16p);
- break;
- case RPM_UINT32_TYPE:
- nb = he->c * sizeof(*he->p.ui32p);
- break;
- case RPM_UINT64_TYPE:
- nb = he->c * sizeof(*he->p.ui64p);
- break;
- case RPM_STRING_TYPE:
- if (he->p.str)
- nb = strlen(he->p.str) + 1;
- else
- rc = 0;
- break;
- case RPM_I18NSTRING_TYPE:
- case RPM_STRING_ARRAY_TYPE:
- break;
- }
-
- /* Allocate all returned storage (if not already). */
- if (he->p.ptr && nb && !he->freeData) {
- void * ptr = memcpy(xmalloc(nb), he->p.ptr, nb);
- he->p.ptr = ptr;
- }
-
- if (rc)
- he->freeData = 1;
-
- return rc;
-}
-
-/**
* Header tag iterator data structure.
*/
struct headerIterator_s {
@@ .
______________________________________________________________________
RPM Package Manager http://rpm5.org
CVS Sources Repository [email protected]