Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/config Make attribute deselection work:



details:   https://anonhg.NetBSD.org/src/rev/78feab01c9d0
branches:  trunk
changeset: 347652:78feab01c9d0
user:      christos <christos%NetBSD.org@localhost>
date:      Fri Sep 09 21:09:11 2016 +0000

description:
Make attribute deselection work:
- when deselecting attributes, remove files that depend on them
- when deselecting attributes, remove devices that depend on them

diffstat:

 usr.bin/config/defs.h  |    5 +-
 usr.bin/config/files.c |    9 ++-
 usr.bin/config/sem.c   |  135 ++++++++++++++++++++++++++++++++++++------------
 3 files changed, 111 insertions(+), 38 deletions(-)

diffs (278 lines):

diff -r d95393ee0924 -r 78feab01c9d0 usr.bin/config/defs.h
--- a/usr.bin/config/defs.h     Fri Sep 09 12:41:14 2016 +0000
+++ b/usr.bin/config/defs.h     Fri Sep 09 21:09:11 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: defs.h,v 1.97 2016/08/07 21:11:55 christos Exp $       */
+/*     $NetBSD: defs.h,v 1.98 2016/09/09 21:09:11 christos Exp $       */
 
 /*
  * Copyright (c) 1992, 1993
@@ -190,7 +190,8 @@
 #define        a_weight        a_m.m_weight
 
        /* "interface attribute" */
-       int     a_iattr;                /* true => allows children */
+       uint8_t a_iattr;                /* true => allows children */
+       uint8_t a_deselected;           /* deselected */        
        struct  loclist *a_locs;        /* locators required */
        int     a_loclen;               /* length of above list */
        struct  nvlist *a_devs;         /* children */
diff -r d95393ee0924 -r 78feab01c9d0 usr.bin/config/files.c
--- a/usr.bin/config/files.c    Fri Sep 09 12:41:14 2016 +0000
+++ b/usr.bin/config/files.c    Fri Sep 09 21:09:11 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: files.c,v 1.35 2015/09/04 21:32:54 uebayasi Exp $      */
+/*     $NetBSD: files.c,v 1.36 2016/09/09 21:09:11 christos Exp $      */
 
 /*
  * Copyright (c) 1992, 1993
@@ -45,7 +45,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: files.c,v 1.35 2015/09/04 21:32:54 uebayasi Exp $");
+__RCSID("$NetBSD: files.c,v 1.36 2016/09/09 21:09:11 christos Exp $");
 
 #include <sys/param.h>
 #include <assert.h>
@@ -335,6 +335,11 @@
                        if (!sel)
                                continue;
                }
+               if (fi->fi_attr && fi->fi_attr->a_deselected) {
+                       CFGDBG(5, "file `%s' deselected because attr `%s' was",
+                           fi->fi_path, fi->fi_attr->a_name);
+                       continue;
+               }
 
                /* We like this file.  Make sure it generates a unique .o. */
                if (ht_insert(basetab, fi->fi_base, fi)) {
diff -r d95393ee0924 -r 78feab01c9d0 usr.bin/config/sem.c
--- a/usr.bin/config/sem.c      Fri Sep 09 12:41:14 2016 +0000
+++ b/usr.bin/config/sem.c      Fri Sep 09 21:09:11 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sem.c,v 1.75 2016/08/07 10:37:24 christos Exp $        */
+/*     $NetBSD: sem.c,v 1.76 2016/09/09 21:09:11 christos Exp $        */
 
 /*
  * Copyright (c) 1992, 1993
@@ -45,7 +45,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: sem.c,v 1.75 2016/08/07 10:37:24 christos Exp $");
+__RCSID("$NetBSD: sem.c,v 1.76 2016/09/09 21:09:11 christos Exp $");
 
 #include <sys/param.h>
 #include <ctype.h>
@@ -95,6 +95,45 @@
 extern const char *yyfile;
 extern int vflag;
 
+#define V_ATTRIBUTE    0
+#define V_DEVICE       1
+struct vtype {
+       int type;
+       struct attr *attr;
+       void *value;
+};
+
+static struct nvlist *
+makedevstack(struct devbase *d)
+{
+       struct devi *firsti, *i;
+       struct nvlist *stack = NULL;
+
+       for (firsti = d->d_ihead; firsti != NULL; firsti = firsti->i_bsame)
+               for (i = firsti; i != NULL; i = i->i_alias)
+                       stack = newnv(NULL, NULL, i, 0, stack);
+       return stack;
+}
+
+static void
+devcleanup(struct nvlist *stack)
+{
+       struct nvlist *nv;
+       for (nv = stack; nv != NULL; nv = nv->nv_next)
+               remove_devi(nv->nv_ptr);
+       nvfreel(stack);
+}
+
+static void *
+addvalue(int type, struct attr *a, void *value)
+{
+       struct vtype *vt = emalloc(sizeof(*vt));
+       vt->type = type;
+       vt->attr = a;
+       vt->value = value;
+       return vt;
+}
+
 void
 initsem(void)
 {
@@ -308,7 +347,8 @@
                            "attribute", name, dep->a_name);
                        return (1);
                }
-               (void)ht_insert2(attrdeptab, name, dep->a_name, NULL);
+               (void)ht_insert2(attrdeptab, name, dep->a_name,
+                   addvalue(V_ATTRIBUTE, a, dep));
                CFGDBG(2, "attr `%s' depends on attr `%s'", name, dep->a_name);
        }
 
@@ -536,7 +576,8 @@
                 * Implicit attribute definition for device dependencies.
                 */
                refattr(al->al_this->a_name);
-               (void)ht_insert2(attrdeptab, dev->d_name, al->al_this->a_name, NULL);
+               (void)ht_insert2(attrdeptab, dev->d_name, al->al_this->a_name, 
+                       addvalue(V_DEVICE, al->al_this, dev));
                CFGDBG(2, "device `%s' depends on attr `%s'", dev->d_name,
                    al->al_this->a_name);
        }
@@ -1563,9 +1604,7 @@
                }
        }
 
-       for (nv = stack; nv != NULL; nv = nv->nv_next)
-               remove_devi(nv->nv_ptr);
-       nvfreel(stack);
+       devcleanup(stack);
 }
 
 void
@@ -1573,7 +1612,7 @@
 {
        size_t l;
        struct devi *firsti, *i;
-       struct nvlist *nv, *stack = NULL;
+       struct nvlist *stack = NULL;
 
        CFGDBG(5, "deselecting dev `%s'", name);
        if (name[0] == '\0')
@@ -1604,16 +1643,10 @@
                            name);
                        return;
                }
-
-               for (firsti = d->d_ihead; firsti != NULL;
-                   firsti = firsti->i_bsame)
-                       for (i = firsti; i != NULL; i = i->i_alias)
-                               stack = newnv(NULL, NULL, i, 0, stack);
+               stack = makedevstack(d);
        }
 
-       for (nv = stack; nv != NULL; nv = nv->nv_next)
-               remove_devi(nv->nv_ptr);
-       nvfreel(stack);
+       devcleanup(stack);
 }
 
 /*
@@ -1697,6 +1730,29 @@
        ht_insert(devroottab, ib->d_name, ib);
 }
 
+static void
+deldevbase(struct devbase *d)
+{
+       struct devi *i;
+       const char *name = d->d_name;
+
+       if (!d->d_ispseudo) {
+               devcleanup(makedevstack(d));
+               return;
+       }
+
+       if ((i = ht_lookup(devitab, name)) == NULL)
+               return;
+
+       d->d_umax = 0;          /* clear neads-count entries */
+       d->d_ihead = NULL;      /* make sure it won't be considered active */
+       TAILQ_REMOVE(&allpseudo, i, i_next);
+       if (ht_remove(devitab, name))
+               panic("%s(%s) - can't remove from devitab", __func__, name);
+       if (ht_insert(deaddevitab, name, i))
+               panic("%s(%s) - can't add to deaddevitab", __func__, name);
+}
+
 void
 addpseudo(const char *name, int number)
 {
@@ -1729,7 +1785,6 @@
 delpseudo(const char *name, int nowarn)
 {
        struct devbase *d;
-       struct devi *i;
 
        CFGDBG(5, "deselecting pseudo `%s'", name);
        d = ht_lookup(devbasetab, name);
@@ -1742,18 +1797,7 @@
                cfgerror("%s is a real device, not a pseudo-device", name);
                return;
        }
-       if ((i = ht_lookup(devitab, name)) == NULL) {
-               if (!nowarn)
-                       cfgerror("`%s' not defined", name);
-               return;
-       }
-       d->d_umax = 0;          /* clear neads-count entries */
-       d->d_ihead = NULL;      /* make sure it won't be considered active */
-       TAILQ_REMOVE(&allpseudo, i, i_next);
-       if (ht_remove(devitab, name))
-               panic("delpseudo(%s) - can't remove from devitab", name);
-       if (ht_insert(deaddevitab, name, i))
-               panic("delpseudo(%s) - can't add to deaddevitab", name);
+       deldevbase(d);
 }
 
 void
@@ -2003,19 +2047,42 @@
 static int
 deselectattrcb2(const char *name1, const char *name2, void *v, void *arg)
 {
-       const char *name = arg;
+       struct attr *a = arg;
+       const char *name = a->a_name;
+       struct vtype *vt = v;
+
+       if (strcmp(name, name2) == 0) {
+               delattr(name1, 0);
+               return 0;
+       }
+
+       if (!vt->attr->a_deselected)
+               return 0;
 
-       if (strcmp(name, name2) == 0)
-               delattr(name1, 0);
+       switch (vt->type) {
+       case V_ATTRIBUTE:
+#ifdef notyet
+               // XXX: Loops
+               deselectattr(vt->value);
+#endif
+               break;
+       case V_DEVICE:
+               CFGDBG(5, "removing device `%s' with attr `%s' because attr `%s'"
+                   " is deselected", name1, name2, name);
+               deldevbase(vt->value);
+               break;
+       default:
+               abort();
+       }
        return 0;
 }
 
 void
 deselectattr(struct attr *a)
 {
-
        CFGDBG(5, "deselecting attr `%s'", a->a_name);
-       ht_enumerate2(attrdeptab, deselectattrcb2, __UNCONST(a->a_name));
+       a->a_deselected = 1;
+       ht_enumerate2(attrdeptab, deselectattrcb2, a);
        if (ht_remove(selecttab, a->a_name) == 0)
                nattrs--;
        CFGDBG(3, "attr deselected `%s'", a->a_name);



Home | Main Index | Thread Index | Old Index