Source-Changes-HG archive

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

[src/trunk]: src/external/cddl/osnet/dist/common/ctf sync with FreeBSD



details:   https://anonhg.NetBSD.org/src/rev/9662f302fb2e
branches:  trunk
changeset: 810806:9662f302fb2e
user:      christos <christos%NetBSD.org@localhost>
date:      Thu Sep 24 14:18:24 2015 +0000

description:
sync with FreeBSD

diffstat:

 external/cddl/osnet/dist/common/ctf/ctf_create.c |  230 +++++++++++++++++++++-
 external/cddl/osnet/dist/common/ctf/ctf_error.c  |    7 +-
 external/cddl/osnet/dist/common/ctf/ctf_impl.h   |   10 +-
 external/cddl/osnet/dist/common/ctf/ctf_labels.c |    8 +-
 external/cddl/osnet/dist/common/ctf/ctf_open.c   |  105 +++++++++-
 external/cddl/osnet/dist/common/ctf/ctf_types.c  |   43 +++-
 6 files changed, 359 insertions(+), 44 deletions(-)

diffs (truncated from 767 to 300 lines):

diff -r 82b60943d3fb -r 9662f302fb2e external/cddl/osnet/dist/common/ctf/ctf_create.c
--- a/external/cddl/osnet/dist/common/ctf/ctf_create.c  Thu Sep 24 14:17:20 2015 +0000
+++ b/external/cddl/osnet/dist/common/ctf/ctf_create.c  Thu Sep 24 14:18:24 2015 +0000
@@ -24,13 +24,15 @@
  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
-
-#pragma ident  "%Z%%M% %I%     %E% SMI"
+/*
+ * Copyright (c) 2013, Joyent, Inc.  All rights reserved.
+ */
 
 #include <sys/sysmacros.h>
 #include <sys/param.h>
 #include <sys/mman.h>
 #include <ctf_impl.h>
+#include <sys/debug.h>
 
 /*
  * This static string is used as the template for initially populating a
@@ -171,6 +173,51 @@
 }
 
 /*
+ * Only types of dyanmic CTF containers contain reference counts. These
+ * containers are marked RD/WR. Because of that we basically make this a no-op
+ * for compatability with non-dynamic CTF sections. This is also a no-op for
+ * types which are not dynamic types. It is the responsibility of the caller to
+ * make sure it is a valid type. We help that caller out on debug builds.
+ *
+ * Note that the reference counts are not maintained for types that are not
+ * within this container. In other words if we have a type in a parent, that
+ * will not have its reference count increased. On the flip side, the parent
+ * will not be allowed to remove dynamic types if it has children.
+ */
+static void
+ctf_ref_inc(ctf_file_t *fp, ctf_id_t tid)
+{
+       ctf_dtdef_t *dtd = ctf_dtd_lookup(fp, tid);
+
+       if (dtd == NULL)
+               return;
+
+       if (!(fp->ctf_flags & LCTF_RDWR))
+               return;
+
+       dtd->dtd_ref++;
+}
+
+/*
+ * Just as with ctf_ref_inc, this is a no-op on non-writeable containers and the
+ * caller should ensure that this is already a valid type.
+ */
+static void
+ctf_ref_dec(ctf_file_t *fp, ctf_id_t tid)
+{
+       ctf_dtdef_t *dtd = ctf_dtd_lookup(fp, tid);
+
+       if (dtd == NULL)
+               return;
+
+       if (!(fp->ctf_flags & LCTF_RDWR))
+               return;
+
+       ASSERT(dtd->dtd_ref >= 1);
+       dtd->dtd_ref--;
+}
+
+/*
  * If the specified CTF container is writable and has been modified, reload
  * this container with the updated type definitions.  In order to make this
  * code and the rest of libctf as simple as possible, we perform updates by
@@ -184,6 +231,10 @@
  * ctf_bufopen() will return a new ctf_file_t, but we want to keep the fp
  * constant for the caller, so after ctf_bufopen() returns, we use bcopy to
  * swap the interior of the old and new ctf_file_t's, and then free the old.
+ *
+ * Note that the lists of dynamic types stays around and the resulting container
+ * is still writeable. Furthermore, the reference counts that are on the dtd's
+ * are still valid.
  */
 int
 ctf_update(ctf_file_t *fp)
@@ -368,7 +419,7 @@
         * is successful, we then switch nfp and fp and free the old container.
         */
        ctf_data_protect(buf, size);
-       cts.cts_name = __UNCONST(_CTF_SECTION);
+       cts.cts_name = _CTF_SECTION;
        cts.cts_type = SHT_PROGBITS;
        cts.cts_flags = 0;
        cts.cts_data = buf;
@@ -436,6 +487,7 @@
        ctf_dtdef_t *p, **q = &fp->ctf_dthash[h];
        ctf_dmdef_t *dmd, *nmd;
        size_t len;
+       int kind, i;
 
        for (p = *q; p != NULL; p = p->dtd_hash) {
                if (p != dtd)
@@ -447,7 +499,8 @@
        if (p != NULL)
                *q = p->dtd_hash;
 
-       switch (CTF_INFO_KIND(dtd->dtd_data.ctt_info)) {
+       kind = CTF_INFO_KIND(dtd->dtd_data.ctt_info);
+       switch (kind) {
        case CTF_K_STRUCT:
        case CTF_K_UNION:
        case CTF_K_ENUM:
@@ -458,14 +511,33 @@
                                ctf_free(dmd->dmd_name, len);
                                fp->ctf_dtstrlen -= len;
                        }
+                       if (kind != CTF_K_ENUM)
+                               ctf_ref_dec(fp, dmd->dmd_type);
                        nmd = ctf_list_next(dmd);
                        ctf_free(dmd, sizeof (ctf_dmdef_t));
                }
                break;
        case CTF_K_FUNCTION:
+               ctf_ref_dec(fp, dtd->dtd_data.ctt_type);
+               for (i = 0; i < CTF_INFO_VLEN(dtd->dtd_data.ctt_info); i++)
+                       if (dtd->dtd_u.dtu_argv[i] != 0)
+                               ctf_ref_dec(fp, dtd->dtd_u.dtu_argv[i]);
                ctf_free(dtd->dtd_u.dtu_argv, sizeof (ctf_id_t) *
                    CTF_INFO_VLEN(dtd->dtd_data.ctt_info));
                break;
+       case CTF_K_ARRAY:
+               ctf_ref_dec(fp, dtd->dtd_u.dtu_arr.ctr_contents);
+               ctf_ref_dec(fp, dtd->dtd_u.dtu_arr.ctr_index);
+               break;
+       case CTF_K_TYPEDEF:
+               ctf_ref_dec(fp, dtd->dtd_data.ctt_type);
+               break;
+       case CTF_K_POINTER:
+       case CTF_K_VOLATILE:
+       case CTF_K_CONST:
+       case CTF_K_RESTRICT:
+               ctf_ref_dec(fp, dtd->dtd_data.ctt_type);
+               break;
        }
 
        if (dtd->dtd_name) {
@@ -499,12 +571,14 @@
  * Discard all of the dynamic type definitions that have been added to the
  * container since the last call to ctf_update().  We locate such types by
  * scanning the list and deleting elements that have type IDs greater than
- * ctf_dtoldid, which is set by ctf_update(), above.
+ * ctf_dtoldid, which is set by ctf_update(), above. Note that to work properly
+ * with our reference counting schemes, we must delete the dynamic list in
+ * reverse.
  */
 int
 ctf_discard(ctf_file_t *fp)
 {
-       ctf_dtdef_t *dtd, *ntd = NULL;
+       ctf_dtdef_t *dtd, *ntd;
 
        if (!(fp->ctf_flags & LCTF_RDWR))
                return (ctf_set_errno(fp, ECTF_RDONLY));
@@ -512,11 +586,11 @@
        if (!(fp->ctf_flags & LCTF_DIRTY))
                return (0); /* no update required */
 
-       for (dtd = ctf_list_next(&fp->ctf_dtdefs); dtd != NULL; dtd = ntd) {
-               if (dtd->dtd_type <= fp->ctf_dtoldid)
+       for (dtd = ctf_list_prev(&fp->ctf_dtdefs); dtd != NULL; dtd = ntd) {
+               ntd = ctf_list_prev(dtd);
+               if (CTF_TYPE_TO_INDEX(dtd->dtd_type) <= fp->ctf_dtoldid)
                        continue; /* skip types that have been committed */
 
-               ntd = ctf_list_next(dtd);
                ctf_dtd_delete(fp, dtd);
        }
 
@@ -618,6 +692,8 @@
        if ((type = ctf_add_generic(fp, flag, NULL, &dtd)) == CTF_ERR)
                return (CTF_ERR); /* errno is set for us */
 
+       ctf_ref_inc(fp, ref);
+
        dtd->dtd_data.ctt_info = CTF_TYPE_INFO(kind, flag, 0);
        dtd->dtd_data.ctt_type = (ushort_t)ref;
 
@@ -649,16 +725,29 @@
 {
        ctf_dtdef_t *dtd;
        ctf_id_t type;
+       ctf_file_t *fpd;
 
        if (arp == NULL)
                return (ctf_set_errno(fp, EINVAL));
 
+       fpd = fp;
+       if (ctf_lookup_by_id(&fpd, arp->ctr_contents) == NULL &&
+           ctf_dtd_lookup(fp, arp->ctr_contents) == NULL)
+               return (ctf_set_errno(fp, ECTF_BADID));
+
+       fpd = fp;
+       if (ctf_lookup_by_id(&fpd, arp->ctr_index) == NULL &&
+           ctf_dtd_lookup(fp, arp->ctr_index) == NULL)
+               return (ctf_set_errno(fp, ECTF_BADID));
+
        if ((type = ctf_add_generic(fp, flag, NULL, &dtd)) == CTF_ERR)
                return (CTF_ERR); /* errno is set for us */
 
        dtd->dtd_data.ctt_info = CTF_TYPE_INFO(CTF_K_ARRAY, flag, 0);
        dtd->dtd_data.ctt_size = 0;
        dtd->dtd_u.dtu_arr = *arp;
+       ctf_ref_inc(fp, arp->ctr_contents);
+       ctf_ref_inc(fp, arp->ctr_index);
 
        return (type);
 }
@@ -666,6 +755,7 @@
 int
 ctf_set_array(ctf_file_t *fp, ctf_id_t type, const ctf_arinfo_t *arp)
 {
+       ctf_file_t *fpd;
        ctf_dtdef_t *dtd = ctf_dtd_lookup(fp, type);
 
        if (!(fp->ctf_flags & LCTF_RDWR))
@@ -674,8 +764,22 @@
        if (dtd == NULL || CTF_INFO_KIND(dtd->dtd_data.ctt_info) != CTF_K_ARRAY)
                return (ctf_set_errno(fp, ECTF_BADID));
 
+       fpd = fp;
+       if (ctf_lookup_by_id(&fpd, arp->ctr_contents) == NULL &&
+           ctf_dtd_lookup(fp, arp->ctr_contents) == NULL)
+               return (ctf_set_errno(fp, ECTF_BADID));
+
+       fpd = fp;
+       if (ctf_lookup_by_id(&fpd, arp->ctr_index) == NULL &&
+           ctf_dtd_lookup(fp, arp->ctr_index) == NULL)
+               return (ctf_set_errno(fp, ECTF_BADID));
+
+       ctf_ref_dec(fp, dtd->dtd_u.dtu_arr.ctr_contents);
+       ctf_ref_dec(fp, dtd->dtd_u.dtu_arr.ctr_index);
        fp->ctf_flags |= LCTF_DIRTY;
        dtd->dtd_u.dtu_arr = *arp;
+       ctf_ref_inc(fp, arp->ctr_contents);
+       ctf_ref_inc(fp, arp->ctr_index);
 
        return (0);
 }
@@ -687,7 +791,9 @@
        ctf_dtdef_t *dtd;
        ctf_id_t type;
        uint_t vlen;
+       int i;
        ctf_id_t *vdat = NULL;
+       ctf_file_t *fpd;
 
        if (ctc == NULL || (ctc->ctc_flags & ~CTF_FUNC_VARARG) != 0 ||
            (ctc->ctc_argc != 0 && argv == NULL))
@@ -700,6 +806,18 @@
        if (vlen > CTF_MAX_VLEN)
                return (ctf_set_errno(fp, EOVERFLOW));
 
+       fpd = fp;
+       if (ctf_lookup_by_id(&fpd, ctc->ctc_return) == NULL &&
+           ctf_dtd_lookup(fp, ctc->ctc_return) == NULL)
+               return (ctf_set_errno(fp, ECTF_BADID));
+
+       for (i = 0; i < ctc->ctc_argc; i++) {
+               fpd = fp;
+               if (ctf_lookup_by_id(&fpd, argv[i]) == NULL &&
+                   ctf_dtd_lookup(fp, argv[i]) == NULL)
+                       return (ctf_set_errno(fp, ECTF_BADID));
+       }
+
        if (vlen != 0 && (vdat = ctf_alloc(sizeof (ctf_id_t) * vlen)) == NULL)
                return (ctf_set_errno(fp, EAGAIN));
 
@@ -711,6 +829,10 @@
        dtd->dtd_data.ctt_info = CTF_TYPE_INFO(CTF_K_FUNCTION, flag, vlen);
        dtd->dtd_data.ctt_type = (ushort_t)ctc->ctc_return;
 
+       ctf_ref_inc(fp, ctc->ctc_return);
+       for (i = 0; i < ctc->ctc_argc; i++)
+               ctf_ref_inc(fp, argv[i]);
+
        bcopy(argv, vdat, sizeof (ctf_id_t) * ctc->ctc_argc);
        if (ctc->ctc_flags & CTF_FUNC_VARARG)
                vdat[vlen - 1] = 0; /* add trailing zero to indicate varargs */
@@ -829,8 +951,11 @@
 {
        ctf_dtdef_t *dtd;
        ctf_id_t type;
+       ctf_file_t *fpd;
 
-       if (ref == CTF_ERR || ref < 0 || ref > CTF_MAX_TYPE)
+       fpd = fp;
+       if (ref == CTF_ERR || (ctf_lookup_by_id(&fpd, ref) == NULL &&
+           ctf_dtd_lookup(fp, ref) == NULL))
                return (ctf_set_errno(fp, EINVAL));
 
        if ((type = ctf_add_generic(fp, flag, name, &dtd)) == CTF_ERR)



Home | Main Index | Thread Index | Old Index