From owner-svn-src-head@FreeBSD.ORG Tue Apr 10 17:37:24 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id D527D1065672; Tue, 10 Apr 2012 17:37:24 +0000 (UTC) (envelope-from jmallett@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id BFDCD8FC1A; Tue, 10 Apr 2012 17:37:24 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q3AHbOxB033711; Tue, 10 Apr 2012 17:37:24 GMT (envelope-from jmallett@svn.freebsd.org) Received: (from jmallett@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q3AHbObC033708; Tue, 10 Apr 2012 17:37:24 GMT (envelope-from jmallett@svn.freebsd.org) Message-Id: <201204101737.q3AHbObC033708@svn.freebsd.org> From: Juli Mallett Date: Tue, 10 Apr 2012 17:37:24 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r234107 - head/lib/libgeom X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 10 Apr 2012 17:37:24 -0000 Author: jmallett Date: Tue Apr 10 17:37:24 2012 New Revision: 234107 URL: http://svn.freebsd.org/changeset/base/234107 Log: Back out r233646. Although it fixed most libgeom consumers under 32-bit compatibility, it broke programs using devstat, under 32-bit compatibility and not. It's very difficult to fix the identifiers used by devstat, so this change is simply being backed out. Since changes to 3rd-party code seem likely, and may be necessary to properly fix 32-bit binaries on 64-bit kernel, it would seem better to make more invasive changes to fix GEOM's problems with 32-bit compatibility in general. The right thing to do is to replace all of the use of pointers as opaque identifiers with a fixed-size (64-bit or even 32-bit should be enough for tracking unique GEOM elments) field. That probably maintains source compatibility with most GEOM consumers, and allows xml2tree to make better assumptions about how to decode the identifiers. Submitted by: Anton Yuzhaninov Modified: head/lib/libgeom/geom_xml2tree.c head/lib/libgeom/libgeom.h Modified: head/lib/libgeom/geom_xml2tree.c ============================================================================== --- head/lib/libgeom/geom_xml2tree.c Tue Apr 10 16:33:19 2012 (r234106) +++ head/lib/libgeom/geom_xml2tree.c Tue Apr 10 17:37:24 2012 (r234107) @@ -55,56 +55,9 @@ struct mystate { int level; struct sbuf *sbuf[20]; struct gconf *config; - unsigned nident; + int nident; }; -static void * -internalize_ident(struct mystate *mt, const char *element, const char *str) -{ - struct gident *gip; - unsigned i; - - if (mt->nident != 0 && mt->mesh->lg_ident == NULL) { - warn("Cannot continue due to previous memory exhaustion."); - return (NULL); - } - - for (i = 0; i < mt->nident; i++) { - if (strcmp(mt->mesh->lg_ident[i].lg_id, str) != 0) - continue; - return ((void *)(uintptr_t)(i + 1)); - } - - i = mt->nident; - mt->nident++; - mt->mesh->lg_ident = reallocf(mt->mesh->lg_ident, (mt->nident + 1) * sizeof mt->mesh->lg_ident[0]); - if (mt->mesh->lg_ident == NULL) { - warn("Cannot allocate memory during processing of '%s' " - "element for identifier '%s'", element, str); - return (NULL); - } - - gip = &mt->mesh->lg_ident[i]; - gip->lg_id = strdup(str); - if (gip->lg_id == NULL) { - free(mt->mesh->lg_ident); - mt->mesh->lg_ident = NULL; - warn("Cannot allocate memory during processing of '%s' " - "element for identifier '%s'", element, str); - return (NULL); - } - gip->lg_ptr = NULL; - gip->lg_what = ISUNRESOLVED; - - /* Terminator entry. */ - gip = &mt->mesh->lg_ident[i + 1]; - gip->lg_id = NULL; - gip->lg_ptr = NULL; - gip->lg_what = ISUNRESOLVED; - - return ((void *)(uintptr_t)(i + 1)); -} - static void StartElement(void *userData, const char *name, const char **attr) { @@ -120,9 +73,10 @@ StartElement(void *userData, const char ref = NULL; for (i = 0; attr[i] != NULL; i += 2) { if (!strcmp(attr[i], "id")) { - id = internalize_ident(mt, name, attr[i + 1]); + id = (void *)strtoul(attr[i + 1], NULL, 0); + mt->nident++; } else if (!strcmp(attr[i], "ref")) { - ref = internalize_ident(mt, name, attr[i + 1]); + ref = (void *)strtoul(attr[i + 1], NULL, 0); } else printf("%*.*s[%s = %s]\n", mt->level + 1, mt->level + 1, "", @@ -363,16 +317,11 @@ CharData(void *userData , const XML_Char struct gident * geom_lookupid(struct gmesh *gmp, const void *id) { - unsigned i; - - if (gmp->lg_ident == NULL) - return (NULL); + struct gident *gip; - for (i = 0; gmp->lg_ident[i].lg_id != NULL; i++) { - if (i + 1 != (unsigned)(uintptr_t)id) - continue; - return (&gmp->lg_ident[i]); - } + for (gip = gmp->lg_ident; gip->lg_id != NULL; gip++) + if (gip->lg_id == id) + return (gip); return (NULL); } @@ -385,7 +334,6 @@ geom_xml2tree(struct gmesh *gmp, char *p struct ggeom *ge; struct gprovider *pr; struct gconsumer *co; - struct gident *gip; int i; memset(gmp, 0, sizeof *gmp); @@ -408,30 +356,33 @@ geom_xml2tree(struct gmesh *gmp, char *p free(mt); return (-1); } - if (gmp->lg_ident == NULL && mt->nident != 0) { - free(mt); - return (ENOMEM); - } + gmp->lg_ident = calloc(sizeof *gmp->lg_ident, mt->nident + 1); free(mt); + if (gmp->lg_ident == NULL) + return (ENOMEM); + i = 0; /* Collect all identifiers */ LIST_FOREACH(cl, &gmp->lg_class, lg_class) { - gip = geom_lookupid(gmp, cl->lg_id); - gip->lg_ptr = cl; - gip->lg_what = ISCLASS; - + gmp->lg_ident[i].lg_id = cl->lg_id; + gmp->lg_ident[i].lg_ptr = cl; + gmp->lg_ident[i].lg_what = ISCLASS; + i++; LIST_FOREACH(ge, &cl->lg_geom, lg_geom) { - gip = geom_lookupid(gmp, ge->lg_id); - gip->lg_ptr = ge; - gip->lg_what = ISGEOM; + gmp->lg_ident[i].lg_id = ge->lg_id; + gmp->lg_ident[i].lg_ptr = ge; + gmp->lg_ident[i].lg_what = ISGEOM; + i++; LIST_FOREACH(pr, &ge->lg_provider, lg_provider) { - gip = geom_lookupid(gmp, pr->lg_id); - gip->lg_ptr = pr; - gip->lg_what = ISPROVIDER; + gmp->lg_ident[i].lg_id = pr->lg_id; + gmp->lg_ident[i].lg_ptr = pr; + gmp->lg_ident[i].lg_what = ISPROVIDER; + i++; } LIST_FOREACH(co, &ge->lg_consumer, lg_consumer) { - gip = geom_lookupid(gmp, co->lg_id); - gip->lg_ptr = co; - gip->lg_what = ISCONSUMER; + gmp->lg_ident[i].lg_id = co->lg_id; + gmp->lg_ident[i].lg_ptr = co; + gmp->lg_ident[i].lg_what = ISCONSUMER; + i++; } } } @@ -498,10 +449,7 @@ geom_deletetree(struct gmesh *gmp) struct ggeom *ge; struct gprovider *pr; struct gconsumer *co; - unsigned i; - for (i = 0; gmp->lg_ident[i].lg_id != NULL; i++) - free(gmp->lg_ident[i].lg_id); free(gmp->lg_ident); gmp->lg_ident = NULL; for (;;) { Modified: head/lib/libgeom/libgeom.h ============================================================================== --- head/lib/libgeom/libgeom.h Tue Apr 10 16:33:19 2012 (r234106) +++ head/lib/libgeom/libgeom.h Tue Apr 10 17:37:24 2012 (r234107) @@ -71,8 +71,7 @@ struct gident { enum { ISCLASS, ISGEOM, ISPROVIDER, - ISCONSUMER, - ISUNRESOLVED } lg_what; + ISCONSUMER } lg_what; }; struct gmesh {