Source-Changes-HG archive

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

[src/trunk]: src/external/cddl/osnet/dev Rewrite dtrace provider prototype fr...



details:   https://anonhg.NetBSD.org/src/rev/3e000dcfbd12
branches:  trunk
changeset: 336667:3e000dcfbd12
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Mon Mar 09 03:43:02 2015 +0000

description:
Rewrite dtrace provider prototype from scratch.

diffstat:

 external/cddl/osnet/dev/prototype.c |  238 ++++++++++++++++++++---------------
 1 files changed, 134 insertions(+), 104 deletions(-)

diffs (284 lines):

diff -r 4964d73e1590 -r 3e000dcfbd12 external/cddl/osnet/dev/prototype.c
--- a/external/cddl/osnet/dev/prototype.c       Mon Mar 09 02:03:19 2015 +0000
+++ b/external/cddl/osnet/dev/prototype.c       Mon Mar 09 03:43:02 2015 +0000
@@ -1,146 +1,176 @@
-/*     $NetBSD: prototype.c,v 1.2 2010/02/21 01:46:32 darran Exp $     */
+/*     $NetBSD: prototype.c,v 1.3 2015/03/09 03:43:02 riastradh Exp $  */
 
-/*
- * This file is freeware. You are free to use it and add your own
- * license.
+/*-
+ * Copyright (c) 2015 The NetBSD Foundation, Inc.
+ * All rights reserved.
  *
- * $FreeBSD: src/sys/cddl/dev/prototype.c,v 1.1.4.1 2009/08/03 08:13:06 kensmith Exp $
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #include <sys/cdefs.h>
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/conf.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-
-#include <sys/dtrace.h>
-
-static d_open_t        prototype_open;
-static int     prototype_unload(void);
-static void    prototype_getargdesc(void *, dtrace_id_t, void *, dtrace_argdesc_t *);
-static void    prototype_provide(void *, dtrace_probedesc_t *);
-static void    prototype_destroy(void *, dtrace_id_t, void *);
-static void    prototype_enable(void *, dtrace_id_t, void *);
-static void    prototype_disable(void *, dtrace_id_t, void *);
-static void    prototype_load(void *);
-
-static struct cdevsw prototype_cdevsw = {
-       .d_version      = D_VERSION,
-       .d_open         = prototype_open,
-       .d_name         = "prototype",
-};
+__RCSID("$NetBSD: prototype.c,v 1.3 2015/03/09 03:43:02 riastradh Exp $");
 
-static dtrace_pattr_t prototype_attr = {
-{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON },
-{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN },
-{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA },
-{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON },
-{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA },
-};
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/conf.h>
+#include <sys/dtrace.h>
+#include <sys/module.h>
+#include <sys/systm.h>
 
-static dtrace_pops_t prototype_pops = {
-       prototype_provide,
-       NULL,
-       prototype_enable,
-       prototype_disable,
-       NULL,
-       NULL,
-       prototype_getargdesc,
-       NULL,
-       NULL,
-       prototype_destroy
-};
-
-static struct cdev             *prototype_cdev;
-static dtrace_provider_id_t    prototype_id;
+static dtrace_provider_id_t prototype_id;
 
 static void
-prototype_getargdesc(void *arg, dtrace_id_t id, void *parg, dtrace_argdesc_t *desc)
+prototype_enable(void *arg, dtrace_id_t id, void *parg)
 {
+       /* Enable the probe for id.  */
 }
 
 static void
-prototype_provide(void *arg, dtrace_probedesc_t *desc)
+prototype_disable(void *arg, dtrace_id_t id, void *parg)
+{
+       /* Disable the probe for id.  */
+}
+
+static void
+prototype_getargdesc(void *arg, dtrace_id_t id, void *parg,
+    dtrace_argdesc_t *desc)
 {
+       /* Get the argument descriptions for the probe id.  */
+}
+
+static uint64_t
+prototype_getargval(void *arg, dtrace_id_t id, void *parg, int argno,
+    int aframes)
+{
+       /* Get the value for the argno'th argument to the probe id.  */
+}
+
+static void
+prototype_provide(void *arg, const dtrace_probedesc_t *desc)
+{
+       /*
+        * Create all probes for this provider.  Cookie passed to
+        * dtrace_probe_create will be passed on to prototype_destroy.
+        */
 }
 
 static void
 prototype_destroy(void *arg, dtrace_id_t id, void *parg)
 {
-}
-
-static void
-prototype_enable(void *arg, dtrace_id_t id, void *parg)
-{
-}
-
-static void
-prototype_disable(void *arg, dtrace_id_t id, void *parg)
-{
+       /*
+        * Destroy a probe for this provider.  parg is cookie that was
+        * passed to dtrace_probe_create for this probe.
+        */
 }
 
-static void
-prototype_load(void *dummy)
-{
-       /* Create the /dev/dtrace/prototype entry. */
-       prototype_cdev = make_dev(&prototype_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600,
-           "dtrace/prototype");
+static dtrace_pattr_t prototype_attr = {
+/* provider attributes */
+{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON },
+/* module attributes */
+{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN },
+/* function attributes */
+{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN },
+/* name attributes */
+{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON },
+/* arguments attributes */
+{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON },
+};
 
-       if (dtrace_register("prototype", &prototype_attr, DTRACE_PRIV_USER,
-           NULL, &prototype_pops, NULL, &prototype_id) != 0)
-               return;
-}
-
+static dtrace_pops_t prototype_pops = {
+       prototype_provide,
+       NULL,                   /* provide_module (NYI) */
+       prototype_enable,
+       prototype_disable,
+       NULL,                   /* suspend (NYI) */
+       NULL,                   /* resume (NYI) */
+       prototype_getargdesc,   /* optional */
+       prototype_getargval,    /* optional */
+       NULL,                   /* usermode permissions check */
+       prototype_destroy,
+};
 
 static int
-prototype_unload()
+prototype_init(void)
 {
-       int error = 0;
+       int error;
+
+       /* Set up any necessary state, or fail. */
 
-       if ((error = dtrace_unregister(prototype_id)) != 0)
-               return (error);
+       /* Register the dtrace provider.  */
+       KASSERT(prototype_id == 0);
+       error = dtrace_register("prototype", &prototype_attr, DTRACE_PRIV_USER,
+           NULL, &prototype_pops, NULL, &prototype_id);
+       if (error) {
+               printf("dtrace_prototype: failed to register dtrace provider"
+                   ": %d\n", error);
+               goto fail0;
+       }
+       KASSERT(prototype_id != 0);
 
-       destroy_dev(prototype_cdev);
+       /* Success!  */
+       return 0;
 
-       return (error);
+fail0: KASSERT(error);
+       return error;
 }
 
 static int
-prototype_modevent(module_t mod __unused, int type, void *data __unused)
+prototype_fini(void)
 {
-       int error = 0;
-
-       switch (type) {
-       case MOD_LOAD:
-               break;
+       int error;
 
-       case MOD_UNLOAD:
-               break;
-
-       case MOD_SHUTDOWN:
-               break;
-
-       default:
-               error = EOPNOTSUPP;
-               break;
-
+       /*
+        * Deregister the dtrace provider, unless we already did but
+        * something below failed.
+        */
+       if (prototype_id != 0) {
+               error = dtrace_unregister(prototype_id);
+               if (error) {
+                       printf("dtrace prototype"
+                           ": failed to unregister dtrace provider: %d\n",
+                           error);
+                       return error;
+               }
+               prototype_id = 0;
        }
 
-       return (error);
+       /* Tear down any necessary state, or fail.  */
+
+       /* Success!  */
+       return 0;
 }
 
 static int
-prototype_open(struct cdev *dev __unused, int oflags __unused, int devtype __unused, struct thread *td __unused)
+dtrace_prototype_modcmd(modcmd_t cmd, void *data)
 {
-       return (0);
+
+       switch (cmd) {
+       case MODULE_CMD_INIT:
+               return prototype_init();
+       case MODULE_CMD_FINI:
+               return prototype_fini();
+       default:
+               return ENOTTY;
+       }
 }
 
-SYSINIT(prototype_load, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, prototype_load, NULL);
-SYSUNINIT(prototype_unload, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, prototype_unload, NULL);
-
-DEV_MODULE(prototype, prototype_modevent, NULL);
-MODULE_VERSION(prototype, 1);
-MODULE_DEPEND(prototype, dtrace, 1, 1, 1);
-MODULE_DEPEND(prototype, opensolaris, 1, 1, 1);
+MODULE(MODULE_CLASS_MISC, dtrace_prototype, "dtrace");



Home | Main Index | Thread Index | Old Index